NoSuchMethodError中文意思是没有找到方法,这个错误并不是说依赖的jar包、方法不存在,ClassNotFoundException才是上述错误,即便出现ClassNotFoundException也不一定全是缺少依赖的jar包、class,有可能是依赖的冲突(引用了多次报错Class的jar)
同样道理,NoSuchMethodError经常是因为报错的方法所在的jar包产生了冲突。
明白了为什么会出现这个错误后,我们关键说下 Maven项目出现这个问题了怎么解决。
比如之一个 Spring Boot 项目,需要用到阿里dubbo jar包中的方法,引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
</dependency>
项目无法启动,报错为: Exception in thread "main" java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotationAwareOrderComparator.sort(Ljava/util/List;)V
Ctrl+左键点入dubbo这个依赖,发现dubbo也依赖Spring,而且和我项目中的Spring版本并不一样,所以就产生了冲突,解决方法就是让dubbo依赖的Spring不再添加进项目的依赖,如下:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.3</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
</exclusions>
</dependency>
在引入dubbo时,排除其中依赖的spring,默认使用项目中的spring,就可以正常启动了。
还可以安装idea插件Maven Helper,帮助你筛选项目中有冲突依赖的地方,快速定位问题。