Spring Boot WAR包部署Tomcat后Bean重复加载问题咨询
Spring Boot WAR包部署Tomcat时Bean重复加载的解决方案
问题原因分析
从日志和代码来看,核心问题有两点:
- 主类的
configure方法引用了错误的启动类(EntryExitApplication.class而非当前类TestApplication.class),导致Spring初始化两个不同的上下文 - 可能存在内嵌Tomcat与外部Tomcat的冲突,或是重复的上下文配置
解决步骤
1. 修正启动类的configure方法
将configure方法中的启动类改为当前主类TestApplication.class,避免加载错误上下文:
@SpringBootApplication @PropertySource({ "classpath:application.properties" }) public class TestApplication extends SpringBootServletInitializer{ public static void main(String[] args) { SpringApplication.run(TestApplication.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { // 修正为当前类TestApplication.class return application.sources(TestApplication.class); } }
2. 排除内嵌Tomcat依赖
在Maven的pom.xml中,将spring-boot-starter-tomcat设置为provided,避免内嵌Tomcat与外部Tomcat冲突:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <scope>provided</scope> </dependency>
3. 移除重复的Spring上下文配置
- 若项目存在
web.xml文件,检查是否配置了ContextLoaderListener或其他Spring监听器,如有则删除这些配置,避免与SpringBootServletInitializer的初始化流程重复 - 检查Tomcat的
conf/server.xml或conf/Catalina/localhost下的配置文件,确保没有重复部署同一应用的配置
4. 验证打包配置
确保Maven使用war打包方式,并正确配置Spring Boot插件:
<packaging>war</packaging> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
内容的提问来源于stack exchange,提问作者KVNS_JavaLearner
相关产品推荐
相关产品推荐

