【问题标题】:Maven best practices: Explicit child dependencies vs transitiveMaven 最佳实践:显式子依赖与传递
【发布时间】:2015-03-10 13:04:59
【问题描述】:

我有一个 parent-pom.xml,它声明了一个依赖 A v1.0,它在 <dependencyManagement> 部分中传递依赖于 B v1.0。

我的 child-pom.xml 在 <dependencies> 部分引用了 A v1.0。但是,子项目的代码也使用了依赖 B v1.0 中的类。

子项目的代码编译和运行没有显式引用 B v1.0,因为 Maven 通过 A v1.0 传递解析它。在<dependencies> 部分中未明确引用 B v1.0 的缺点是什么?

【问题讨论】:

标签: maven maven-3


【解决方案1】:

好吧,假设您想将 A 升级到 v1.1,并且此版本不再使用 B,或者使用具有不同 API 的 B v2.0。这样做会破坏您的代码,因为它依赖于不再存在的东西 (B v1.0)。

另一方面,如果您明确指定在子项目中使用 B,那么您最终会得到以下两个选项之一:

  • 一切正常,因为您仍然依赖 B v1.0,并且您正在使用的 A 的任何代码路径实际上都没有使用不兼容的 B 的东西。
  • 您对 A 的依赖关系已损坏,但通过查看依赖关系树并确定 B 的版本已被修改,可以很容易地发现这一点。然后,您可以选择降级您的 A 依赖项,升级您的代码以使用新的 B(如果需要),甚至使用 OSGi 来减少对同一包的不兼容版本的使用。

【讨论】:

  • 但是,如果我在我的子 pom 中明确定义对 B v1.0 的依赖并将 A 升级到使用 B v2.0 的 v1.1,我可能会破坏 A v1.1 代码。因此,依赖瞬态依赖项可能会破坏我的代码(如您所建议的)并且使用显式依赖项可能会破坏 A v1.1。如果在 A v1.1 升级中对 B 的依赖消失了,那么我的代码将不再编译,我可以很快发现。所以,我仍然没有看到明显的好处。事实上,瞬态依赖似乎是有益的,因为它们破坏了我可以快速修复的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 2020-08-07
  • 2011-06-11
  • 2010-12-11
  • 2012-10-09
  • 2019-08-23
相关资源
最近更新 更多