Caused by: javax.management.InstanceAlreadyExistsException: com.alibaba.druid.filter.stat:name=statFilter,type=StatFilter at com.sun.jmx.mbeanserver.Repository.addMBean(Repository.java:437) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerWithRepository(DefaultMBeanServerInterceptor.java:1898) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerDynamicMBean(DefaultMBeanServerInterceptor.java:966) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerObject(DefaultMBeanServerInterceptor.java:900) at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:324) at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522) at org.springframework.jmx.support.MBeanRegistrationSupport.doRegister(MBeanRegistrationSupport.java:195) at org.springframework.jmx.export.MBeanExporter.registerBeanInstance(MBeanExporter.java:674) at org.springframework.jmx.export.MBeanExporter.registerBeanNameOrInstance(MBeanExporter.java:618) ... 25 common frames omitted
springboot打war包部署tomcat中启动报错
原提问者GitHub用户haochencheng
根据您提供的错误信息,可能出现以下原因导致启动报错:
1. 依赖冲突:在将Spring Boot应用打成war包时,需要排除内嵌的Tomcat依赖,否则会与Tomcat本身的依赖冲突。可以通过在pom.xml文件中添加相关配置来解决这个问题。
xml <dependencies> <!-- 排除内嵌的Tomcat依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <!-- 添加Tomcat的提供的Servlet API依赖 --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <scope>provided</scope> </dependency> <!-- 其他依赖 --> ... </dependencies>
2. 部署路径不正确:确保将war包按照正确的结构部署到Tomcat的webapps目录下,并将其重命名为应用程序的名称。例如,如果应用程序的名称为myapp
,则将war包重命名为myapp.war
并放置在Tomcat的webapps目录下。
3. 应用程序配置错误:将应用程序的配置文件(如application.properties或application.yml)放置在war包的根目录下,并确保其文件名符合Spring Boot的命名规范。
另外,也有可能是Druid连接池的配置引起的问题。您可以尝试在应用程序的配置文件中添加以下配置来为Druid连接池指定不同的MBean名称:
spring.jmx.default-domain=mydruid
这样做可以确保在部署多个应用程序时,每个应用程序的MBean名称不同,避免冲突。
可能是以下原因导致:
应用程序的依赖冲突。在将Spring Boot应用打成war包时,需要将内嵌的Tomcat依赖排除掉,否则可能会与Tomcat本身的依赖冲突。解决方法是在pom.xml文件中添加如下配置:
xml
Copy
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-tomcat
javax.servlet
javax.servlet-api
provided
其中,第一个依赖是Spring Boot Web Starter的依赖,需要将内嵌的Tomcat依赖排除掉;第二个依赖是Servlet API的依赖,需要将其作为Tomcat的提供的依赖。
部署路径不正确。在将Spring Boot应用部署到Tomcat时,需要按照war包中的结构进行部署,否则可能会导致启动错误。解决方法是将war包放到Tomcat的webapps目录下,并将其重命名为应用程序的名称。
应用程序配置错误。在将Spring Boot应用打成war包时,需要将应用程序的配置文件(例如application.properties或application.yml)放到war包的根目录下,否则可能无法读取应用程序的配置。解决方法是将应用程序的配置文件放到war包的根目录下,并确保其文件名符合Spring Boot的命名规范。
druid的state实例貌似只能启动一个 不能多启动, 我也是多个springboot打成war包跑的时候遇到的这个问题,目前没有一个非常好的解决办法
出现这种问题是因为同时部署的时候spring 默认的mbean名字都一样了,只需要在每个yml下配置spring.jmx.default-domain= 自定义名字 ,名字不同,实例化出的对象就不一样了。
原回答者GitHub用户Lisl0828
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。