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

maven enforcer插件在可传递依赖项中标记dependencyConvergence错误

濮阳浩穰
2023-03-14

场景:我的项目启用maven enforcer插件依赖收敛规则。它依赖于一个库,该库通过使用dependencyManagement声明更正了自己的依赖项收敛,但它似乎不会影响下游依赖项版本的解析。

我正在谈论的错误消息类型的示例(请注意,这两个版本都被d继承为c模块下的传递依赖项):

Dependency convergence error for org.apache.commons:commons-lang3:3.0 paths to dependency are:
+-com.example:d:1.0-SNAPSHOT
  +-com.example:c:1.0-SNAPSHOT
    +-com.example:b:1.0-SNAPSHOT
      +-org.apache.commons:commons-lang3:3.0
and
+-com.example:d:1.0-SNAPSHOT
  +-com.example:c:1.0-SNAPSHOT
    +-org.apache.commons:commons-lang3:3.1

mvn依赖:tree显示类似的不一致。c管理了传递版本:

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ c ---
[INFO] com.example:c:jar:1.0-SNAPSHOT
[INFO] +- com.example:b:jar:1.0-SNAPSHOT:compile
[INFO] |  \- (org.apache.commons:commons-lang3:jar:3.1:compile - version managed from 3.0; omitted for duplicate)
[INFO] \- org.apache.commons:commons-lang3:jar:3.1:compile

但是d将其显示为冲突:

[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ d ---
[INFO] com.example:d:jar:1.0-SNAPSHOT
[INFO] \- com.example:c:jar:1.0-SNAPSHOT:compile
[INFO]    +- com.example:b:jar:1.0-SNAPSHOT:compile
[INFO]    |  \- (org.apache.commons:commons-lang3:jar:3.0:compile - omitted for conflict with 3.1)
[INFO]    \- org.apache.commons:commons-lang3:jar:3.1:compile

这似乎是一个潜在的无休止的问题。如果我在d中使用dependencyManagement来纠正它,那么我只是把问题推到d的任何消费者的下游。我可以通过排除c项目pom中的可传递依赖项来避免错误,但这就是为什么我在c中有dependencyManagement声明!

我认为这是Maven中的错误,或者可能是执法者插件中的错误。我错过了什么吗?处理这种情况的正确方法是什么?

这是一个案件吗http://jira.codehaus.org/browse/MNG-3038(从2007年开始营业!)?在我的例子中,依赖关系在路径上随处可见。

共有1个答案

寇涵容
2023-03-14

你是对的,这将是一个潜在的无休止的问题。这是因为您没有修复组件“b”中的依赖关系。管理“c”或“d”中的依赖项并不能消除问题:组件“b”可能会与较新版本发生冲突,甚至可能包含commons lang:3.0。在后一种情况下,您的类路径中有两个不同版本的commons lang,如果您的应用程序工作正常,那就太幸运了。

 类似资料:
  • 关于maven和传递依赖排除有几个问题。然而,我不能让它工作。我的pom中有一些依赖项,它们重新打包了一些库,以减小pom的大小。到目前为止,这是成功的。但是当我运行时,这些可传递的依赖项会被写入。类路径文件。尽管它们被排除在外,如以下摘录所示。 Apache Maven 3.3.3(7994120775791599e205a5524ec3e0dfe41d4a06;2015-04-22T13:57

  • 我在Scala项目中使用了官方的Gatling Gradle插件,我发现了一个问题,其中包含了依赖项,如 不包括可传递依赖项。也就是说,我有一个Gatling模拟类,它扩展了中的一个类,而依赖于这个类。但是,当我尝试运行模拟时,会出现如下错误 当我查看Gradle依赖时,我将视为的依赖项。我的IDE(IntelliJ)在点击代码时也能识别它。 我试着在一页文档中搜索这个插件,但是我没有看到任何有用

  • 我们目前正在开发一个Grails插件,该插件旨在成为几个不同应用程序的共享库。该插件围绕GORM和缓存进行管理,因此,它包括hibernate插件和cache和cache-ehcache插件。Hibernate和cache-ehcache插件都希望导入ehcache核心jar依赖项,但版本不同。我想要的ehcache核心版本是cache-ehcache插件中的版本,因此我已经配置了BuildCon

  • 我刚刚将我的项目升级到gradle 7,并且遇到了缺失的可传递依赖项。我试着改变我的身材。gradle文件在依赖项中使用“api”,但这并没有修复它。 projectA依赖于projectB,projectB依赖于projectC。 projectA-build。格拉德尔 projectB-构建。格拉德尔 ProjectA编译良好,但有运行时错误-从project ectC获取类的ClassNot

  • 我给ivy添加了一个依赖项(我们称之为a)。在maven central中具有pom文件的xml。Ivy使用ibiblio来解析maven依赖项。添加到常春藤中的依赖项(A)。xml具有可传递依赖项(B)。到目前为止,一切都很好。传递依赖(B)的依赖(C)不能用常春藤来解决。 我在常春藤上定义了一个新的名字。如下所示的xml: 在B的pom文件中,C在编译和测试范围中定义如下: 当我在ivy的缓存

  • Maven正在过渡地使用guava的第16版,尽管我有一个 快速总结: 取决于 有一个父pom,