Maven最佳实践:显式子依赖与可传递

Maven最佳实践:显式子依赖与可传递,maven,maven-3,Maven,Maven 3,我有一个parent-pom.xml,它声明了一个依赖关系a v1.0,该依赖关系在部分中可传递地依赖于B v1.0 My child-pom.xml在部分引用了v1.0。但是,子项目的代码也使用依赖关系B v1.0中的类 子项目的代码在编译和运行时没有显式引用bv1.0,因为Maven通过v1.0可传递地解析它。在一节中没有明确引用B v1.0有什么缺点?好吧,假设您想将A升级到v1.1,并且该版本不再使用B,或者使用具有不同API的B v2.0。这样做会破坏代码,因为它依赖于不再存在的东西(

我有一个parent-pom.xml,它声明了一个依赖关系a v1.0,该依赖关系在
部分中可传递地依赖于B v1.0

My child-pom.xml在
部分引用了v1.0。但是,子项目的代码也使用依赖关系B v1.0中的类


子项目的代码在编译和运行时没有显式引用bv1.0,因为Maven通过v1.0可传递地解析它。在
一节中没有明确引用B v1.0有什么缺点?

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

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

  • 一切都很好,因为您仍然依赖于bv1.0,并且您使用的A的代码路径中没有一个实际使用了与B不兼容的东西
  • 您对A的依赖关系被破坏了,但是通过查看依赖关系树并确定B的版本已被破坏,可以很容易地发现这一点。然后,您可以选择降级回A依赖项,升级代码以使用新的B(如果需要),甚至可以使用OSGi来减少对同一软件包的不兼容版本的使用

然而,如果我在我的孩子pom中明确定义了对B v1.0的依赖,并将A升级到使用B v2.0的v1.1,我可能会破坏v1.1代码。因此,依赖暂时依赖可能会破坏我的代码(正如您所建议的),而使用显式依赖可能会破坏v1.1。如果对B的依赖在v1.1升级中消失,那么我的代码将不再编译,我可以很快发现。所以,我仍然没有看到明显的好处。事实上,暂时依赖似乎是有益的,因为它们破坏了我可以快速修复的代码