在Maven POM参考中,在依赖型版本需求规范章节中,软需求和硬需求是不同的:
1.0: 1.0上的“软”要求(如果它与依赖项的所有其他范围匹配,则只是一项建议) 1.0:对1.0的“硬”要求
所以如果我写:
<version>1.0.0</version>我表达了一个软要求,同时:
<version>[1.0.0]</version>我需要一个硬的。
虽然我理解解释过的所有其他版本说明符(在这问题中也解释得很好),但我无法理解这种差异。
我猜硬需求意味着:如果没有可用的1.0.0版本,这种依赖就不能得到满足;但是什么是软依赖呢?这是否意味着即使是1.0或1.0.0.1也适合这种依赖?还是意义完全不同?
注意:我总是使用软依赖规范,我这样问是因为我对理解差异感兴趣,而不是在使用其中一种或另一种之间进行选择。
发布于 2016-12-08 13:10:18
如果您在项目中声明了一个运行时依赖项,Maven需要决定应该使用哪个版本。理想情况下,带有声明版本号的工件是可用的,仅此而已。
但通常您依赖于几个依赖项。这些依赖关系本身依赖于其他依赖项(即“传递相依性”)。在这种情况下,可能会发生依赖项(例如日志框架)从不同版本的库中被请求的情况。在这种情况下,Maven必须“解决”依赖关系(以避免在类路径上使用不同版本的相同库)。要做到这一点,Maven遵循一种策略,其他版本可能会因为依赖解决策略而否决“推荐”版本(参见示例这里)。
但我想Maven只会否决“软”版本,而不是“硬”版本。因此,如果依赖树中有两个不同的“硬”版本,则冲突解决是不可能的,而buid将失败。
根据我的经验,我可以告诉你,“硬”版本号很少使用(我现在还不知道任何例子)。只需使用专用的“软”版本,不要使用版本范围(这将使您的构建不再可复制)。
顺便说一句,您可以在Sonatype图书中找到一个非常相似的解释:Maven:完整的参考-第3.4.3章:依赖型版本范围
在为Junit声明“正常”版本(如3.8.2 )时,内部表示为“允许任何事情,但更倾向于3.8.2”。这意味着当检测到冲突时,允许Maven使用冲突算法来选择最佳版本。如果指定3.8.2,则意味着只使用3.8.2,而不使用其他任何东西。如果在其他地方有一个指定3.8.1的依赖项,您将得到一个生成失败,告诉您冲突。
https://stackoverflow.com/questions/41039508
复制相似问题