Interpreting “omitted for conflict” in maven 2 dependency tree
这是Maven 2.2.1使用以下命令生成的依赖关系树
1 2 3 4 5 6 7 8 | [INFO] [dependency:tree {execution: default-cli}] [INFO] com.openboxes.renderingservice:common:jar:1.0 [INFO] +- org.springframework:spring:jar:2.0.4:compile [INFO] | \\- commons-logging:commons-logging:jar:1.1:compile [INFO] | \\- log4j:log4j:jar:1.2.12:compile [INFO] \\- it.mycompany.portal:server:jar:1.5-SNAPSHOT:compile [INFO] \\- org.slf4j:slf4j-log4j12:jar:1.1.0:compile [INFO] \\- (log4j:log4j:jar:1.2.13:compile - omitted for conflict with 1.2.12) |
如您所见,log4j v1.2.12比v1.2.13更受青睐。
我知道" Maven使用最近的获胜策略解决版本冲突"(请参阅http://maven.apache.org/plugins/maven-dependency-plugin/examples/resolving-conflicts-using-the-dependency-tree.html ),但是这两个依赖关系似乎处于相同的距离(两个嵌套级别,对吗?),所以我希望使用最新的一个。
有人可以解释这个结果吗?
是的,log4j没有在此POM中明确声明(我认为应该这样声明),但是我想更好地理解Maven的工作方式。
谢谢
我已经在http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html找到了答案:"如果两个依赖版本在依赖树中的深度相同,直到Maven 2.0.8并没有定义哪个会赢,但是从Maven 2.0.9开始,声明中的顺序才是最重要的:"第一个声明获胜"。
在我看来,这是一个非常可疑的策略。 :-\
如果两个依赖项版本在依赖关系树中的深度相同,或者如果深度不同,则对项目的封闭程度更高。
有两种解决方案可在您知道依赖深度后解决此问题。
首先:如果这些依赖项包含在库中的另一个项目中,则可以手动将其删除,但是您不希望您的项目指向该依赖项,因为它与您的项目最接近。您可以在项目pom.xml中排除特定项目的jar,如下所示
1 2 3 4 5 6 7 8 9 10 11 | <dependency> <groupId>org.cassandraunit</groupId> cassandra-unit</artifactId> <version>3.1.3.2</version> <exclusions> <exclusion> <groupId>org.apache.commons</groupId> commons-lang3</artifactId> </exclusion> </exclusions> </dependency> |
第二:直接在项目的pom.xml中添加所需版本的jar。那将是最接近您的项目的jar。
使用上述两种方法都可以解决问题。