在Maven中,您可以通过dependencyManagement中的条目覆盖传递依赖项的版本号,因为dependencyManagement优先于传递依赖项定义。
但是,(传递)依赖关系中的dependencyManagement定义呢?它们是否被考虑过?如果是这样,它们会覆盖什么,它们如何被覆盖?
答案 0 :(得分:0)
依赖于传递依赖关系poms中的依赖管理定义,只要它们未在项目的dependencyManagement中被覆盖,或者更接近依赖关系(在依赖树中)。
换言之,,
依赖中介:规则很简单
"最近的定义"这意味着它将在依赖树中使用与项目最接近的依赖项版本。
如果两个依赖版本在依赖关系树中处于相同的深度,则第一个声明获胜(声明顺序)。
有关详细信息,请参阅Transitive Dependency
希望这会有所帮助。
答案 1 :(得分:0)
依赖管理隐含着传递性。对此没有必要成为一个特殊规则,而是它已经提到的规则的结果:Transitive Dependencies。
考虑这个示例结构:
A
- 依赖
D
- 传递依赖B
- 依赖
D
- 传递依赖构建A
或B
后,如果未明确指定,则会检查其对应的dependencyManagement
部分以选择D
的版本。 以下是重要部分:当A
或B
用作依赖关系时,使用完全相同的流程来确定它们所依赖的D
版本上。因此,它们不会以任何方式相互影响。
例如,这可能会导致A
取决于D:1.0
,而B
取决于D:1.1
,他们的dependencyManagement
部分已经应用于这一点确定了这一点,不再考虑。使用此信息作为输入,依赖关系中介规则将应用于为您的模块选择一个D
版本。
链接页面中还描述了依赖关系中介规则。但简而言之,最接近的定义胜利,并且基于订单打破关系。当然,模块本身的定义总是最接近的。
现在让我们说你的模块被用作依赖项。由于D:1.2
部分中的定义,您的项目可能依赖于dependencyManagement
基于上述所有规则,但dependencyManagement
的范围结束。
(请注意,import
范围是一个例外,因为它的行为与其他范围完全不同。)