java - Maven依赖版本范围

标签 java maven maven-3

我想了解我们的依赖项版本中提到的 [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/

相关文章:

java - 如何关闭 JFrame?

java - 如何使用 div 标签从下拉列表中选择元素

java - 通过数据库模式生成持久性映射后缺少@CreationTimestamp和@UpdateTimestamp

java - 如何加快部署到 Jetty?

maven - 通过命令行执行特定版本的 Maven 插件

maven - Maven 上的依赖冲突

java - Vaadin:创建 TabSheets 的 ArrayList

java - Selenium 服务器未启动

java - 创建 Deployment 时 Kubernetes "fatal alert: protocol_version"错误

Maven程序集拉错了依赖