1. 程式人生 > >用dependency:tree檢視maven引入jar包的傳遞依賴

用dependency:tree檢視maven引入jar包的傳遞依賴

maven專案的pom.xml檔案給專案匯入了不同的jar包,有時候不同的dependency會引入同一個jar包的不同版本。

當不同版本的jar包被依賴後,可能會出現:

  1. 衝突。
  2. 有的版本的jar包不會被classloader引入,而有的程式碼確實需要那個沒有被引入的jar包,進而出現錯誤。

在pom.xml檔案的目錄下使用mvn dependency:tree命令可以檢視jar包的傳遞依賴。

使用-Dverbose 引數可以列出更詳細的資訊。

mvn -Dverbose dependency:tree


從命令執行的輸出內容來看,該命令執行的時候會重新build一次。

如果節選輸出內容的其中一部分,可能是這樣的:

[INFO] +- org.apache.tomcat:tomcat-servlet-api:jar:7.0.70:compile
[INFO] +- org.apache.tomcat:tomcat-jsp-api:jar:7.0.70:compile
[INFO] |  +- org.apache.tomcat:tomcat-el-api:jar:7.0.70:compile
[INFO] |  \- (org.apache.tomcat:tomcat-servlet-api:jar:7.0.70:compile - omitted for duplicate)
[INFO] +- net.sf.jasperreports:jasperreports:jar:5.6.0:compile
[INFO] |  +- (commons-beanutils:commons-beanutils:jar:1.8.0:compile - omitted for conflict with 1.8.3)
[INFO] |  +- commons-collections:commons-collections:jar:3.2.1:compile
[INFO] |  +- commons-digester:commons-digester:jar:2.1:compile
[INFO] |  |  +- (commons-beanutils:commons-beanutils:jar:1.8.3:compile - omitted for duplicate)
[INFO] |  |  \- (commons-logging:commons-logging:jar:1.1.1:compile - omitted for duplicate)

遞迴依賴的關係列的算是比較清楚了,每行都是一個jar包,根據縮排可以看到依賴的關係。
  • 最後寫著compile的就是編譯成功的。
  • 最後寫著omitted for duplicate的就是有jar包被重複依賴了,但是jar包的版本是一樣的。
  • 最後寫著omitted for conflict with xxxx的,說明和別的jar包版本衝突了,而該行的jar包不會被引入。比如上面有一行最後寫著omitted for conflict with 1.8.3,那麼該行的commons-beanutils:jar:1.8.0不會被引入,只有1.8.3版本的會被引入。

解決重複依賴和衝突的方法:

1,修改pom檔案中兩個dependency元素的位置。如果兩個dependency都引用了一個jar包,但是版本不同,classloader只會載入jar包在pom檔案中出現的第一個版本,以後出現的其他版本的jar包會被忽略。

不建議使用該方法,因為引用不同版本的jar包本身就是很危險的。

2,使用<exclusions>標籤來去掉某個dependency依賴中的某一個jar包或一堆jar包,<exclusion>中的jar包或者依賴的相關jar包都會被忽略,從而在兩個dependency都依賴某個jar包時,可以保證只使用其中的一個。

可以這麼寫:

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>dubbo</artifactId>
	<version>2.8.3.2</version>
	<exclusions>
		<exclusion>
			<artifactId>guava</artifactId>
			<groupId>com.google.guava</groupId>
		</exclusion>
		<exclusion>
			<artifactId>spring</artifactId>
			<groupId>org.springframework</groupId>
		</exclusion>	
	</exclusions>
</dependency>