在 Maven 中跟踪托管依赖项版本

Posted

技术标签:

【中文标题】在 Maven 中跟踪托管依赖项版本【英文标题】:Tracking managed dependency versions in Maven 【发布时间】:2012-12-28 10:43:20 【问题描述】:

假设我有一个包含大量依赖项的复杂项目。依赖项的版本由许多导入范围 pom 管理。我的项目依赖于工件group:artifact,它依赖于工件group:transitive-dependency。当我运行dependency:tree 时,我看到了这样的内容:

+- group:artifact:jar:1.3
   +- group:transitive-dependency:jar:1.1 (version managed from 1.3)

问题是group:artifact:1.3 需要group:transitive-dependency 1.3 或更高版本。当然,其中一个导入 pom 正在强制使用错误的版本。但是除了搜索所有这些之外,还有什么方法可以知道是哪一个?

【问题讨论】:

您是否尝试过在您的父项目上运行mvn site 并查看dependency convergence 输出? 传递依赖没有出现在依赖收敛报告中。它也没有显示管理依赖项的位置。 【参考方案1】:

您应该尝试使用 maven-enforcer-plugin 并将其配置为执行 DependencyConvergence,例如

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

这将显示哪些***依赖项在其依赖项树中具有不同版本的其他依赖项。然后,您可以使用排除来抑制您不想要的依赖项变体。

【讨论】:

【参考方案2】:

当 2 个或多个父 Pom 与同一个工件发生冲突时会发生这种情况。

例如:

[INFO] |  \- com.rbs.gbm.risk:framework-core:jar:1.6.6:compile
[INFO] |     +- com.rbos.gbm.risk:log4jextensions:jar:2.3:compile (version managed from 2.2)
[INFO] |     +- oro:oro:jar:2.0.8:compile

在我的例子中,framework-core 提到了 log4jextentsions 2.2。我的超级 pom 说 log4jextentsions 2.3。不知何故,框架核心说服 maven 使用 log4jextentsions 2.2。

稍后当我更新 framework-core pom 以使用 2.3 时:

[INFO] |  \- com.rbs.gbm.risk:framework-core:jar:1.6.6:compile
[INFO] |     +- com.rbos.gbm.risk:log4jextensions:jar:2.3:compile
[INFO] |     +- oro:oro:jar:2.0.8:compile

【讨论】:

以上是关于在 Maven 中跟踪托管依赖项版本的主要内容,如果未能解决你的问题,请参考以下文章

如何将 maven 托管依赖项复制到 war\web-inf\lib 中,以便我可以在 Eclipse 中以调试模式运行我的 GWT 2.0 应用程序?

如何在 Maven 中找出隐藏的依赖项和插件版本?

如果使用的 JVM 是 x86 或 x64,则以不同方式解决 Maven 依赖项?

手动检索 Ivy 依赖项作为 sbt 中的本地非托管库

gradle 到 maven 的转换,在依赖项的依赖项的版本名称中解析通配符“+”?

Maven 依赖项 - 版本与更新