树莓派Tomcat同时部署两个同源Web应用启动失败问题求助
问题根因
你遇到的是同一JVM实例内多个同代码栈Spring应用的资源冲突问题,Tomcat单实例运行在同一个JVM进程中,两个基于几乎相同代码开发的Spring应用同时启动时,会因为全局资源名称重复触发启动失败,单独运行时无冲突所以可以正常启动,最常见的冲突点如下:
- 90%以上的此类问题由Spring JMX MBean名称冲突导致:Spring默认会向JVM注册JMX监控Bean,两个应用未配置独立的JMX域时,MBean的全局唯一标识重复,第二个应用注册失败直接中断启动流程
- 自定义端口冲突:如果应用开启了Spring Boot Actuator监控、Socket服务等占用固定端口的能力,两个应用使用相同端口会触发绑定失败
- 全局系统属性/JNDI资源冲突:如果代码中使用了同名的全局系统属性、Tomcat全局JNDI资源,也会出现资源抢占问题
解决步骤
不需要修改pom.xml依赖配置,只需要调整两个应用的application.properties(或application.yml)配置即可:
- 首先解决最高概率的JMX冲突:
给原应用添加配置:
spring.jmx.default-domain=myapp1
给修改版应用添加配置:
spring.jmx.default-domain=myapp2
如果不需要JMX监控,也可以直接关闭JMX来避免冲突:
spring.jmx.enabled=false
- 检查自定义端口配置
如果使用了Spring Boot Actuator,给两个应用配置不同的监控端口:
原应用:
management.server.port=8081
修改版应用:
management.server.port=8082
- 校验资源命名
检查代码中是否存在System.setProperty()写入同名全局属性、是否配置了同名的JNDI数据源,如有需要给两个应用配置不同的标识区分。
配置调整完成后重新打包两个WAR包,放入Tomcat的webapps目录下重启Tomcat即可同时正常运行,两个应用会自动对接各自配置的数据库,互不干扰。
内容的提问来源于stack exchange,提问作者Pisan
相关产品推荐
相关产品推荐

