Maven 依赖关系树 - 解决冲突

Maven 依赖树对了解项目依赖性以及解决因不同版本的依赖性而出现的冲突非常有帮助。

如何获得项目的Maven依赖树

我们可以在终端中运行mvn dependency:tree命令来打印项目依赖树. 对于我们的例子,我将使用 Mockito Tutorial项目. 您可以从 GitHub 存储库下载该项目。

 1<dependencies>
 2    <dependency>
 3    	<groupId>org.junit.platform</groupId>
 4    	<artifactId>junit-platform-runner</artifactId>
 5    	<version>1.2.0</version>
 6    	<scope>test</scope>
 7    </dependency>
 8    <dependency>
 9    	<groupId>org.junit.jupiter</groupId>
10    	<artifactId>junit-jupiter-engine</artifactId>
11    	<version>5.2.0</version>
12    	<scope>test</scope>
13    </dependency>
14    <dependency>
15    	<groupId>org.mockito</groupId>
16    	<artifactId>mockito-junit-jupiter</artifactId>
17    	<version>2.19.0</version>
18    	<scope>test</scope>
19    </dependency>
20    <!-- TestNG Dependencies -->
21    <dependency>
22    	<groupId>org.testng</groupId>
23    	<artifactId>testng</artifactId>
24    	<version>6.14.3</version>
25    	<scope>test</scope>
26    </dependency>
27</dependencies>

让我们看看当我们运行胃依赖树命令时的输出。

 1$ mvn dependency:tree                                                              
 2[INFO] Scanning for projects...
 3[INFO] 
 4[INFO] -----------------------------
 5[INFO] Building Mockito-Examples 1.0-SNAPSHOT
 6[INFO] --------------------------------[ jar ]---------------------------------
 7[INFO] 
 8[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples ---
 9[INFO] com.journaldev.mockito:Mockito-Examples:jar:1.0-SNAPSHOT
10[INFO] +- org.junit.platform:junit-platform-runner:jar:1.2.0:test
11[INFO] |  +- org.apiguardian:apiguardian-api:jar:1.0.0:test
12[INFO] |  +- org.junit.platform:junit-platform-launcher:jar:1.2.0:test
13[INFO] |  +- org.junit.platform:junit-platform-suite-api:jar:1.2.0:test
14[INFO] |  |  \- org.junit.platform:junit-platform-commons:jar:1.2.0:test
15[INFO] |  \- junit:junit:jar:4.12:test
16[INFO] |     \- org.hamcrest:hamcrest-core:jar:1.3:test
17[INFO] +- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test
18[INFO] |  +- org.junit.platform:junit-platform-engine:jar:1.2.0:test
19[INFO] |  |  \- org.opentest4j:opentest4j:jar:1.1.0:test
20[INFO] |  \- org.junit.jupiter:junit-jupiter-api:jar:5.2.0:test
21[INFO] +- org.mockito:mockito-junit-jupiter:jar:2.19.0:test
22[INFO] |  \- org.mockito:mockito-core:jar:2.19.0:test
23[INFO] |     +- net.bytebuddy:byte-buddy:jar:1.8.10:test
24[INFO] |     +- net.bytebuddy:byte-buddy-agent:jar:1.8.10:test
25[INFO] |     \- org.objenesis:objenesis:jar:2.6:test
26[INFO] \- org.testng:testng:jar:6.14.3:test
27[INFO]    +- com.beust:jcommander:jar:1.72:test
28[INFO]    \- org.apache-extras.beanshell:bsh:jar:2.0b6:test
29[INFO] ------------------------------------------------------------------------
30[INFO] BUILD SUCCESS
31[INFO] ------------------------------------------------------------------------
32[INFO] Total time:  0.871 s
33[INFO] Finished at: 2019-12-13T12:24:11+05:30
34[INFO] ------------------------------------------------------------------------
35$

输出显示了用于运行此应用程序的所有 JAR. 输出显示了依赖组Id、artifactId、包装、版本和范围。

排除来自 Maven 项目依赖的依赖

如果你看上面的依赖树输出,则 JUnit 4 JAR 正在被引用为junit-platform-runner的过渡依赖。如果你打算使用 JUnit 5 来写试验案例,那么将 JUnit 4 排除在依赖中是很好的想法,以避免任何冲突。

 1<dependency>
 2    <groupId>org.junit.platform</groupId>
 3    <artifactId>junit-platform-runner</artifactId>
 4    <version>1.2.0</version>
 5    <scope>test</scope>
 6    <exclusions>
 7    	<exclusion>
 8    		<groupId>junit</groupId>
 9    		<artifactId>junit</artifactId>
10    	</exclusion>
11    </exclusions>
12</dependency>

让我们再次运行依赖树命令,它现在不应该显示 JUnit 4 JAR。

Maven Dependency Tree

使用Maven Dependency Tree Verbose模式解决冲突

当我们构建一个maven项目时,选择更接近该项目的依赖版本。当您想要一个特定的版本时,它可能会导致问题,但某些其他版本正在被maven选中。我们可以使用mvn dependency:tree -Dverbose命令来打印依赖冲突。

 1$ mvn dependency:tree -Dverbose
 2[INFO] Scanning for projects...
 3[INFO] 
 4[INFO] -----------------------------
 5[INFO] Building Mockito-Examples 1.0-SNAPSHOT
 6[INFO] --------------------------------[ jar ]---------------------------------
 7[INFO] 
 8[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples ---
 9[INFO] com.journaldev.mockito:Mockito-Examples:jar:1.0-SNAPSHOT
10[INFO] +- org.junit.platform:junit-platform-runner:jar:1.2.0:test
11[INFO] |  +- org.apiguardian:apiguardian-api:jar:1.0.0:test
12[INFO] |  +- org.junit.platform:junit-platform-launcher:jar:1.2.0:test
13[INFO] |  |  +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate)
14[INFO] |  |  \- (org.junit.platform:junit-platform-engine:jar:1.2.0:test - omitted for duplicate)
15[INFO] |  \- org.junit.platform:junit-platform-suite-api:jar:1.2.0:test
16[INFO] |     +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate)
17[INFO] |     \- org.junit.platform:junit-platform-commons:jar:1.2.0:test
18[INFO] |        \- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate)
19[INFO] +- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test
20[INFO] |  +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate)
21[INFO] |  +- org.junit.platform:junit-platform-engine:jar:1.2.0:test
22[INFO] |  |  +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate)
23[INFO] |  |  +- (org.junit.platform:junit-platform-commons:jar:1.2.0:test - omitted for duplicate)
24[INFO] |  |  \- org.opentest4j:opentest4j:jar:1.1.0:test
25[INFO] |  \- org.junit.jupiter:junit-jupiter-api:jar:5.2.0:test
26[INFO] |     +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate)
27[INFO] |     +- (org.opentest4j:opentest4j:jar:1.1.0:test - omitted for duplicate)
28[INFO] |     \- (org.junit.platform:junit-platform-commons:jar:1.2.0:test - omitted for duplicate)
29[INFO] +- org.mockito:mockito-junit-jupiter:jar:2.19.0:test
30[INFO] |  +- org.mockito:mockito-core:jar:2.19.0:test
31[INFO] |  |  +- net.bytebuddy:byte-buddy:jar:1.8.10:test
32[INFO] |  |  +- net.bytebuddy:byte-buddy-agent:jar:1.8.10:test
33[INFO] |  |  \- org.objenesis:objenesis:jar:2.6:test
34[INFO] |  \- (org.junit.jupiter:junit-jupiter-api:jar:5.1.0:test - omitted for conflict with 5.2.0)
35[INFO] \- org.testng:testng:jar:6.14.3:test
36[INFO]    +- com.beust:jcommander:jar:1.72:test
37[INFO]    \- org.apache-extras.beanshell:bsh:jar:2.0b6:test
38[INFO] ------------------------------------------------------------------------
39[INFO] BUILD SUCCESS
40[INFO] ------------------------------------------------------------------------
41[INFO] Total time:  1.018 s
42[INFO] Finished at: 2019-12-13T12:58:07+05:30
43[INFO] ------------------------------------------------------------------------
44$

