Bre*_*min 1 java maven-3 maven
我想了解在提到我们的依赖项版本时 [3.8.2] 与 3.8.2 之间的区别。
从这里,
当声明“正常”版本(例如 Junit 的 3.8.2)时,在内部这表示为“允许任何内容,但更喜欢 3.8.2”。这意味着当检测到冲突时,Maven 可以使用冲突算法来选择最佳版本。如果指定[3.8.2],则意味着仅使用3.8.2,而不会使用其他版本。如果其他地方有指定 [3.8.1] 的依赖项,您将收到构建失败消息,告诉您存在冲突。我们指出这一点是为了让您了解该选项,但请谨慎使用,并且仅在真正需要时使用。解决此问题的首选方法是通过 dependencyManagement。
但我感觉这里有些不对劲。
如果我<version>3.8.2</version>
为我们的依赖项编写,并且该版本工件不存在于我们的 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 不会尝试弥补存储库中缺失的依赖项,它只是在依赖项树中找到多个版本时“调解”版本。
归档时间: |
|
查看次数: |
3005 次 |
最近记录: |