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

使用maven工具解決jar包沖突或重復(fù)加載的問(wèn)題

 更新時(shí)間:2020年09月15日 09:17:44   作者:斗者_(dá)2013  
這篇文章主要介紹了使用maven工具解決jar包沖突或重復(fù)加載的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

在使用maven開(kāi)發(fā)項(xiàng)目的過(guò)程中,經(jīng)常會(huì)遇到j(luò)ar包重復(fù)加載或者jar包沖突的問(wèn)題的,但是由于有些jar是由于maven的依賴加載自動(dòng)加載進(jìn)來(lái)的,

而不是開(kāi)發(fā)者自己配置的,特別是當(dāng)項(xiàng)目中pom中配置的jar包依賴本身很多時(shí),開(kāi)發(fā)者靠自己的經(jīng)驗(yàn),有時(shí)很難找出是哪個(gè)jar的加載導(dǎo)致加載了

多余的依賴jar,從而產(chǎn)生沖突。

今天剛好遇到一個(gè)借用eclipse中的maven插件解決jar包依賴沖突的問(wèn)題,分享一下。

項(xiàng)目中出現(xiàn)的問(wèn)題如下:

Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.apache.log4j.Log4jLoggerFactory

后經(jīng)網(wǎng)上搜索加邊上大牛指點(diǎn)發(fā)現(xiàn):

log4j-over-slf4j.jar 和 slf4j-log4j12.jar 在同一個(gè)classpath下就會(huì)出現(xiàn)這個(gè)錯(cuò)誤。

解決方法:

將slf4j-log4j12.jar從相關(guān)的jar中排除

但是查看maven項(xiàng)目中的pom文件,自己并沒(méi)有配置這個(gè)jar的依賴,猜測(cè)是maven加載其他jar引入的依賴包。

打開(kāi)pom.xml文件,在Dependency Hierarchy(依賴列表)中查看jar包的依賴層次關(guān)系。

在過(guò)濾欄中輸入log4j,右側(cè)出現(xiàn)了log4j相關(guān)包的依賴結(jié)構(gòu),左側(cè)則是pom.xml全部依賴包的列表展示。

直接在右側(cè)選中zookeeper底下的slf4j的jar包,右鍵選擇Exclude,然后保存pom.xml。這樣在加載zookeeper的jar包時(shí)就不會(huì)再加載slf4j的jar包。

修改后對(duì)應(yīng)的dependency文件如下:

<dependency>
 <groupId>org.apache.zookeeper</groupId>
 <artifactId>zookeeper</artifactId>
 <version>3.4.6</version>
 <exclusions>
 <exclusion>
  <artifactId>slf4j-log4j12</artifactId>
  <groupId>org.slf4j</groupId>
 </exclusion>
 </exclusions>
 </dependency>

這樣就能通過(guò)filter過(guò)濾快速找到對(duì)應(yīng)jar,并知道他的依賴關(guān)系,快速解決項(xiàng)目中的jar包沖突問(wèn)題。

補(bǔ)充知識(shí):解決Maven重復(fù)依賴問(wèn)題(同一個(gè)jar,多個(gè)版本)

問(wèn)題描述

現(xiàn)在開(kāi)發(fā)項(xiàng)目,一般都會(huì)創(chuàng)建maven工程,用它來(lái)管理依賴實(shí)在是方便了,當(dāng)然它還有其它用途。但是在實(shí)際的情況中往往會(huì)有重復(fù)依賴的問(wèn)題,比如創(chuàng)建的工程A,依賴了b-1.0.jar,而b-1.0.jar又依賴了d-1.0.jar(這個(gè)我們本身是不能直接看到的),同時(shí)我們自己的工程又依賴了d-2.1.jar,或者工程A依賴了c-1.0.jar,c-1.0.jar依賴了d-2.0.jar,顯然,d.jar有3個(gè)版本,3者之間是重復(fù)的,甚至是沖突的。如下圖所示:

