【问题标题】:Maven pom: soft vs hard version requirement specificationMaven pom:软与硬版本要求规范
【发布时间】:2017-04-23 16:44:59
【问题描述】:

在 Maven POM Reference 中,在 Dependency version requirement specification 章节下,softhard 要求有所不同:

1.0:对 1.0 的“软”要求(只是建议,如果它与依赖项的所有其他范围匹配)
[1.0]:对 1.0 的“硬”要求

所以如果我写:

<version>1.0.0</version>

我正在表达一个要求,同时:

<version>[1.0.0]</version>

我需要一个硬的。

虽然我了解所有其他版本说明符的解释(在this 问题中也有很好的解释),但我无法理解这种差异。

我想一个硬性要求意味着:如果没有可用的1.0.0 版本,则无法满足该依赖关系;但什么是软的?这是否意味着即使1.01.0.0.1 也适合这种依赖关系?还是意思完全不同?

注意:我总是使用软依赖规范,我之所以这么问,是因为我有兴趣了解其中的区别,而不是在使用其中一种或另一种之间进行选择。

【问题讨论】:

    标签: maven dependencies pom.xml


    【解决方案1】:

    如果您在项目中声明运行时依赖项,Maven 需要决定应该使用哪个版本。理想情况下,具有声明版本号的工件可用,仅此而已。

    但通常你依赖于几个依赖项。而这些依赖本身依赖于其他依赖(称为'transitive dependencies')。在这种情况下,可能会从不同版本的不同库中请求依赖项(例如日志框架)。在这种情况下,Maven 必须“解决”依赖关系(以避免在类路径上具有不同版本的相同库)。为此,Maven 遵循一个策略,“推荐”版本可能会因为依赖解析策略而被其他版本否决(参见示例 here)。

    但我猜 Maven 只会否决“软”版本而不是“硬”版本。因此,如果您的依赖关系树中有两个不同的“硬”版本,则无法解决冲突并且构建将失败。

    根据我的经验,我可以告诉您“硬”版本号很少使用(我现在不知道任何示例)。只需使用专用的“软”版本,不要使用版本范围(这将使您的构建不再可重现)。


    顺便说一句,你可以在 Sonatype Book 中找到非常相似的解释:Maven: The Complete Reference - Chapter 3.4.3: Dependency Version Ranges

    在为 Junit 声明“正常”版本(例如 3.8.2)时,在内部 这表示为“允许任何内容,但更喜欢 3.8.2”。这意味着 即当检测到冲突时,允许 Maven 使用该冲突 算法来选择最佳版本。如果你指定 [3.8.2],它 意味着只会使用 3.8.2 而不会使用其他任何东西。如果在别的地方 有一个指定 [3.8.1] 的依赖项,你会得到一个构建 没有告诉你冲突。

    【讨论】:

    • 与其猜测,测试会发生什么不是很容易吗?
    • 我不是在寻找关于我应该使用哪一个的建议;我已经编辑了我的问题,感谢您让我意识到这一点。
    • 忘记我的推荐 - 这只是奖金;-)。我想我解释了其余的(“软”意味着可否决),是的 - 它应该很容易测试。
    猜你喜欢
    • 2015-08-02
    • 2020-12-11
    • 2020-12-28
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    相关资源
    最近更新 更多