VSCode 启动 Spring Boot 微服务 JMX 端口冲突问题(最终解决)
一、问题现象
使用 Visual Studio Code 启动多个微服务时,报错:
text
java.rmi.server.ExportException: Port already in use
Caused by: java.net.BindException: Address already in use
即使使用 netstat 也查不到端口占用。
二、根本原因
问题并不在 Spring Boot,而在 JMX(Java 管理接口):
-
JMX 基于 RMI(远程调用)
-
实际使用 两个端口:
jmxremote.port(注册端口)jmxremote.rmi.port(通信端口)
👉 如果只配置了一个端口:
bash
-Dcom.sun.management.jmxremote.port=52053
那么:
- 第二个端口会 随机分配
- 多服务启动时仍然可能冲突
三、正确解决方案(在 launch.json 中配置)
👉 必须在 launch.json 的 vmArgs 中同时固定两个端口
标准写法:
json
"vmArgs": "-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=61010 \
-Dcom.sun.management.jmxremote.rmi.port=61010 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname=127.0.0.1"
四、多个微服务配置示例
每个服务使用不同端口,例如:
json
{
"configurations": [
{
"name": "gateway",
"vmArgs": "-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=61010 -Dcom.sun.management.jmxremote.rmi.port=61010 ..."
},
{
"name": "auth",
"vmArgs": "-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=61011 -Dcom.sun.management.jmxremote.rmi.port=61011 ..."
},
{
"name": "flowable",
"vmArgs": "-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=61012 -Dcom.sun.management.jmxremote.rmi.port=61012 ..."
}
]
}
五、仍然报错的原因
即使配置正确,仍可能出现:
- JVM 端口未及时释放(TIME_WAIT)
- JMX 残留导致"假占用"
六、最终解决办法
✅ 1. 更换一组新端口(最有效)
text
61010 / 61011 / 61012
避免使用已经报错的端口(如 52053)。
✅ 2. 清理 Java 进程
bash
taskkill /F /IM java.exe
✅ 3. 重启系统(兜底)
彻底释放端口资源。
七、总结
JMX 冲突 = 双端口机制 + 端口未释放
最终解决方案:
✅ 在
launch.json中配置port + rmi.port✅ 每个服务使用不同端口
✅ 避免使用已冲突端口
即可彻底解决问题。