输出线 **(org.junit.jupiter:junit-jupiter-api:jar:5.1.0:test - omitted for conflict with 5.2.0)**告诉我们,这个版本的JAR被放弃为另一个版本. 如果你想使用‘junit-jupiter-api’版本 5.1.0,只需将其添加到项目的maven依赖。

过滤 Maven 依赖树

如果maven项目有很多依赖性,那么很难寻找一个特定的文物。

包括

我们可以使用 -Dincludes 选项仅包括输出中的特定依赖性。 过滤模式的语法是 [groupId]:[artifactId]:[type]:[version]. 每个模式细分都是可选的,并支持完整和部分的 * wildcards。

 1$ mvn dependency:tree -Dverbose -Dincludes=org.junit.jupiter:junit-jupiter-api
 2[INFO] Scanning for projects...
 3[INFO] 
 4[INFO] -----------------------------
 5[INFO] Building Mockito-Examples 1.0-SNAPSHOT
 6[INFO] --------------------------------[ jar ]---------------------------------
 7[INFO] 
 8[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples ---
 9[INFO] com.journaldev.mockito:Mockito-Examples:jar:1.0-SNAPSHOT
10[INFO] +- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test
11[INFO] |  \- org.junit.jupiter:junit-jupiter-api:jar:5.2.0:test
12[INFO] \- org.mockito:mockito-junit-jupiter:jar:2.19.0:test
13[INFO]    \- (org.junit.jupiter:junit-jupiter-api:jar:5.1.0:test - omitted for conflict with 5.2.0)
14[INFO] ------------------------------------------------------------------------
15[INFO] BUILD SUCCESS
16[INFO] ------------------------------------------------------------------------
17[INFO] Total time:  0.981 s
18[INFO] Finished at: 2019-12-13T13:04:04+05:30
19[INFO] ------------------------------------------------------------------------
20$

排除

此方法用于从依赖树输出中删除给定的依赖性。 模式与-Dincludes选项相同。 我们可以使用语来指定多个模式,包括或排除在依赖树中。

 1$ mvn dependency:tree -Dexcludes=org.junit.jupiter:junit-jupiter-api 
 2[INFO] Scanning for projects...
 3[INFO] 
 4[INFO] -----------------------------
 5[INFO] Building Mockito-Examples 1.0-SNAPSHOT
 6[INFO] --------------------------------[ jar ]---------------------------------
 7[INFO] 
 8[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples ---
 9[INFO] com.journaldev.mockito:Mockito-Examples:jar:1.0-SNAPSHOT
10[INFO] +- org.junit.platform:junit-platform-runner:jar:1.2.0:test
11[INFO] |  +- org.apiguardian:apiguardian-api:jar:1.0.0:test
12[INFO] |  +- org.junit.platform:junit-platform-launcher:jar:1.2.0:test
13[INFO] |  \- org.junit.platform:junit-platform-suite-api:jar:1.2.0:test
14[INFO] |     \- org.junit.platform:junit-platform-commons:jar:1.2.0:test
15[INFO] +- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test
16[INFO] |  \- org.junit.platform:junit-platform-engine:jar:1.2.0:test
17[INFO] |     \- org.opentest4j:opentest4j:jar:1.1.0:test
18[INFO] +- org.mockito:mockito-junit-jupiter:jar:2.19.0:test
19[INFO] |  \- org.mockito:mockito-core:jar:2.19.0:test
20[INFO] |     +- net.bytebuddy:byte-buddy:jar:1.8.10:test
21[INFO] |     +- net.bytebuddy:byte-buddy-agent:jar:1.8.10:test
22[INFO] |     \- org.objenesis:objenesis:jar:2.6:test
23[INFO] \- org.testng:testng:jar:6.14.3:test
24[INFO]    +- com.beust:jcommander:jar:1.72:test
25[INFO]    \- org.apache-extras.beanshell:bsh:jar:2.0b6:test
26[INFO] ------------------------------------------------------------------------
27[INFO] BUILD SUCCESS
28[INFO] ------------------------------------------------------------------------
29[INFO] Total time:  0.925 s
30[INFO] Finished at: 2019-12-13T13:55:22+05:30
31[INFO] ------------------------------------------------------------------------
32$

Maven 依赖树 在 Eclipse IDE 中

Eclipse pom.xml "Dependency Hierarchy" 卡显示了项目的依赖树. 它有两个侧面 - 左侧显示了无语的输出,右侧显示了解决的依赖。

Eclipse Pom Dependency Hierarchy

** 继续阅读**: 使用Maven在Eclipse IDE

保存依赖树到一个文件

我们可以使用 -DoutputFile 选项来指定文件来保存依赖树输出。

 1$ mvn dependency:tree -DoutputFile=dependency-tree.txt
 2[INFO] Scanning for projects...
 3[INFO] 
 4[INFO] -----------------------------
 5[INFO] Building Mockito-Examples 1.0-SNAPSHOT
 6[INFO] --------------------------------[ jar ]---------------------------------
 7[INFO] 
 8[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples ---
 9[INFO] Wrote dependency tree to: /Users/pankaj/Desktop/maven-examples/Mockito-Examples/dependency-tree.txt
10[INFO] ------------------------------------------------------------------------
11[INFO] BUILD SUCCESS
12[INFO] ------------------------------------------------------------------------
13[INFO] Total time:  0.862 s
14[INFO] Finished at: 2019-12-13T15:27:51+05:30
15[INFO] ------------------------------------------------------------------------
16$
17$ cat dependency-tree.txt 
18com.journaldev.mockito:Mockito-Examples:jar:1.0-SNAPSHOT
19+- org.junit.platform:junit-platform-runner:jar:1.2.0:test
20|  +- org.apiguardian:apiguardian-api:jar:1.0.0:test
21|  +- org.junit.platform:junit-platform-launcher:jar:1.2.0:test
22|  \- org.junit.platform:junit-platform-suite-api:jar:1.2.0:test
23|     \- org.junit.platform:junit-platform-commons:jar:1.2.0:test
24+- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test
25|  +- org.junit.platform:junit-platform-engine:jar:1.2.0:test
26|  |  \- org.opentest4j:opentest4j:jar:1.1.0:test
27|  \- org.junit.jupiter:junit-jupiter-api:jar:5.2.0:test
28+- org.mockito:mockito-junit-jupiter:jar:2.19.0:test
29|  \- org.mockito:mockito-core:jar:2.19.0:test
30|     +- net.bytebuddy:byte-buddy:jar:1.8.10:test
31|     +- net.bytebuddy:byte-buddy-agent:jar:1.8.10:test
32|     \- org.objenesis:objenesis:jar:2.6:test
33\- org.testng:testng:jar:6.14.3:test
34   +- com.beust:jcommander:jar:1.72:test
35   \- org.apache-extras.beanshell:bsh:jar:2.0b6:test
36$

参考

Published At
Categories with 技术
Tagged with
comments powered by Disqus