【问题标题】:Behaviour of Gradle/Maven for circular dependenciesGradle/Maven 的循环依赖行为
【发布时间】:2016-06-17 21:47:18
【问题描述】:

我目前正在使用我们的“非 Maven”jar 填充 Maven 存储库,以便 Maven/Gradle 中的未来项目可以使用它们。不幸的是,我们在“非 Maven”项目中有一些循环依赖。我现在的问题是,如果遇到 Maven 或 Gradle 会发生什么

  • 真正的循环依赖,比如 foo-1.0.0.jar -> bar-1.0.0-jar -> foo-1.0.0.jar

  • foo-3.0.0.jar 使用 bar-2.0.0.jar 和 bar-2.0.0.jar 使用 foo-1.0.0.jar 的“旧版本圈”。

这不是关于构建 foo.jar 或 bar.jar,而是关于构建依赖于 foo.jar 或 bar.jar 的项目。

【问题讨论】:

标签: maven gradle circular-dependency


【解决方案1】:

真正的循环依赖会导致错误:Maven 将直接使构建失败。当您临时依赖与当前项目具有相同Maven coordinates 的工件时,就会发生循环依赖:groupIdartifactIdversionpackagingclassifier。通常,我们在处理 jar 时没有分类器,因此具有相同的 groupIdartifactIdversion 通常定义了循环依赖。

旧版本的圆不是圆本身,因为 Maven 坐标不一样。在这种情况下,Maven 将通过应用dependency mediation 来保留较新的版本:

这意味着它将使用依赖关系树中与您的项目最接近的依赖项的版本


正如khmarbaise 指出的那样,如果即使在旧版本圈的情况下您也希望构建失败,您可以配置maven-enforcer-plugin 以使用banCircularDependencies 额外规则来禁止它。

【讨论】:

  • 那么回到当前项目是否只是一个圆圈?依赖关系中的圈子呢? my-project 依赖于 foo.jar 依赖于 bar.jar 依赖于 foo.jar。
  • @JFMeier 在依赖项中不能有一个圆圈:它一开始就无法构建:)
  • 如果它不是首先使用 Maven/Gradle 构建的,则不是这样。我正在将旧 jar 转移到存储库并为它们生成 POM。
  • @JFMeier 好吧,如果您手动编写 POM 并明确引入循环依赖,我 认为 Maven 也会失败,但我承认我以前从未这样做过.如果没有,那将是相当令人惊讶的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
相关资源
最近更新 更多