出现java.lang.NoSuchMethodError错误,求助排查Spring依赖冲突问题
java.lang.NoSuchMethodError: org.springframework.util.ReflectionUtils.clearCache()V错误 兄弟,这个错误我太熟了——百分百是Spring版本依赖冲突搞的鬼!ReflectionUtils.clearCache()这个方法是Spring 4.2及以后版本才新增的,你的项目里肯定是同时存在低版本的Spring核心包和需要高版本的依赖,导致JVM加载到了没有这个方法的旧版本类。
从你贴的依赖树片段来看,dubbo-spring-boot-starter:1.0.0-SNAPSHOT依赖了spring-boot-starter:1.3.0.RELEASE,Spring Boot 1.3.x对应的Spring Framework版本是4.2.x,按理说应该有这个方法才对,所以大概率是你项目里还有其他依赖偷偷引入了更低版本的spring-core,把高版本的给覆盖了。
给你一套落地的解决步骤:
1. 揪出冲突的依赖
你已经跑了mvn dependency:tree,但只给了片段,建议直接过滤出所有spring-core的依赖记录,快速定位问题:
mvn dependency:tree | grep spring-core
这行命令会列出所有引入spring-core的依赖及其版本,你一眼就能看到哪个依赖拉了4.2以下的版本。
2. 排除掉低版本的冲突依赖
找到那个搞事情的依赖后,在你的pom.xml里给它加上排除规则,把低版本的spring-core踢出去,强制用Spring Boot管理的版本。举个例子,如果是某个第三方依赖出问题:
<dependency> <groupId>com.example.xxx</groupId> <artifactId>xxx-artifact</artifactId> <version>x.x.x</version> <!-- 排除低版本的spring-core --> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> </exclusions> </dependency>
3. 给依赖加个“保险”
为了以后不再踩类似的坑,建议用Maven的enforcer插件强制依赖版本一致,这样只要有版本冲突就会直接报错提醒你。在pom.xml的<build>里加这个插件:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <version>3.0.0-M3</version> <executions> <execution> <id>check-dependency-convergence</id> <goals> <goal>enforce</goal> </goals> <configuration> <rules> <!-- 强制所有依赖版本一致 --> <dependencyConvergence/> </rules> </configuration> </execution> </executions> </plugin> </plugins> </build>
之后跑mvn enforcer:enforce就能检查出所有版本不一致的依赖,提前把问题扼杀在摇篮里。
最后提个小建议:你用的dubbo-spring-boot-starter是1.0.0-SNAPSHOT快照版本,这类版本依赖管理通常不太稳定,建议换成正式发布的稳定版(比如2.7.x系列),能减少很多不必要的依赖冲突。
内容的提问来源于stack exchange,提问作者user1305398

