10

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

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

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

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

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

4

4 回答 4

5

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

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

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

于 2012-10-23T08:47:02.287 回答
3

大多数时候这应该没问题,如果 maven 选择了较新的版本。

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

于 2012-10-23T08:47:12.993 回答
2

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

至于您应该怎么做,请参阅我的另一个答案-您应该通过明确配置要使用的版本和要省略的版本来推动修复它们,并且maven-enforcer 插件可以使用DependencyConvergence 规则使其变得更容易。这是为了保护您免受冲突的传递依赖项的影响。

于 2012-10-23T12:12:02.270 回答
0

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

于 2019-11-05T09:15:03.903 回答