冲突的传递依赖关系在 Maven 中是一个严重的问题吗?

Posted

技术标签:

【中文标题】冲突的传递依赖关系在 Maven 中是一个严重的问题吗?【英文标题】:Are conflicting transitive dependencies a serious issue in Maven? 【发布时间】:2012-10-13 03:25:01 【问题描述】:

我有一个项目 X,它在依赖层次结构中显示了很多相互冲突的依赖关系(如 Eclipse 的依赖关系层次结构视图中所示)。我看到很多类似的东西:

clojure: 1.3.0 (omitted for conflict with 1.4.0) [compile]

这通常是因为 X 使用的两个库指定了其他库的两个不同版本 - 即由于共享传递依赖关系而发生冲突。在相当多的情况下,冲突发生在我无法直接控制的 3rd 方库中。

幸运的是,现在一切都构建并运行良好,但我担心这种情况是否会在未来引起问题。

这是我应该担心的问题吗?如果是,我应该怎么做?

【问题讨论】:

自从我的“xml 和 xml 解析器冒险”以来,我试图缓解这些问题,即。至少尝试一下。一个库依赖于另一个版本的一个且仅一个版本,然后将其省略,因为另一个库需要同一库的更新版本,这感觉就像是执行良好的踢球。我通常会尝试管理冲突的 3rd 方库的版本。尽管我不得不承认它并不总是有效。或者好好工作。 【参考方案1】:

是的,这样的冲突可能很严重。

在比较不同版本时,您不知道依赖项中是否存在不兼容的变化(比较次要版本时不应该存在,但谁知道具体呢?)。或者,某些依赖项可能依赖于另一个依赖项的错误行为。如果这个bug已经修复了怎么办?那个依赖于 bug 的模块将无法正常执行。

您应该排除冲突的依赖项(更有可能排除较低版本)。对于您输入的每个排除项,您必须检查排除的版本与当前使用的版本之间是否存在不兼容的更改。如果是这种情况,您必须检查依赖于该模块的依赖项,如果它们受到此类更改的影响。

【讨论】:

【参考方案2】:

如果 maven 选择了较新的版本,大多数情况下应该没问题。

您应该开始担心是否与主要版本(第一个数字)的差异发生冲突,或者是否忽略了较新的版本。单元测试对捕捉这些问题有很大帮助,但 eclipse 项目和 maven 依赖项通常以微妙的方式存在差异(调试范围等)。唯一真正的保护似乎是集成测试。

【讨论】:

【参考方案3】:

可能是一个严重的问题,因为你永远无法确定到底发生了什么,这很糟糕。我认为使用 maven 配置的重点是明确说明发生了什么以及使用了哪些依赖项。

至于你应该怎么做,请参阅我的other answer - 你应该通过明确配置要使用的版本和省略的版本来推动修复它们,maven-enforcer plugin 可以使它更容易DependencyConvergence rule。这样可以保护您免受冲突的传递依赖项的影响。

【讨论】:

【参考方案4】:

是的,这是一个问题。通常不同的版本包含相同的类。最后,java 只加载该类的一个版本。它可能是旧版本或新版本。它可能会导致运行时错误,如神秘的 NoSuchMethodError、ClassNotFoundExceptions 等。

【讨论】:

以上是关于冲突的传递依赖关系在 Maven 中是一个严重的问题吗?的主要内容,如果未能解决你的问题,请参考以下文章

Maven依赖传递依赖传递排除依赖冲突

maven的依赖传递及冲突

Maven依赖jar包版本冲突解决方案

04_项目一众筹00_05Maven依赖概念,依赖范围依赖传递性依赖的原则:解决jar包冲突依赖排除统一版本管理

Maven工程jar包冲突解决方法

maven-传递依赖和依赖冲突版本解决