Maven pom:软件与硬件版本要求规范

时间:2016-12-08 12:25:27

标签: maven dependencies pom.xml

在Maven POM Reference中,在Dependency version requirement specification章节下, soft hard 要求之间存在差异:

  

1.0:"软" 1.0的要求(只是推荐,如果它与依赖的所有其他范围匹配)
  [1.0]:"硬"要求1.0

所以,如果我写:

<version>1.0.0</version>

我正在表达 soft 要求,同时:

<version>[1.0.0]</version>

我需要一个艰难的人。

虽然我理解所有其他版本说明符(在this问题中也有详细解释),但我无法解决这个问题。

我认为硬性要求意味着:如果没有1.0.0版本可用,则无法满足该依赖性;但是什么是软的呢?这是否意味着即使1.01.0.0.1适合该依赖关系?或者意义完全不同?

注意:我总是使用软依赖规范,因为我对理解差异感兴趣,而不是选择使用其中一种。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

顺便说一下,您可以在Sonatype Book中找到一个非常相似的解释: Maven:完整参考 - 第3.4.3节:Dependency Version Ranges

  

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