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