maven 依賴樹檢視以及衝突解決

語言: CN / TW / HK

maven 依賴樹檢視以及衝突解決

1. 檢視依賴樹

如果你使用idea可以點選上圖按鈕,會有一個彈出框,選擇一個專案工程,使用命令:

mvn dependency:tree


[INFO] +- org.springframework:spring-webmvc:jar:4.2.2.RELEASE:compile
[INFO] |  +- org.springframework:spring-beans:jar:4.2.2.RELEASE:compile
[INFO] |  +- org.springframework:spring-context:jar:4.2.2.RELEASE:compile
[INFO] |  |  \- org.springframework:spring-aop:jar:4.2.2.RELEASE:compile
[INFO] |  |     \- aopalliance:aopalliance:jar:1.0:compile
[INFO] |  +- org.springframework:spring-core:jar:4.2.2.RELEASE:compile
[INFO] |  |  \- commons-logging:commons-logging:jar:1.2:compile
[INFO] |  +- org.springframework:spring-expression:jar:4.2.2.RELEASE:compile

會出現類似的依賴結構。上面就是一個依賴樹結構,並有層級關係,我們可以看出他們的依賴父子關係。

** 其中+-\- 並無實際含義,只是方便展示檢視。 **

2. 依賴樹檢視擴充套件命令

1. -Dverbose

verbose 的中文翻譯為冗餘的意思,這個命令就是檢視更加具體和冗餘的依賴樹資訊。 使用示例:

dependency:tree -Dverbose=true

2. -Dincludes

這個引數就是檢視你感興趣的依賴,支援正則表示式。如我只想檢視hadoop相關的依賴,示例:

dependency:tree -Dincludes=*hadoop*

輸出:


com.mytest.server:mytest-server:jar:1.0-SNAPSHOT
+- org.apache.hive:hive-jdbc:jar:3.1.2:compile
|  \- org.apache.hive:hive-shims:jar:3.1.2:compile
|     \- org.apache.hive.shims:hive-shims-0.23:jar:3.1.2:runtime
|        \- org.apache.hadoop:hadoop-yarn-server-resourcemanager:jar:3.1.0:runtime
|           +- org.apache.hadoop:hadoop-yarn-server-common:jar:3.1.0:compile
|           +- org.apache.hadoop:hadoop-yarn-server-applicationhistoryservice:jar:3.1.0:runtime
|           \- org.apache.hadoop:hadoop-yarn-server-web-proxy:jar:3.1.0:runtime
+- org.apache.hadoop:hadoop-common:jar:3.1.2:compile
|  +- org.apache.hadoop:hadoop-annotations:jar:3.1.2:compile
|  \- org.apache.hadoop:hadoop-auth:jar:3.1.2:compile
+- org.apache.hive:hive-exec:jar:3.1.2:compile
|  \- org.apache.hadoop:hadoop-yarn-registry:jar:3.1.0:compile
|     +- org.apache.hadoop:hadoop-yarn-api:jar:3.1.0:compile
|     \- org.apache.hadoop:hadoop-yarn-common:jar:3.1.0:compile
+- org.apache.hbase:hbase-common:jar:1.1.2:compile
|  \- org.apache.hadoop:hadoop-mapreduce-client-core:jar:2.5.1:compile
\- org.apache.hbase:hbase-server:jar:1.1.2:compile
   +- org.apache.hadoop:hadoop-client:jar:2.5.1:compile
   |  +- org.apache.hadoop:hadoop-mapreduce-client-app:jar:2.5.1:compile
   |  |  +- org.apache.hadoop:hadoop-mapreduce-client-common:jar:2.5.1:compile
   |  |  |  \- org.apache.hadoop:hadoop-yarn-client:jar:2.5.1:compile
   |  |  \- org.apache.hadoop:hadoop-mapreduce-client-shuffle:jar:2.5.1:compile
   |  \- org.apache.hadoop:hadoop-mapreduce-client-jobclient:jar:2.5.1:compile
   \- org.apache.hadoop:hadoop-hdfs:jar:2.5.1:compile

3. -DoutputFile

預設的依賴樹輸出是到控制檯的,你可以重定向到一個你指定的檔案。如:

dependency:tree -Dincludes=*hadoop* -DoutputFile=你指定的檔案

這樣方便後續檢視。

3. 衝突解決

以解決guava為例,檢視命令可以使用-Dverbose,你可以看到多個guava版本,有很多還有提示衝突了(com.google.guava:guava:jar:16.0.1:runtime - omitted for conflict with 11.0.2)

你可以手動解決衝突,引入適配版本,然後依賴包中依賴了guava包的使用 exclusion進行排除,如:


    <dependency>
        <groupId>org.apache.hbase</groupId>
        <artifactId>hbase-common</artifactId>
        <version>1.1.2</version>
        <exclusions>
            <exclusion>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
            </exclusion> 
    </dependency>
        

4. shade解決衝突

但是還有時候你會遇到更糟糕的情況,不同包依賴的包互相沖突,並且這個衝突包的兩個版本不可相容,如guava。如我遇到的org.apache.hbase和spring的依賴guava衝突,但是他們依賴不同版本guava,不可替換,此時好的辦法就是使用shade版本,如:


<!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-shaded-client -->
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-shaded-client</artifactId>
            <version>2.4.1</version>
        </dependency>
        

這個shade包可以去maven官網下載,通常官方打的依賴包還是可靠的。 shade原理: 為什麼用shade版本就可以了?其實很簡單,就是修改其中任意一方的依賴路徑來解決的,其實就是package值。如Gson類的package正常值是package com.google.gson;,在hbase-shaded-client中就是package org.apache.hbase.thirdparty.com.google.gson;,如果package不同,自然不會有衝突了。

5. 參考

  1. https://blog.csdn.net/u010003835/article/details/81633093
  2. https://stackoverflow.com/questions/34006740/what-is-the-difference-between-and-in-maven-dependency-tree-output
  3. https://maven.apache.org/plugins/maven-dependency-plugin/examples/resolving-conflicts-using-the-dependency-tree.html
分享到: