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不同,自然不會有衝突了。