Maven解析依赖项的版本

时间:2015-06-18 11:10:01

标签: java maven

如果模块的两个依赖关系都有一个共同的depdnendency但在poms中指定了不同的版本,那么在构建模块时会使用哪个版本?

例如

        Artifact-A
        /       \
       /         \
      /           \
Artifact-B      Artifact-C
      \           /
 1.6.0 \         / 1.8.0
        \       /
        Artifact-D

同样在下面详述的场景中,Artifact-C将使用什么版本的Artifact-C?

    Artifact-A
        |      \
        |       |
        |       |
    Artifact-B  | 1.60.0
        |       |
 1.62.0 |       |
        |      /
    Artifact-C

如果您可以提供或链接到maven如何解析这些版本的简明探索。

1 个答案:

答案 0 :(得分:8)

请参阅Introduction to the Dependency Mechanism

  

通过传递依赖关系,包含的库的图形可以快速增长。出于这个原因,还有一些额外的功能将限制包含哪些依赖项:

     
      
  • 依赖关系中介 - 这决定了在遇到多个版本的工件时将使用哪个版本的依赖项。目前,Maven 2.0仅支持使用“最接近的定义”,这意味着它将在依赖树中使用与项目最接近的依赖项版本。您可以通过在项目的POM中明确声明它来保证版本。 请注意,如果两个依赖版本在依赖关系树中处于相同的深度,那么直到Maven 2.0.8没有定义哪一个会赢,但是从Maven 2.0.9开始,它就是声明中的顺序:第一个宣言胜利。      
        
          
    • “最近定义”表示所使用的版本将是依赖树中与项目最接近的版本,例如。如果A,B和C的依赖关系被定义为A - >; B - > C - > D 2.0和A - > E - > D 1.0,然后在构建A时将使用D 1.0,因为从A到D到E的路径更短。您可以在A中向D 2.0显式添加依赖项以强制使用D 2.0
    •     
      
  •   

这意味着对于您的第一个示例(并启动Maven 2.0.9),如果工件B在工件C之前被声明为A中的依赖项,如下所示:

<dependency>
   <groupId>groupB</groupId>
   <artifactId>projectB</artifactId>
</dependency>
<dependency>
   <groupId>groupC</groupId>
   <artifactId>projectC</artifactId>
</dependency>

然后选择在项目B中声明的依赖关系D.