gpt4 book ai didi

java - Maven依赖版本范围

转载 作者:行者123 更新时间:2023-11-30 01:42:41 25 4
gpt4 key购买 nike

我想了解我们的依赖项版本中提到的 [3.8.2] 与 3.8.2 之间的区别。

来自here ,

When declaring a "normal" version such as 3.8.2 for Junit, internally this is represented as "allow anything, but prefer 3.8.2." This means that when a conflict is detected, Maven is allowed to use the conflict algorithms to choose the best version. If you specify [3.8.2], it means that only 3.8.2 will be used and nothing else. If somewhere else there is a dependency that specifies [3.8.1], you would get a build failure telling you of the conflict. We point this out to make you aware of the option, but use it sparingly and only when really needed. The preferred way to resolve this is via dependencyManagement.

但我感觉这里有些不对劲。

如果我写<version>3.8.2</version>对于我们的依赖项,并且该版本 Artifact 不存在于我们的 Maven 存储库中,那么它不会选择其他任何内容。构建根本就失败了。那么,为什么上面他们说 - “允许任何东西,但更喜欢 3.8.2。”

此外,他们说 - This means that when a conflict is detected,... 。我无法理解这一点。 3.8.2 中不会出现但 [3.8.2] 中出现的冲突可能是什么?

最佳答案

整个过程如下:

第1步:Maven为你的项目构建依赖关系树,包括你的直接依赖关系、它们的依赖关系、你的依赖关系的依赖关系等等。

第 2 步:现在 Maven 列出了所有节点。如果它仅在一个版本中遇到依赖项(例如 3.8.2 或 [3.8.2]),它将仅选择该版本。

第 3 步:如果 Maven 找到多个版本,魔法就开始了。

  • 如果所有版本都是不带括号的版本(例如 3.8.2),则它会选择依赖调解原则中提到的“最近”版本。

  • 如果您有一些(或全部)版本范围(如 [1.0.0,2.0.0])或固定版本(如 [1.0.0]),那么首先它会找到所有范围的交集/具体版本(请注意,这里不考虑没有括号的版本来查找此交集)。

  • 如果发现此交集为空,则构建失败。如果它不为空,则继续选择“最近”版本/具体版本/版本范围。

  • 如果根据最接近的定义,我们得到版本范围/具体版本,则 Maven 会在找到的版本范围的结果交集中选择最新的可用版本。

  • 如果通过最接近的定义,我们得到一个版本(不是具体版本),那么 maven 会检查该版本是否存在于找到的版本范围的结果交集中。如果是,则选择该版本。如果没有,那么 Maven 会在版本范围的结果交集中选择最新的可用版本(并且不会使构建失败)。

引用“允许任何内容,但更喜欢 3.8.2”充其量只是一种误导。 Maven 不会尝试弥补存储库中缺失的依赖项,它只是在依赖项树中找到多个版本时“调解”版本。

关于java - Maven依赖版本范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59409332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com