欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Maven包沖突導致NoSuchMethodError錯誤的解決辦法

 更新時間:2024年05月29日 08:55:16   作者:斯通  
web 項目 能正常編譯,運行時也正常啟動,但執(zhí)行到需要調(diào)用 org.codehaus.jackson 包中的某個方法時,產(chǎn)生運行異常,這篇文章主要介紹了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的資料請關注腳本之家其它相關文章!

相關文章

  • JAVA項目如何打包部署到Linux服務器上

    JAVA項目如何打包部署到Linux服務器上

    本文詳細介紹了在服務器上部署環(huán)境包括JDK、MySQL、Tomcat的設置,以及使用Idea-Maven-SpringBoot進行jar包打包部署的流程,內(nèi)容涵蓋了MySQL配置注意事項、pom.xml配置、打包命令等關鍵步驟,同時,也提供了如何將jar包上傳到Linux服務器并運行的具體方法
    2024-10-10
  • java對象對比之comparable和comparator的區(qū)別

    java對象對比之comparable和comparator的區(qū)別

    今天給大家?guī)淼氖顷P于Java的相關知識,文章圍繞著comparable和comparator的區(qū)別展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 解決javaWEB中前后臺中文亂碼問題的3種方法

    解決javaWEB中前后臺中文亂碼問題的3種方法

    這篇文章主要介紹了解決javaWEB中前后臺中文亂碼問題的3種方法,中文問題一直是很多人難以解決的問題,對這方面感興趣的朋友可以參考一下
    2015-11-11
  • Java使用icepdf將pdf文件按頁轉(zhuǎn)成圖片

    Java使用icepdf將pdf文件按頁轉(zhuǎn)成圖片

    這篇文章主要為大家詳細介紹了Java使用icepdf將pdf文件按頁轉(zhuǎn)成圖片,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 淺析對Java關鍵字final和static的理解

    淺析對Java關鍵字final和static的理解

    本文主要給大家談談小編對java關鍵字final和static的理解,本文給大家介紹的較詳細,需要的朋友參考參考下
    2017-04-04
  • java的io操作(將字符串寫入到txt文件中)

    java的io操作(將字符串寫入到txt文件中)

    這篇文章主要介紹了java的io操作示例,將字符串寫入到txt文件中,需要的朋友可以參考下
    2014-04-04
  • springboot 接口版本區(qū)分方式

    springboot 接口版本區(qū)分方式

    這篇文章主要介紹了springboot 接口版本區(qū)分方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 詳解Java中方法重寫和方法重載的6個區(qū)別

    詳解Java中方法重寫和方法重載的6個區(qū)別

    方法重寫和方法重載都是面向?qū)ο缶幊讨?,那么方法重寫和方法重載有哪些區(qū)別,本文就詳細的來介紹一下,感興趣的可以了解一下
    2022-01-01
  • java編寫貪吃蛇小游戲

    java編寫貪吃蛇小游戲

    貪吃蛇是經(jīng)典手機游戲,既簡單又耐玩。通過控制蛇頭方向吃蛋,使得蛇變長,從而獲得積分。今天我們就來用java來實現(xiàn)下貪吃蛇小游戲,有需要的小伙伴可以參考下
    2015-03-03
  • SpringCloud?Gateway之請求應答日志打印方式

    SpringCloud?Gateway之請求應答日志打印方式

    這篇文章主要介紹了SpringCloud?Gateway之請求應答日志打印方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03

最新評論