解释;因冲突而省略“;在maven 2依赖树中

解释;因冲突而省略“;在maven 2依赖树中,maven,dependency-management,Maven,Dependency Management,这是Maven 2.2.1使用 mvn-o依赖项: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-

这是Maven 2.2.1使用
mvn-o依赖项: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)
如您所见,log4jv1.2.12优于v1.2.13

我知道“Maven使用最近的wins策略解决版本冲突”(请参阅),但这两个依赖项似乎处于相同的距离(两个嵌套级别,我错了吗?),因此我希望使用最新的一个

有人能解释这个结果吗

是的,log4j没有在这个POM中明确声明(我认为应该是这样),但是我想更好地理解Maven的工作方式


Thx

我自己在以下位置找到了答案:“如果两个依赖版本在依赖树中处于同一深度,直到Maven 2.0.8,还没有定义哪一个会赢,但由于Maven 2.0.9,重要的是声明中的顺序:第一个声明赢”


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

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

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

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

org.cassandraunit
卡桑德拉单位
3.1.3.2
org.apache.commons
commons-lang3
Second:您可以直接将预期版本的jar添加到项目的pom.xml中。那么这将是最接近您的项目的jar


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

这是有问题的,但至少是确定的。谢谢!有依赖性问题。。改变了顺序,现在开始工作了