Maven依赖树–解决冲突
Maven依赖关系树对于理解项目依赖关系和解决由于依赖关系版本不同而引起的任何冲突非常有帮助。
如何获取项目的Maven依赖树
我们可以在终端中运行mvndependency:tree
命令来打印项目依赖树。
对于我们的示例,我将使用Mockito Tutorial项目。
您可以从GitHub存储库下载项目。
我们仅对项目依赖项感兴趣。
pom.xml声明了以下项目依赖项。
<dependencies> <dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-runner</artifactId> <version>1.2.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.2.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-junit-jupiter</artifactId> <version>2.19.0</version> <scope>test</scope> </dependency> <!-- TestNG Dependencies --> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.14.3</version> <scope>test</scope> </dependency> </dependencies>
我们来看看运行maven依赖树命令时的输出。
$mvn dependency:tree [INFO] Scanning for projects... [INFO] [INFO] ---------------------------- [INFO] Building Mockito-Examples 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]-------------------------------- [INFO] [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples -- [INFO] com.theitroad.mockito:Mockito-Examples:jar:1.0-SNAPSHOT [INFO] +- org.junit.platform:junit-platform-runner:jar:1.2.0:test [INFO] | +- org.apiguardian:apiguardian-api:jar:1.0.0:test [INFO] | +- org.junit.platform:junit-platform-launcher:jar:1.2.0:test [INFO] | +- org.junit.platform:junit-platform-suite-api:jar:1.2.0:test [INFO] | | \- org.junit.platform:junit-platform-commons:jar:1.2.0:test [INFO] | \- junit:junit:jar:4.12:test [INFO] | \- org.hamcrest:hamcrest-core:jar:1.3:test [INFO] +- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test [INFO] | +- org.junit.platform:junit-platform-engine:jar:1.2.0:test [INFO] | | \- org.opentest4j:opentest4j:jar:1.1.0:test [INFO] | \- org.junit.jupiter:junit-jupiter-api:jar:5.2.0:test [INFO] +- org.mockito:mockito-junit-jupiter:jar:2.19.0:test [INFO] | \- org.mockito:mockito-core:jar:2.19.0:test [INFO] | +- net.bytebuddy:byte-buddy:jar:1.8.10:test [INFO] | +- net.bytebuddy:byte-buddy-agent:jar:1.8.10:test [INFO] | \- org.objenesis:objenesis:jar:2.6:test [INFO] \- org.testng:testng:jar:6.14.3:test [INFO] +- com.beust:jcommander:jar:1.72:test [INFO] \- org.apache-extras.beanshell:bsh:jar:2.0b6:test [INFO] ----------------------------------------------------------------------- [INFO] BUILD SUCCESS [INFO] ----------------------------------------------------------------------- [INFO] Total time: 0.871 s [INFO] Finished at: 2019-12-13T12:24:11+05:30 [INFO] ----------------------------------------------------------------------- $
输出显示了用于运行此应用程序的所有JAR。
输出显示依赖项groupId,artifactId,包装,版本和范围。
从Maven项目依赖项中排除依赖项
如果查看上面的依赖关系树输出,则将JUnit 4 JAR作为" junit-platform-runner"的可传递依赖关系拉出。
如果您打算使用JUnit 5编写测试用例,则最好将JUnit 4从依赖项中排除,以避免任何冲突。
我们可以使用exclusions标记从项目依赖项中排除JUnit 4 JAR。
必须将其添加到负责拉出它的依赖项中。
<dependency> <groupId>org.junit.platform</groupId> <artifactId>junit-platform-runner</artifactId> <version>1.2.0</version> <scope>test</scope> <exclusions> <exclusion> <groupId>junit</groupId> <artifactId>junit</artifactId> </exclusion> </exclusions> </dependency>
让我们再次运行依赖关系树命令。
它现在不应显示JUnit 4 JAR。
Maven依赖树
使用Maven依赖树详细模式解决冲突
当我们构建一个Maven项目时,将选择更接近该项目的依赖版本。
当您想要特定版本但行家选择了其他版本时,这可能会导致问题。
我们可以使用mvndependency:tree -Dverbose
命令来打印依赖冲突。
它可以帮助我们确定JAR是否存在任何不兼容问题。
$mvn dependency:tree -Dverbose [INFO] Scanning for projects... [INFO] [INFO] ---------------------------- [INFO] Building Mockito-Examples 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]-------------------------------- [INFO] [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples -- [INFO] com.theitroad.mockito:Mockito-Examples:jar:1.0-SNAPSHOT [INFO] +- org.junit.platform:junit-platform-runner:jar:1.2.0:test [INFO] | +- org.apiguardian:apiguardian-api:jar:1.0.0:test [INFO] | +- org.junit.platform:junit-platform-launcher:jar:1.2.0:test [INFO] | | +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate) [INFO] | | \- (org.junit.platform:junit-platform-engine:jar:1.2.0:test - omitted for duplicate) [INFO] | \- org.junit.platform:junit-platform-suite-api:jar:1.2.0:test [INFO] | +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate) [INFO] | \- org.junit.platform:junit-platform-commons:jar:1.2.0:test [INFO] | \- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate) [INFO] +- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test [INFO] | +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate) [INFO] | +- org.junit.platform:junit-platform-engine:jar:1.2.0:test [INFO] | | +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate) [INFO] | | +- (org.junit.platform:junit-platform-commons:jar:1.2.0:test - omitted for duplicate) [INFO] | | \- org.opentest4j:opentest4j:jar:1.1.0:test [INFO] | \- org.junit.jupiter:junit-jupiter-api:jar:5.2.0:test [INFO] | +- (org.apiguardian:apiguardian-api:jar:1.0.0:test - omitted for duplicate) [INFO] | +- (org.opentest4j:opentest4j:jar:1.1.0:test - omitted for duplicate) [INFO] | \- (org.junit.platform:junit-platform-commons:jar:1.2.0:test - omitted for duplicate) [INFO] +- org.mockito:mockito-junit-jupiter:jar:2.19.0:test [INFO] | +- org.mockito:mockito-core:jar:2.19.0:test [INFO] | | +- net.bytebuddy:byte-buddy:jar:1.8.10:test [INFO] | | +- net.bytebuddy:byte-buddy-agent:jar:1.8.10:test [INFO] | | \- org.objenesis:objenesis:jar:2.6:test [INFO] | \- (org.junit.jupiter:junit-jupiter-api:jar:5.1.0:test - omitted for conflict with 5.2.0) [INFO] \- org.testng:testng:jar:6.14.3:test [INFO] +- com.beust:jcommander:jar:1.72:test [INFO] \- org.apache-extras.beanshell:bsh:jar:2.0b6:test [INFO] ----------------------------------------------------------------------- [INFO] BUILD SUCCESS [INFO] ----------------------------------------------------------------------- [INFO] Total time: 1.018 s [INFO] Finished at: 2019-12-13T12:58:07+05:30 [INFO] ----------------------------------------------------------------------- $
输出行(org.junit.jupiter:junit-jupiter-api:jar:5.1.0:test-为与5.2.0冲突而省略)告诉我们,此版本的JAR已被删除,转而使用另一个版本。
如果您想使用5.1.0版的" junit-jupiter-api"版本,只需将其添加到项目maven依赖项中即可。
由于Maven使用最近赢得策略解决了版本冲突,因此直接依赖项始终包含在项目中。
过滤Maven依赖树
如果maven项目具有很多依赖关系,则很难查找特定的工件。
-D包括
我们可以使用-Dincludes选项来仅包含输出中的特定依赖项。
过滤模式的语法为[groupId]:[artifactId]:[type]:[version]
。
每个模式段都是可选的,并且支持完整和部分*通配符。
$mvn dependency:tree -Dverbose -Dincludes=org.junit.jupiter:junit-jupiter-api [INFO] Scanning for projects... [INFO] [INFO] ---------------------------- [INFO] Building Mockito-Examples 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]-------------------------------- [INFO] [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples -- [INFO] com.theitroad.mockito:Mockito-Examples:jar:1.0-SNAPSHOT [INFO] +- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test [INFO] | \- org.junit.jupiter:junit-jupiter-api:jar:5.2.0:test [INFO] \- org.mockito:mockito-junit-jupiter:jar:2.19.0:test [INFO] \- (org.junit.jupiter:junit-jupiter-api:jar:5.1.0:test - omitted for conflict with 5.2.0) [INFO] ----------------------------------------------------------------------- [INFO] BUILD SUCCESS [INFO] ----------------------------------------------------------------------- [INFO] Total time: 0.981 s [INFO] Finished at: 2019-12-13T13:04:04+05:30 [INFO] ----------------------------------------------------------------------- $
-排除
这用于从依赖关系树输出中删除给定的依赖关系。
该模式与-Dincludes
选项相同。
我们可以使用逗号来指定要包含在依赖树中或者从依赖树中排除的多个模式。
$mvn dependency:tree -Dexcludes=org.junit.jupiter:junit-jupiter-api [INFO] Scanning for projects... [INFO] [INFO] ---------------------------- [INFO] Building Mockito-Examples 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]-------------------------------- [INFO] [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples -- [INFO] com.theitroad.mockito:Mockito-Examples:jar:1.0-SNAPSHOT [INFO] +- org.junit.platform:junit-platform-runner:jar:1.2.0:test [INFO] | +- org.apiguardian:apiguardian-api:jar:1.0.0:test [INFO] | +- org.junit.platform:junit-platform-launcher:jar:1.2.0:test [INFO] | \- org.junit.platform:junit-platform-suite-api:jar:1.2.0:test [INFO] | \- org.junit.platform:junit-platform-commons:jar:1.2.0:test [INFO] +- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test [INFO] | \- org.junit.platform:junit-platform-engine:jar:1.2.0:test [INFO] | \- org.opentest4j:opentest4j:jar:1.1.0:test [INFO] +- org.mockito:mockito-junit-jupiter:jar:2.19.0:test [INFO] | \- org.mockito:mockito-core:jar:2.19.0:test [INFO] | +- net.bytebuddy:byte-buddy:jar:1.8.10:test [INFO] | +- net.bytebuddy:byte-buddy-agent:jar:1.8.10:test [INFO] | \- org.objenesis:objenesis:jar:2.6:test [INFO] \- org.testng:testng:jar:6.14.3:test [INFO] +- com.beust:jcommander:jar:1.72:test [INFO] \- org.apache-extras.beanshell:bsh:jar:2.0b6:test [INFO] ----------------------------------------------------------------------- [INFO] BUILD SUCCESS [INFO] ----------------------------------------------------------------------- [INFO] Total time: 0.925 s [INFO] Finished at: 2019-12-13T13:55:22+05:30 [INFO] ----------------------------------------------------------------------- $
Eclipse IDE中的Maven依赖树
Eclipse pom.xml的" Dependency Hierarchy"选项卡显示了项目的依赖关系树。
它有两个方面–左侧显示详细的输出,右侧显示已解决的依赖关系。
我们可以使用"过滤器"选项来查找特定的依赖项。
Eclipse Pom依赖关系层次结构
进一步阅读:在Eclipse IDE中使用Maven
将依赖树保存到文件
我们可以使用-DoutputFile选项来指定文件以保存依赖关系树的输出。
$mvn dependency:tree -DoutputFile=dependency-tree.txt [INFO] Scanning for projects... [INFO] [INFO] ---------------------------- [INFO] Building Mockito-Examples 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]-------------------------------- [INFO] [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ Mockito-Examples -- [INFO] Wrote dependency tree to: /Users/hyman/Desktop/maven-examples/Mockito-Examples/dependency-tree.txt [INFO] ----------------------------------------------------------------------- [INFO] BUILD SUCCESS [INFO] ----------------------------------------------------------------------- [INFO] Total time: 0.862 s [INFO] Finished at: 2019-12-13T15:27:51+05:30 [INFO] ----------------------------------------------------------------------- $ $cat dependency-tree.txt com.theitroad.mockito:Mockito-Examples:jar:1.0-SNAPSHOT +- org.junit.platform:junit-platform-runner:jar:1.2.0:test | +- org.apiguardian:apiguardian-api:jar:1.0.0:test | +- org.junit.platform:junit-platform-launcher:jar:1.2.0:test | \- org.junit.platform:junit-platform-suite-api:jar:1.2.0:test | \- org.junit.platform:junit-platform-commons:jar:1.2.0:test +- org.junit.jupiter:junit-jupiter-engine:jar:5.2.0:test | +- org.junit.platform:junit-platform-engine:jar:1.2.0:test | | \- org.opentest4j:opentest4j:jar:1.1.0:test | \- org.junit.jupiter:junit-jupiter-api:jar:5.2.0:test +- org.mockito:mockito-junit-jupiter:jar:2.19.0:test | \- org.mockito:mockito-core:jar:2.19.0:test | +- net.bytebuddy:byte-buddy:jar:1.8.10:test | +- net.bytebuddy:byte-buddy-agent:jar:1.8.10:test | \- org.objenesis:objenesis:jar:2.6:test \- org.testng:testng:jar:6.14.3:test +- com.beust:jcommander:jar:1.72:test \- org.apache-extras.beanshell:bsh:jar:2.0b6:test $