升级Spring和Spring Kafka后报NoSuchMethodError方法不存在错误如何解决
问题原因
该NoSuchMethodError属于典型的Java依赖版本冲突问题:Spring 5.1.x版本中ConfigurationClassBeanDefinitionReader$ConfigurationClassBeanDefinition类的setResolvedFactoryMethod方法签名和5.2.x版本不兼容,当前项目classpath内同时存在两个版本的Spring核心jar包,运行时加载了低版本的类,调用高版本修改后的方法就会触发该报错。
排查与解决方案
- 第一步:定位冲突来源
执行以下Maven命令查看依赖树,筛选Spring相关依赖的版本:
mvn dependency:tree | grep -A 10 -B 10 "org.springframework:"
绝大多数该场景下的冲突来源是springfox-swagger2:2.9.2,该版本默认传递依赖了低版本的Spring核心包,和你升级后的5.2.12.RELEASE版本不兼容。
- 第二步:排除冲突的传递依赖
修改swagger相关依赖配置,排除它自带的Spring传递依赖:
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>2.9.2</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>2.9.2</version> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>*</artifactId> </exclusion> </exclusions> </dependency>
- 第三步:统一锁定依赖版本
在pom.xml中新增dependencyManagement配置,全局锁定Spring框架和Spring Kafka的版本,避免其他依赖引入冲突版本:
<dependencyManagement> <dependencies> <!-- 统一锁定Spring框架所有依赖版本 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>5.2.12.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <!-- 锁定Spring Kafka版本 --> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>2.4.1.RELEASE</version> </dependency> </dependencies> </dependencyManagement>
- 可选优化:删除pom中冗余的
spring-beans依赖,spring-boot-starter-web已经默认引入了该依赖,无需单独声明。 - 第四步:验证修改
重新执行依赖树命令,确认所有org.springframework组下的依赖版本都为5.2.12.RELEASE,重新打包启动项目即可解决报错。
内容的提问来源于stack exchange,提问作者Mohammad Asif
相关产品推荐
相关产品推荐

