最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

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

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

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

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

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

解決方法:

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

但是查看maven項目中的pom文件,自己并沒有配置這個jar的依賴,猜測是maven加載其他jar引入的依賴包。

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

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

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

修改后對應(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>

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

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

問題描述

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

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

首先從工程角度來講,引用了同一個Jar的不同版本,這肯定是依賴有問題,或者就是錯誤的。

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

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

解決思路

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

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

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

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

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

具體解決過程

上述5個步驟,重點說一下1和2.

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

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

運行法:運行階段會報錯,一旦報錯,基本上就定位到了。

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

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

定位Jar被依賴的地方

在maven工程處打開命令行,輸入:

mvn dependency:tree -Dverbose > tree.txt

這個命令會把這個工程pom.xml里面所有的依賴通過樹的形狀展示出來,tree.txt:

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

omitted for duplicate

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

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

omitted for conflict with 0.5.3

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

拿到這棵樹以后,怎么辦呢?

前提是我們已經(jīng)知道了哪個jar包沖突了,那直接就在文本里面搜索,找到不同版本的引用之處,然后慎重考慮之后,通過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é)束。去除的同時需要考慮的一些問題,在解決思路里面提及了一些。希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java設(shè)計模式之靜態(tài)代理模式實例分析

    Java設(shè)計模式之靜態(tài)代理模式實例分析

    這篇文章主要介紹了Java設(shè)計模式之靜態(tài)代理模式,結(jié)合實例形式分析了靜態(tài)代理模式的概念、原理、定義與用法,需要的朋友可以參考下
    2018-04-04
  • SpringBoot項目接收前端參數(shù)的11種方式

    SpringBoot項目接收前端參數(shù)的11種方式

    在前后端項目交互中,前端傳遞的數(shù)據(jù)可以通過HTTP請求發(fā)送到后端, 后端在Spring Boot中如何接收各種復(fù)雜的前端數(shù)據(jù)呢?這篇文章總結(jié)了11種在Spring Boot中接收前端數(shù)據(jù)的方式,需要的朋友可以參考下
    2024-12-12
  • springboot?yml配置文件值注入方式

    springboot?yml配置文件值注入方式

    這篇文章主要介紹了springboot?yml配置文件值注入方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • 開放封閉原則_動力節(jié)點Java學(xué)院整理

    開放封閉原則_動力節(jié)點Java學(xué)院整理

    這篇文章主要介紹了開放封閉原則,開放-封閉原則是面向?qū)ο笤O(shè)計的核心所在,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Java項目實戰(zhàn)之在線考試系統(tǒng)的實現(xiàn)(系統(tǒng)介紹)

    Java項目實戰(zhàn)之在線考試系統(tǒng)的實現(xiàn)(系統(tǒng)介紹)

    這篇文章主要介紹了Java項目實戰(zhàn)之在線考試系統(tǒng)的實現(xiàn)(系統(tǒng)介紹),本文通過實例代碼,截圖的形式給大家展示系統(tǒng)技術(shù)架構(gòu),需要的朋友可以參考下
    2020-02-02
  • IDEA自帶Maven插件找不到settings.xml配置文件

    IDEA自帶Maven插件找不到settings.xml配置文件

    IDEA自帶了Maven插件,最近發(fā)現(xiàn)了一個問題,IDEA自帶Maven插件找不到settings.xml配置文件,本文就來詳細(xì)的介紹一下解決方法,感興趣的可以了解一下
    2023-11-11
  • RabbitMQ實現(xiàn)消費端限流的步驟

    RabbitMQ實現(xiàn)消費端限流的步驟

    消費者端限流的主要目的是控制消費者每次從 RabbitMQ 中獲取的消息數(shù)量,從而實現(xiàn)消息處理的流量控制,這篇文章主要介紹了RabbitMQ如何實現(xiàn)消費端限流,需要的朋友可以參考下
    2024-03-03
  • springboot如何獲取request請求的原始url與post參數(shù)

    springboot如何獲取request請求的原始url與post參數(shù)

    這篇文章主要介紹了springboot如何獲取request請求的原始url與post參數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • Java Arrays工具類用法詳解

    Java Arrays工具類用法詳解

    這篇文章主要介紹了Java Arrays工具類用法,結(jié)合實例形式分析了java Arrays工具類針對數(shù)組元素修改、復(fù)制、排序等操作使用技巧與相關(guān)注意事項,需要的朋友可以參考下
    2019-05-05
  • 基于FLink實現(xiàn)實時安全檢測的示例代碼

    基于FLink實現(xiàn)實時安全檢測的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何基于FLink實現(xiàn)實時安全檢測的功能,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的可以了解一下
    2023-02-02

最新評論

榆树市| 新宾| 高尔夫| 无极县| 浦城县| 韶关市| 自治县| 柞水县| 平遥县| 张北县| 白城市| 扎赉特旗| 定远县| 莱州市| 繁峙县| 文化| 荃湾区| 枝江市| 乳山市| 梅河口市| 吴江市| 韩城市| 进贤县| 扎兰屯市| 伊宁市| 鄱阳县| 泽库县| 上蔡县| 尚志市| 红安县| 汽车| 广饶县| 炉霍县| 固阳县| 临沭县| 昭通市| 伊春市| 瑞金市| 华池县| 卓资县| 东海县|