在 Maven 中,您可以通过dependencyManagement 中的条目覆盖传递依赖的版本号,因为dependencyManagement 优先于传递依赖定义。
但是(传递)依赖项的 poms 中的 dependencyManagement 定义呢?他们有考虑吗?如果是这样,它们覆盖了什么,它们是如何覆盖的?
在 Maven 中,您可以通过dependencyManagement 中的条目覆盖传递依赖的版本号,因为dependencyManagement 优先于传递依赖定义。
但是(传递)依赖项的 poms 中的 dependencyManagement 定义呢?他们有考虑吗?如果是这样,它们覆盖了什么,它们是如何覆盖的?
依赖管理被暗示是可传递的。不需要为此制定特殊规则,而是已经提到的规则的结果:传递依赖。
考虑这个示例结构:
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
范围是一个例外,因为它的行为与其他范围完全不同。)
只要在项目的 dependencyManagement 或更接近的依赖项(在依赖项树中)中没有覆盖传递依赖项的 pom 中的dependencyManagement 定义,它们就会被考虑。
换句话说,
依赖调解:规则很简单
“最近的定义”,这意味着它将使用依赖关系树中与您的项目最接近的依赖关系的版本。
如果两个依赖版本在依赖树中的深度相同,则第一个声明获胜(声明顺序)。
有关更多详细信息,请参阅传递依赖
希望这可以帮助。