重復(fù)依賴會(huì)怎么樣?

首先從工程角度來(lái)講,引用了同一個(gè)Jar的不同版本,這肯定是依賴有問(wèn)題,或者就是錯(cuò)誤的。

其次,重復(fù)依賴,在項(xiàng)目啟動(dòng)過(guò)程當(dāng)中可能會(huì)有一些警告信息。

當(dāng)然,最重要的是引發(fā)代碼異常,最常見(jiàn)的就是NoSuchMethod。

解決思路

尋找重復(fù)引用的jar。

定位這些Jar在哪里被引用了。

接下來(lái)需要分析舍與留,原則上保留高版本,大多數(shù)情況下是向下兼容的。但是不一定,有時(shí)候也得保留低版本,或者有時(shí)候兩者都需要保留。

如果是一個(gè)工程,其實(shí)處理起來(lái)還比較好處理。但是如果有多個(gè)工程,最終我們可能將所有的依賴合在一塊兒。處理起來(lái)可能會(huì)稍微麻煩些,比如工程1依賴了2.1版本,工程2依賴了2.2版本,你把工程1的2.1的依賴去掉,但同時(shí)還需要把2.2的加在工程1上面,否則可能編譯不通過(guò)。

最重要的就是,調(diào)整之后,盡可能做全面測(cè)試。特別是一些間接依賴,如果去除的話,編譯不會(huì)有問(wèn)題,但運(yùn)行起來(lái)會(huì)有問(wèn)題。

具體解決過(guò)程

上述5個(gè)步驟,重點(diǎn)說(shuō)一下1和2.

尋找重復(fù)引用的jar

觀察法:把所有的jar依賴打包到同一個(gè)目錄下,觀察。

運(yùn)行法:運(yùn)行階段會(huì)報(bào)錯(cuò),一旦報(bào)錯(cuò),基本上就定位到了。

掃描法:專業(yè)的測(cè)試人員,可以進(jìn)行掃描jar包并統(tǒng)計(jì)。

搜索法:依靠maven進(jìn)行搜索,這個(gè)方法在接下來(lái)會(huì)講到。

定位Jar被依賴的地方

在maven工程處打開(kāi)命令行,輸入:

mvn dependency:tree -Dverbose > tree.txt

這個(gè)命令會(huì)把這個(gè)工程pom.xml里面所有的依賴通過(guò)樹(shù)的形狀展示出來(lái),tree.txt:

樹(shù)形結(jié)構(gòu)其實(shí)看得比較清楚,里面有一些關(guān)鍵信息,比如:

omitted for duplicate

這個(gè)意思是依賴是重復(fù)的,當(dāng)然這個(gè)沒(méi)有關(guān)系。

當(dāng)然還有一些沖突提醒,上圖沒(méi)有,如下:

omitted for conflict with 0.5.3

顯示就是這個(gè)版本與0.5.3這個(gè)版本沖突了,這個(gè)也是我上面說(shuō)到的搜索法,你可以直接搜索“conflict”這個(gè)單詞,就可以了。當(dāng)然這種方式僅限單個(gè)工程。

拿到這棵樹(shù)以后,怎么辦呢?

前提是我們已經(jīng)知道了哪個(gè)jar包沖突了,那直接就在文本里面搜索,找到不同版本的引用之處,然后慎重考慮之后,通過(guò)exclusions標(biāo)簽進(jìn)行去除,如下:

<dependency>
 <groupId>jaxen</groupId>
 <artifactId>jaxen</artifactId>
 <version>1.1.1</version>
 <exclusions>
 <exclusion>
  <groupId>xerces</groupId>
  <artifactId>xercesImpl</artifactId>
 </exclusion>
 </exclusions>
 </dependency>

到此結(jié)束。去除的同時(shí)需要考慮的一些問(wèn)題,在解決思路里面提及了一些。希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論