2017-04-10 139 views
0

我想(必须)使用两个Maven依赖关系“Y”和“G”彼此相邻,而它们与不同版本共享相同的依赖关系。 默认情况下,旧版本将被新版本覆盖。然而,这会破坏性能。 如何分离这两个依赖关系并确保它们使用它们的适当依赖关系?Maven:如何处理冲突的依赖关系

enter image description here

+0

'它们与X的不同版本共享相同的依赖关系? – Vishrant

+0

Y和G是否在OSGi容器内运行?如果没有,这是不可能的...与软件我假设你的意思是图书馆? – khmarbaise

+0

@Vishrant如图所示,我的项目是X,classpath中有两个版本的工件Z. – Daniel

回答

1

默认行为,旧版本将会被新的所覆盖。

这是不正确的。默认情况下,Maven在解决相同依赖关系的冲突版本时使用最接近的定义策略。它不一定需要新版本。这意味着由依赖关系树中较高级别的POM声明的版本将覆盖在较低级别的POM中声明的版本。如果两个版本处于同一级别,就像图中的情况一样,首先声明的版本将被采用。

迫使依赖特定版本的最好方法是显式定义在父POM一个dependency一个dependencyManagement段内:

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

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

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

+0

我明确提到过,我不希望所有的依赖项(这里是Y和G)使用第三个库(这里是Z)的相同版本。相反,我希望每个人都使用它的正确版本。 – Daniel

+0

除非您采取变通方法,否则这根本无法实现。如果类共享相同的包,它可能会导致类不兼容问题。最近我可以找到相关的是http://stackoverflow.com/questions/27147660/maven-project-depending-on-two-versions-of-the-same-artifact。 – manouti

0

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

难道你不能在他们独立使用的时候明确地为他们自己的POM中的Y和G声明正确的版本,但是当它们被并排使用时,将它覆盖到必要的共享版本上吗?