Maven依賴jar包衝突常見的解決方法

項目中,常常會遇到ClassNotFound,NoSuchMethod異常,第一反應每每是類路徑不對,jar沒有正確的引用。第一步判斷jar是否加載,仍是 加載的jar因爲maven依賴管理存在傳遞依賴,形成依賴的jar版本號不對,相應的類找不到,或者是相應類版本不對,沒有對應的方法。java

一 形成jar 衝突的緣由:若是項目中存在對同一jar不一樣版本依賴的時候,maven 2根據最近原則,默認引用最靠近項目版本的jar,maven 2.0.9會根據最早聲明原則 來引用相應版本的jar;不管那種方式,都會出現jar包衝突。在這裏提一下gradle依賴,會依賴最新版本的jar。web

二 判斷jar是否正確的被引用 有兩種方法:apache

1在項目啓動時加上VM參數:-verbose:classmaven

項目啓動的時候會把全部加載的jar都打印出來 相似以下的信息:ide

classpath加載的jar工具

-classpath /home/yao/tool/jdk1.8.0_25/jre/lib/jce.jar:
/home/yao/tool/jdk1.8.0_25/jre/lib/resources.jar:
/home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar:
/home/yao/tool/jdk1.8.0_25/jre/lib/management-agent.jar:
/home/yao/tool/jdk1.8.0_25/jre/lib/jfxswt.jar:
/home/yao/tool/jdk1.8.0_25/jre/lib/plugin.jar:
/home/yao/tool/jdk1.8.0_25/jre/lib/javaws.jar:
/home/yao/tool/jdk1.8.0_25/jre/lib/charsets.jar:
/home/yao/tool/jdk1.8.0_25/jre/lib/jsse.jar:
/home/yao/tool/jdk1.8.0_25/jre/lib/deploy.jar:
/home/yao/tool/jdk1.8.0_25/jre/lib/jfr.jar:
/home/yao/tool/jdk1.8.0_25/jre/lib/ext/localedata.jar:
/home/yao/tool/jdk1.8.0_25/jre/lib/ext/nashorn.jar:
/home/yao/tool/jdk1.8.0_25/jre/lib/ext/jfxrt.jar:
/home/yao/tool/jdk1.8.0_25/jre/lib/ext/sunjce_provider.jar:
...............等等

具體load的類gradle

[Loaded java.lang.Object from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]
[Loaded java.io.Serializable from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]
[Loaded java.lang.Comparable from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]
[Loaded java.lang.CharSequence from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]
[Loaded java.lang.String from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]
[Loaded java.lang.reflect.AnnotatedElement from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]
[Loaded java.lang.reflect.GenericDeclaration from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]
[Loaded java.lang.reflect.Type from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]
[Loaded java.lang.Class from /home/yao/tool/jdk1.8.0_25/jre/lib/rt.jar]
..................等等

咱們能夠經過上面的信息查找對應的jar是否正確的被依賴,具體類加載狀況,同時能夠看到版本號,肯定是否因爲依賴衝突形成的jar引用不正確;spa

2 經過maven自帶的工具:‍‍mvn dependency:treecode

具體後面能夠加 -Dverbose 參數 ,詳細參數能夠去本身搜,這裏不詳細介紹。xml

好比分析以下POM

運行: mvn dependency:tree -Dverbose

<dependencies>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.2-FINAL</version>
        </dependency>
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.7.0</version>
        </dependency>
    </dependencies>

輸出結果:

[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Dependency ---
[INFO] com.yao:Dependency:pom:1.0-SNAPSHOT
[INFO] +- org.apache.poi:poi:jar:3.2-FINAL:compile
[INFO] |  +- commons-logging:commons-logging:jar:1.1:compile
[INFO] |  |  \- log4j:log4j:jar:1.2.13:compile
[INFO] |  \- (log4j:log4j:jar:1.2.13:compile - scope updated from runtime; omitted for duplicate)
[INFO] \- commons-beanutils:commons-beanutils:jar:1.7.0:compile
[INFO]    \- (commons-logging:commons-logging:jar:1.0.3:compile - omitted for conflict with 1.1)
[INFO] ------------------------------------------------------------------------

經過裏面的信息能夠看到 兩個jar都commons-logging存在依賴,可是版本不一樣。裏面的詳細信息顯示引用了 commons-logging:commons-logging:jar:1.1 去掉了commons-logging:commons-logging:jar:1.0.3 (omitted for duplicate)。

經過以上方法咱們能夠看到項目中引用jar版本號;接下來就是如何排除掉咱們不想要版本的jar;

三 經過Idea intellij 中的Show Dependencies的工具去除重複的jar

在Pom.xml文件上右擊 選擇 Diagrams -> Show Dependencies 便可查看Pom的依賴圖,經過圖能夠很容易的看到依賴衝突的jar,exculude掉不想要的版本jar便可。

Maven依賴jar包衝突常見的解決方法

相關文章
相關標籤/搜索