构建Spring Boot应用时出现DefaultListableBeanFactory类冲突如何解决
问题根源
你遇到的是典型的Spring依赖类冲突问题:
- 公司内部
communication依赖包中直接内置了org.springframework.beans等Spring核心类,和Spring Boot 2.5.2版本自带的spring-beans:5.3.8存在同包同名类冲突 - 类加载时优先加载了
communication包中的低版本Spring类,该版本没有setApplicationStartup方法,导致调用报错 - 额外的隐患:你当前pom中
spring-boot-starter-actuator指定了2.4.2版本,和父pom继承的2.5.2版本不统一,也可能引发其他版本兼容问题
解决方案
按顺序执行以下操作即可解决:
统一Spring Boot组件版本
删除spring-boot-starter-actuator依赖中的<version>2.4.2</version>配置,让其继承父pom的2.5.2版本,保证所有Spring Boot官方组件版本一致:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>排除
communication中的Spring依赖
如果communication是通过传递依赖引入的Spring包,在communication的依赖配置中添加排除规则,过滤掉自带的Spring相关依赖:<dependency> <groupId>com.excample.myArtifact</groupId> <artifactId>communication</artifactId> <version>latest</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </exclusion> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> </exclusions> </dependency>处理内置Spring类的特殊情况
如果communication是直接把Spring类打包进了自身jar包(即shaded fat jar),按以下方式处理:- 优先联系公司内部维护
communication依赖的团队,要求提供不内置公共Spring依赖的版本,将Spring作为可选传递依赖对外提供 - 临时解决方案:调整pom中依赖的声明顺序,把所有Spring Boot官方starter依赖放在
communication依赖前面,Maven会优先加载顺序靠前的依赖中的同包同名类
- 优先联系公司内部维护
验证修改结果
执行命令mvn dependency:tree查看依赖树,确认只有一个版本的spring-beans依赖,且版本为5.3.8,重新打包启动项目即可。
内容的提问来源于stack exchange,提问作者Shahab.es
相关产品推荐
相关产品推荐

