如果存在依赖冲突,如何打破maven构建?

时间:2010-12-22 19:47:44

标签: maven-2 maven dependency-management maven-3

我为项目运行了mvn dependency:tree,我看到了如下输出:

[INFO] my:project:jar:1.0.0-SNAPSHOT
[INFO] +- some.other:library:jar:2.0.0:compile
[INFO] |  \- org.slf4j:slf4j-api:jar:1.6.1:compile
[INFO] +- org.slf4j:slf4j-simple:jar:1.6.0:compile
[INFO] |  \- (org.slf4j:slf4j-api:jar:1.6.0:compile - omitted for conflict with 1.6.1)

这是一个糟糕的状态因为我的项目直接依赖于slf4j 1.6.0而且我们依赖的某些库依赖于slf4j 1.6.1。这两个版本恰好是二进制兼容的,因此构建过程没有任何警告。 有没有办法让Maven对其依赖性解析更加严格,以便我可以配置一个在这种情况下会失败的新版本?在这种情况下,解决方案是将我们的依赖关系更新为更新版本的slf4j。

2 个答案:

答案 0 :(得分:22)

maven-enforcer-plugin具有dependencyConvergence配置,可以满足我的需求。巧合的是,文档中的示例使用了slf4j。

像这样配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <version>1.0</version>
    <executions>
        <execution>
            <id>enforce</id>
            <configuration>
                <rules> 
                    <DependencyConvergence />
                </rules>
            </configuration>
            <goals> 
                <goal>enforce</goal>
            </goals>
        </execution>
    </executions>
</plugin>

这种依赖关系的组合将导致构建失败:

  <dependencies>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-jdk14</artifactId>
      <version>1.6.1</version>
    </dependency>
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-nop</artifactId>
      <version>1.6.0</version>
    </dependency>
  </dependencies>  

在编译期间记录此内容:

[ERROR]
Dependency convergence error for org.slf4j:slf4j-api:1.6.1 paths to dependency are:
+-org.myorg:my-project:1.0.0-SNAPSHOT
  +-org.slf4j:slf4j-jdk14:1.6.1
    +-org.slf4j:slf4j-api:1.6.1
and
+-org.myorg:my-project:1.0.0-SNAPSHOT
  +-org.slf4j:slf4j-nop:1.6.0
    +-org.slf4j:slf4j-api:1.6.0

答案 1 :(得分:7)

虽然过时了,但我认为this SO discussion是相关的。