当前位置: 首页 > 知识库问答 >
问题:

如何让maven警告迁移依赖版本不匹配?

柯冯浩
2023-03-14

在下面的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>

共有1个答案

司寇安宜
2023-03-14

简而言之,应该使用Maven-执法者-插件来处理这个问题。

您只需要配置enforcer插件,如

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

更详细地说,如留档页面中所述,类似这样的东西具有移动式依赖不匹配:

<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>
 类似资料:
  • 我们有一个项目a依赖于项目B,项目B依赖于图书馆C。a和B是本地项目,而C是maven central repo的公共图书馆。 波姆。xml用于: 波姆。用于B的xml: 在A中运行mvn dependency:tree-Dverbose时,它不会解析B的依赖项,B中使用的此类依赖项也不会显示在A的Maven依赖项中。这对于编译很好,但在运行时会因为NoClassDefFound错误而失败。 有没

  • 问题内容: 在Maven中,依赖关系通常是这样设置的: 现在,如果你正在使用发布频繁的库,则不断更新标记可能会有些烦人。有什么方法可以告诉始终使用最新的可用版本(来自存储库)? 问题答案: 有关更多详细信息,请参见Maven书籍的POM语法部分。或者在Dependency Version Ranges上查看此文档,其中: 方括号([&])表示“封闭”(含)。 括号((&))表示“开放”(排除)。

  • 问题内容: 最近,我一直在研究前一段时间开发的项目中的一些改进,这就是我所发现的。pom文件中的许多依赖项都没有指定版本,但是已经解决了。该项目包含1个根模块和2个子模块。使用了Aggregator模式,这意味着根本没有dependencyManagement部分。上层项目仅聚合了2个模块,仅此而已。子项目并不将其称为父项。他们有不同的父母。我无法理解的是,子项目本身或它们的父项(事实上,它也没有

  • 我用我的真实情况来说明问题。 我使用logback 1.0.1进行日志记录,它包含SLF4J 1.6.4作为依赖项。我还为遗留日志API(Java . util . logging、log4j和commons-logging)使用SLF4J API桥,它们不是显式的依赖关系。这些也必须(最好)是版本1.6.4。 为了使我的pom.xml尽可能整洁和无错误,我想强制这些API桥接器与SLF4J版本相

  • 版本解决失败。错误:无法‘酒吧升级’颤振工具。 在我从GitHub上分出例子之后。我尝试在vscode上运行命令“Get Packages”。酒吧升级--武力和“颤振医生”似乎不再起作用了。我需要帮助。

  • 理想情况下,在我的maven项目中,我只需要https://gist.github.com/kameshsampath/8a4bdc8b22d85bbe3f243fa1b816e464#file-src_main_build-l8-l9,尽管generate_workspace.bzl已经正确地解决了问题,如果我的src/main/build看起来像 但遗憾的是,这会导致大量编译错误,因为传递性D