我正在使用Maven构建项目。
它使用了某个库ISNULL()
,而库又使用库A
。
但是,当我执行B_v2
时,我看到使用了lib mvn dependency:tree
。我不希望这种情况现在发生,因为我在运行时遇到了未经测试的lib B v1
+ A
组合。
显然,这是因为解决了lib版本并使用了B_v1
后,又赢得了另一个工件。
我想知道哪个工件“获胜”并强制使用B_v1
(所以我也可以修复此工件以使用B_v1
)
它必须是B_v2
中的工件之一,但是其中有很多。
答案 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中具有相同的groupId
和artifactId
}}和v1
,它应该只出现一次:“赢了”的工件。 (您可以使用v2
查看所有省略的依赖项,并标记为此类。)