解释maven 2依赖树中的"省略冲突"

Pin*_*ino 34 dependency-management maven

这是由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)
Run Code Online (Sandbox Code Playgroud)

正如您所见,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的工作方式.

谢谢

Pin*_*ino 57

我自己在http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html找到了答案:"如果两个依赖版本在依赖树中处于相同的深度,直到Maven 2.0.8没有定义哪一个会赢,但是自Maven 2.0.9起,它就是声明中的顺序:第一个声明获胜".

这对我来说似乎是一个非常值得怀疑的策略.: - \

  • 这是值得怀疑的,但至少是确定性的. (30认同)
  • https://maven.apache.org/plugins/maven-dependency-plugin/examples/resolving-conflicts-using-the-dependency-tree.html (2认同)

Arp*_*ini 7

如果两个依赖项版本在依赖项树中处于相同深度,或者如果不在同一深度,则更接近项目的项目将指向该项目。

一旦您知道依赖深度,有两种解决方案可以解决这个问题。

首先:如果这些依赖项作为库中另一个项目的一部分包含在内,您可以手动删除它们,但您不希望您的项目指向该依赖项,因为它与您的项目最接近。您可以在项目 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>
Run Code Online (Sandbox Code Playgroud)

第二:直接在项目的pom.xml中添加期望版本的jar。那么这将是距离您的项目最近的 jar。

使用上述两种方法就可以解决问题。