【问题标题】:How to get maven to warn about transative dependency version mismatches?如何让 maven 警告交互依赖版本不匹配?
【发布时间】:2012-10-11 07:12:36
【问题描述】:

在下面的示例 Maven 依赖项中,slf4j 依赖项想要拉入 log4j 1.2.17,而 log4j 显式依赖项想要拉入 1.2.15。 Maven 将 log4j 解析为版本 1.2.15 但是,没有警告表明 Maven 会打印出 sl4j 需要更高版本的 log4j。

如何让 Maven 对这些类型的冲突发出警告,而不是默默地接受 1.2.15版本?

<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-log4j12</artifactId>
  <version>1.7.2</version>
</dependency>
<dependency>
  <groupId>log4j</groupId>
  <artifactId>log4j</artifactId>
  <version>1.2.15</version>
</dependency>

【问题讨论】:

    标签: maven maven-3


    【解决方案1】:

    简而言之,应该使用Maven-enforcer-plugin 来处理这个问题。

    你只需要像这样配置强制插件

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

    更详细地说,如documentation page 中所述,类似这样的东西存在交互依赖不匹配:

    <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>  
    

    在没有强制执行规则的情况下会默默地“工作”,但是在设置了规则后,它会在构建失败时失败

    Dependency convergence error for org.slf4j:slf4j-api1.6.1 paths to dependency are:
    
    [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
    

    因此,当用户收到有关构建失败的错误消息时,她可以通过排除来修复它,例如

    <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>
      <exclusions>
        <exclusion>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-08
      • 2013-01-08
      • 2020-10-17
      • 2016-09-18
      • 2020-07-26
      • 2019-01-24
      • 2016-12-24
      • 2016-07-19
      相关资源
      最近更新 更多