从Spring 3升级到Spring 5时Tomcat启动遇ContextLoaderListener配置错误
问题分析与解决方案
错误原因
Spring 5.1.x已移除org.springframework.beans.factory.access.BeanFactoryReference类,你仅升级了spring-context等少数Spring依赖,项目中仍残留Spring 3.x版本的相关组件,启动时旧组件尝试加载已被移除的类,从而触发NoClassDefFoundError。Spring框架各模块版本必须严格统一,混合版本必然引发兼容性问题。
解决方案
1. 统一所有Spring依赖版本
将pom.xml中所有Spring相关依赖(包括spring-core、spring-beans、spring-web、spring-webmvc等)统一升级到5.1.x版本,不能仅单独升级某几个模块。
示例pom配置:
<properties> <!-- 指定统一的Spring版本 --> <spring.version>5.1.20.RELEASE</spring.version> </properties> <dependencies> <!-- Spring核心模块 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> </dependencies>
2. 解决依赖冲突导致的构建失败
如果升级全量Spring依赖后构建失败,按以下步骤排查:
- 执行
mvn dependency:tree命令生成依赖树,定位引入旧版Spring依赖的第三方库。 - 对依赖旧版Spring的第三方库,通过
<exclusions>标签排除其中的旧Spring模块,示例:
<dependency> <groupId>第三方库groupId</groupId> <artifactId>第三方库artifactId</artifactId> <version>第三方库版本</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </exclusion> </exclusions> </dependency>
- 若第三方库版本过低不兼容Spring 5.1.x,需升级该第三方库到支持Spring 5.x的版本。
3. 验证web.xml配置
确认ContextLoaderListener的配置正确,Spring 5.1.x中该类仍位于org.springframework.web.context.ContextLoaderListener,需确保spring-web依赖已正确引入且版本为5.1.x。
内容的提问来源于stack exchange,提问作者dynamo
相关产品推荐
相关产品推荐

