1. 程式人生 > >用maven工具解決jar包衝突問題或重複載入問題

用maven工具解決jar包衝突問題或重複載入問題

在使用maven開發專案的過程中,經常會遇到jar包重複載入或者jar包衝突的問題的,但是由於有些jar是由於maven的依賴載入自動載入進來的,
而不是開發者自己配置的,特別是當專案中pom中配置的jar包依賴本身很多時,開發者靠自己的經驗,有時很難找出是哪個jar的載入導致載入了
多餘的依賴jar,從而產生衝突。
今天剛好遇到一個借用eclipse中的maven外掛解決jar包依賴衝突的問題,分享一下。

專案中出現的問題如下:

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

後經網上搜索加邊上大牛指點發現:

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

解決方法:
將slf4j-log4j12.jar從相關的jar中排除

但是檢視maven專案中的pom檔案,自己並沒有配置這個jar的依賴,猜測是maven載入其他jar引入的依賴包。

開啟pom.xml檔案,在Dependency Hierarchy(依賴列表)中檢視jar包的依賴層次關係。這裡寫圖片描述

在過濾欄中輸入log4j,右側出現了log4j相關包的依賴結構,左側則是pom.xml全部依賴包的列表展示。

直接在右側選中zookeeper底下的slf4j的jar包,右鍵選擇Exclude,然後儲存pom.xml。這樣在載入zookeeper的jar包時就不會再載入slf4j的jar包。
這裡寫圖片描述

修改後對應的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過濾快速找到對應jar,並知道他的依賴關係,快速解決專案中的jar包衝突問題。