Maven:如何处理冲突的依赖关系

时间:2017-04-10 18:34:05

标签: java maven

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

enter image description here

2 个答案:

答案 0 :(得分:1)

  

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

事实并非如此。默认情况下,Maven在解析相同依赖项的冲突版本时使用最近定义策略。它不一定采用新版本。这意味着依赖关系树中更高级别的POM声明的版本将覆盖在较低级别POM中声明的版本。如果两个版本在同一级别上,如图中的情况那样,将首先声明一个版本。

强制特定版本依赖项的最佳方法是在dependency部分的父POM中明确定义dependencyManagement

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

然后,所有子项目及其依赖项将自动使用指定的版本。

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

答案 1 :(得分:0)

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

因此,您是否可以在他们自己的POM中明确声明Y和G的正确版本,以便在它们被单独使用时将其覆盖为必要的共享版本?