NoSuchMethodError中文意思是沒有找到方法,遇到這個錯誤並不是說依賴的jar包、方法不存在而找不到,這就類似於 ClassNotFoundException錯誤了,出現ClassNotFoundException錯誤也不一定是缺少依賴的jar、class,有可能是依賴的沖突,即引用了多次報錯Class的jar。
那么同樣道理,NoSuchMethodError出現經常是因為報錯的這個方法的類的jar包產生了沖突。
明白了為什么會出現這個錯誤后,我們再去解決這個錯誤。一般情況下,手動引入jar包(即非依賴管理工具),直接remove掉重復的jar包就OK了。
我們關鍵說下 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>
這樣項目就可以正常啟動運行了。