1、報錯信息
java.lang.NoSuchFieldError 和 NoSuchMethodError
2、場景
通過Maven引入了一個jar包,某一天新增了一個類的屬性或者靜態(tài)屬性。然后發(fā)現(xiàn)編譯完全正確,但是實際運行一直在報NoSuchFieldError。
3、造成原因只有以下兩種(不用想其他的,沒有其他可能)
1、你項目中有同一個jar包的不同版本,編譯和運行時使用了不同的jar包。比如有兩個版本1.1.3和1.1.4(有新增屬性)。編譯的時候使用1.1.4,編譯正常通過。但是運行的時候使用的是1.1.3。
2、你的項目中存在和jar包中路徑和類名完全相同的類。因為你新增了屬性本地類中沒有,所以編譯的時候會自動使用Jar包中的對象,但是運行的時候則會優(yōu)先使用本地的對象?。?!
4、排查流程
1、第一步:排查存在多個Jar包引用
使用ideal自帶到Maven工具(show Dependencies),如果查處兩個的話就要注意啦(敲黑板),你可以直接點到不是你需要的那個版本,進入查看下是從哪個地方依賴的。
如果是你項目引入的,直接刪掉就解決啦,如果是傳遞依賴(你引用的jar引用了這個jar包),需要使用標簽去排除掉。
?<dependency>
? ? ? ? <groupId>io.vertx</groupId>
? ? ? ? <artifactId>vertx-core</artifactId>
? ? ? ? <version>${vertx.version}</version>
? ? ? ? <exclusions>
? ? ? ? ? ? <exclusion>
? ? ? ? ? ? ? ? <artifactId>netty-codec</artifactId>
? ? ? ? ? ? ? ? <groupId>io.netty</groupId>
? ? ? ? ? ? </exclusion>
? ? ? ? </exclusions>
</dependency>
1
2
3
4
5
6
7
8
9
10
11
順手推薦一個工具:Maven Helper
2、第二步:排查你們項目中有相同路徑和命名的類
敲黑板:一定要勾選上include non-project items 才能查詢到jar包中的類。如果本地有一樣的話,看你的抉擇啦,刪除哪一個你自己選。
上面兩步絕對解決問題,如果你試過還是沒找到原因,那你找下你的同事check一下,不會有其他可能。
原文鏈接:https://blog.csdn.net/weixin_39452168/article/details/108146847
---------------------------------------------------------------------------------------------------------------------
注:安裝上述方法排查問題時,發(fā)現(xiàn)確實是兩個相同的jar包沖突了,但是通過<exclusions>屏蔽掉其中一個jar包后還是報同樣的問題,經(jīng)過檢查后發(fā)現(xiàn)是pom.xml文件引入了兩次相同jar包,所以在注釋掉一個之后還是不行。
解決方式:刪除相同的jar包,然后通過<exclusions>屏蔽。
?
?
?文章來源:http://www.zghlxwxcb.cn/news/detail-686166.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-686166.html
到了這里,關于IDEA報錯:java.lang.NoSuchFieldError 和 NoSuchMethodError的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!