这是由Maven 2.2.1生成的依赖树
mvn -o dependency:tree -Dverbose -Dincludes=log4j
[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的工作方式。
THX
答案 0 :(得分:56)
我自己在http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html找到了答案:“如果两个依赖版本在依赖关系树中处于相同的深度,直到Maven 2.0.8没有定义哪一个会赢,但是因为Maven 2.0.9这是声明中的顺序:第一个声明获胜“。
这对我来说似乎是一个非常值得怀疑的策略。 : - \
答案 1 :(得分:0)
如果两个依赖项版本在依赖项树中的深度相同,或者如果深度不同,则对项目的封闭程度更高。
有两种解决方案,可以在您知道依赖深度后解决此问题。
首先:如果这些依赖项包含在库中的另一个项目中,则可以手动将其删除,但是您不希望您的项目指出该依赖项是因为最接近您的项目。您可以在项目pom.xml中排除特定项目的jar,如下所示
<dependency>
<groupId>org.cassandraunit</groupId>
<artifactId>cassandra-unit</artifactId>
<version>3.1.3.2</version>
<exclusions>
<exclusion>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</exclusion>
</exclusions>
</dependency>
第二:您可以直接在项目的pom.xml中添加所需版本的jar。那将是最接近您的项目的jar。
使用上述两种方法都可以解决问题。