Maven 解析依赖项的版本

11
如果一个模块的两个依赖都有一个共同的依赖项,但在它们各自的pom文件中指定了不同版本的依赖项,那么在构建该模块时将使用哪个版本?
例如:
        Artifact-A
        /       \
       /         \
      /           \
Artifact-B      Artifact-C
      \           /
 1.6.0 \         / 1.8.0
        \       /
        Artifact-D

在下面详细描述的情况中,Artifact-A会使用哪个版本的Artifact-C?

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

如果您能提供或链接到一份关于Maven如何解析这些版本的简明说明,那就太好了。


请参阅:https://dev59.com/sG015IYBdhLWcg3w_Aug - Binkan Salaryman
1个回答

8
请参阅依赖机制介绍

使用传递性依赖项后,包含的库图形可能会快速增长。因此,有一些额外的功能将限制包含哪些依赖关系:

  • 依赖关系调解 - 在遇到一个组件的多个版本时,这将确定使用哪个版本的依赖项。目前,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,因为通过E从A到D的路径更短。您可以在A中显式添加对D 2.0的依赖关系以强制使用D 2.0

这意味着对于您的第一个示例(自Maven 2.0.9开始),如果在A中将组件B声明为依赖项,然后再声明组件C如下:

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

那么,项目B中声明的依赖项D将被选择。


我不理解声明中的顺序是什么意思,您能解释一下在第一个示例中如何选择依赖项吗? - Chamila Wijayarathna
1
@ChamilaWijayarathna 更新了答案的最后一部分。 - M A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接