【问题标题】:Maven: how to handle conflicting dependenciesMaven:如何处理冲突的依赖关系
【发布时间】:2017-04-10 18:34:05
【问题描述】:

我想(必须)使用两个相邻的 maven 依赖项“Y”和“G”,而它们与不同的版本共享相同的依赖项。 默认情况下,旧版本将被新版本覆盖。但是,这会破坏性能。 如何隔离这两个依赖项并确保它们使用正确的依赖项?

【问题讨论】:

  • they share the same dependency with different versions for X?
  • Y 和 G 是否在 OSGi 容器中运行?如果不是这样是不可能的......我认为你的意思是一个图书馆?
  • @Vishrant 如图,我的项目是X,classpath中有两个版本的artifact Z。
  • @khmarbaise "with software 我假设你的意思是一个库" --> 是的,两个 maven 依赖项。

标签: java maven


【解决方案1】:

默认情况下,旧版本将被新版本覆盖。

这不是真的。默认情况下,Maven 在解决相同依赖项的冲突版本时使用最近定义策略。它不一定需要新版本。这意味着依赖关系树中较高级别的 POM 声明的版本会覆盖较低级别 POM 中声明的版本。如果两个版本处于同一级别(如您的图表中的情况),则采用第一个声明的版本。

强制使用特定版本的依赖项的最佳方法是在 dependencyManagement 部分内的父 POM 中显式定义 dependency

<dependencyManagement>
   <dependencies>
       <dependency>
          <groupId>groupId-z</groupId>
          <artifactId>dependency-z</artifactId>
          <version>1.0</version>
       </dependency>
    ...

那么所有的子项目及其依赖都会自动使用指定的版本。

有关 Maven 中依赖冲突解决的更多详细信息,请参阅this page

【讨论】:

  • 我明确提到过,我不希望所有的依赖项(这里是 Y 和 G)都使用相同版本的第三个库(这里是 Z)。相反,我希望每个人都使用其正确的版本。
  • 这根本不可能,除非您采取解决方法。如果类共享同一个包,也可能导致类不兼容问题。我能找到的最接近的是stackoverflow.com/questions/27147660/…
【解决方案2】:

假设“X”是一个同时依赖于 Y 和 G 的模块,那么答案取决于它的运行方式。例如:如果 X 是一个包含 Y 和 G 的 WAR,那么您将无法拥有同一依赖项的两个不同版本,否则您将遇到类加载问题。

因此,当 Y 和 G 独立使用时,您能否在它们自己的 POM 中明确声明正确的版本,但在并排使用时将其覆盖为必要的共享版本?

【讨论】:

    猜你喜欢
    • 2020-01-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 2013-06-24
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    相关资源
    最近更新 更多