Maven解析依赖项的版本

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

例如

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

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

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

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

请参阅依赖机制简介 :

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

  • 依赖关系中介 – 确定在遇到多个版本的工件时将使用哪个版本的依赖关系。 目前,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中的依赖项,如下所示:

  groupB projectB   groupC projectC  

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