Maven包沖突導致NoSuchMethodError錯誤的解決辦法
項目清況
項目中有兩個包都引用了jackson 的包且都是不再更新的版本
// jarA 包中引入 org.codehaus.jackson 包 1.8.4 版本 <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-asl</artifactId> <version>1.8.4</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.8.4</version> </dependency> //jar B 包中引入了 org.codehaus.jackson 包 1.9.13 版本 <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-core-asl</artifactId> <version>1.9.13</version> </dependency> <dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency> // org.codehaus.jackson 包最后在 2013 年的時候發(fā)生了組織變化(fastxml) ,且后續(xù)不再維護 // 如今正確使用jackson 應該引入以下的 3 個包: <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.17.1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.17.1</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>2.17.1</version> </dependency>
從上面包中看得出,項目有些年代感了(springmvc 3.x 的版本,打包成war 部署運行),本著能運行的情況下,絕不隨意改動的原則,還是繼續(xù)使用 org.codehaus.jackson
這個包
報錯、異常
web 項目 能正常編譯,運行時也正常啟動,但執(zhí)行到需要調(diào)用 org.codehaus.jackson 包中的某個方法時,產(chǎn)生運行異常:NoSuchMethodError:org.codehaus.jackson.map.ObjectMapper.setSerializationInclusion
找到報錯處是 jarB 中的程序片段異常,找到對應代碼中引用的包,定位后發(fā)現(xiàn)確實不存在這個方法,此時打開的是 1.8.4 的版本,(jarB 需要 1.9.13 版本的包)
處理沖突
找到問題了就好說,1.9與 1.8的版本應該上線兼容,則采用 1.9 的版本即可, 那么我們只需要在 jarA 中排除掉 1.8.4 的jackson 應該就能解決問題
<dependency> <groupId>org.china.xxxx</groupId> <artifactId>jarA</artifactId> <version>x.x.x</version> // 排除 ,jarA 中對低版本的引入 <exclusion> <artifactId>jackson-core-asl</artifactId> <groupId>org.codehaus.jackson</groupId> </exclusion> <exclusion> <artifactId>jackson-mapper-asl</artifactId> <groupId>org.codehaus.jackson</groupId> </exclusion> </dependency>
做了這個動作之后發(fā)現(xiàn),項目中的已換成 1.9.13 版本
可以 使用 Maven Helper 工具來查看依賴沖突,exclude 包等
排除后充新編譯項目啟動運行,發(fā)現(xiàn)仍然
NoSuchMethodError:org.codehaus.jackson.map.ObjectMapper.setSerializationInclusion
進一步探究
- 編寫單元測試 方法調(diào)用,發(fā)現(xiàn)單元測試沒問題
說明問題出在 Tomcat, 編譯沒問題說明包引入正常(idea 中包依賴顯示正常,且跟蹤代碼也能找到正確的包) 問題應該出在 ClassLoad → 類加在上
- tomcat 啟動項 增加
-XX:+TraceClassLoading -XX:+TraceClassUnloading
tomcat 啟動后發(fā)現(xiàn),jackson 仍然加載 1.8.4 的版本
- 根據(jù)步驟 2 查看對應的目錄發(fā)現(xiàn),存在多個版本的包(但低版本的我應該排除掉了才對), 這個目錄在 idea 項目的 target目錄下
target/項目名稱/WEB-INF/lib
結(jié)合了解到tomcat 加載 lib 目錄下的包時,會按照順序加在,且同樣的包只會加在一次,所以,這里應該是優(yōu)先加在了 1.8.4 所以后續(xù)引入的 1.9 就被忽略
那么問題來了-》 dependency 中 exclusion 排除了 低版本的包,是怎么又出現(xiàn)在 lib 中的,
發(fā)現(xiàn)問題
最后仔細觀察 發(fā)現(xiàn) jarA 是作為父項目,引入到當前項目中的
overlay 的資源會被覆蓋到當前項目中,包括,WEB-INF 下的所有l(wèi)ib 這也是為什么在 lib 目錄下仍然存在 1.8.4 版本的包. 需要在 overlay 中也將相應的包剔除
... <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.2</version> <configuration> <overlays> <overlay> <groupId>com.unionman</groupId> <artifactId>unionmanframe</artifactId> <excludes> <exclude>**/jackson-core-asl-1.8.4.jar</exclude> <exclude>**/jackson-mapper-asl-1.8.4.jar</exclude> </excludes> </overlay> </overlays> </configuration> </plugin> ...
最后再次啟動,類正常加載 jackson-1.9.13 包
以上就是Maven包沖突導致NoSuchMethodError錯誤的解決辦法的詳細內(nèi)容,更多關于Maven導致NoSuchMethodError的資料請關注腳本之家其它相關文章!
- 詳解Matisse與Glide--java.lang.NoSuchMethodError:com.bumptech.glide.RequestManager.load
- Java異常 Factory method''sqlSessionFactory''rew exception;ested exception is java.lang.NoSuchMethodError:
- 解決啟動Azkaban報錯問題:java.lang.NoSuchMethodError: com.google.common.collect.ImmutableMap.toImmutableMap
- 解決 java.lang.NoSuchMethodError的錯誤
相關文章
java對象對比之comparable和comparator的區(qū)別
今天給大家?guī)淼氖顷P于Java的相關知識,文章圍繞著comparable和comparator的區(qū)別展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下2021-06-06Java使用icepdf將pdf文件按頁轉(zhuǎn)成圖片
這篇文章主要為大家詳細介紹了Java使用icepdf將pdf文件按頁轉(zhuǎn)成圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12SpringCloud?Gateway之請求應答日志打印方式
這篇文章主要介紹了SpringCloud?Gateway之請求應答日志打印方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03