在Maven中,如何解决为什么拾取错误版本的工件的问题?

时间:2018-11-22 09:33:28

标签: maven-3

我正在使用Maven构建项目。 它使用了某个库ISNULL(),而库又使用库A

但是,当我执行B_v2时,我看到使用了lib mvn dependency:tree。我不希望这种情况现在发生,因为我在运行时遇到了未经测试的lib B v1 + A组合。

显然,这是因为解决了lib版本并使用了B_v1后,又赢得了另一个工件。

我想知道哪个工件“获胜”并强制使用B_v1(所以我也可以修复此工件以使用B_v1

它必须是B_v2中的工件之一,但是其中有很多。

1 个答案:

答案 0 :(得分:0)

这是Maven用于解决依赖项的策略,如Introduction to the Dependency Mechanism中所述:

  
      
  • 依赖关系中介-确定遇到多个版本作为依赖关系时,将选择工件的哪个版本。 Maven选择了“最近的定义”。也就是说,它使用依赖关系树中最接近您的项目的版本。您始终可以通过在项目的POM中明确声明版本来保证版本。请注意,如果两个依赖关系版本在依赖关系树中的深度相同,则第一个声明将获胜。

         
        
    • “最近的定义”表示所使用的版本将在依赖关系树中最接近您的项目。例如,如果将A,B和C的依赖关系定义为A-> B-> C-> D 2.0和A-> E-> D 1.0,则在构建A时将使用D 1.0,因为从A出发的路径通过E到D的时间更短。您可以在A中向D 2.0显式添加一个依赖项,以强制使用D 2.0。
    •   
  •   

默认情况下,mvn dependency:tree不会列出由于版本冲突而忽略的依赖项,只要B在{{1中具有相同的groupIdartifactId }}和v1,它应该只出现一次:“赢了”的工件。 (您可以使用v2查看所有省略的依赖项,并标记为此类。)