【问题标题】:maven dependency range does not work as expectedmaven 依赖范围不能按预期工作
【发布时间】:2011-04-22 08:30:47
【问题描述】:

Maven 2.2.1 声称支持版本范围(参见例如http://www.sonatype.com/books/mvnref-book/reference/pom-relationships-sect-project-dependencies.html#pom-relationships-sect-version-ranges

我从全新的 maven 安装中尝试了以下 pom:

<project>

  <modelVersion>4.0.0</modelVersion>
  <artifactId>rangetest</artifactId>
  <groupId>my.group</groupId>
  <version>1.0</version>
  <packaging>jar</packaging>

  <description>test project containing one dependency, only</description>
  <dependencies>
   <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.8</version>
    <scope>test</scope>
   </dependency>
  </dependencies>
 </project>

依赖项应该解析为junit 4.8.2,对吗? 但取而代之的是 4.8 版本:

C:\Users>mvn dependency:tree
[INFO] Scanning for projects...
[INFO] Searching repository for plugin with prefix: 'dependency'.
[INFO] ------------------------------------------------------------------------
[INFO] Building Unnamed - my.group:rangetest:jar:1.0
[INFO]    task-segment: [dependency:tree]
[INFO] ------------------------------------------------------------------------
[INFO] [dependency:tree {execution: default-cli}]
[INFO] my.group:rangetest:jar:1.0
[INFO] \- junit:junit:jar:4.8:test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2 seconds
[INFO] Finished at: Thu Oct 07 14:30:40 CEST 2010
[INFO] Final Memory: 9M/23M
[INFO] ------------------------------------------------------------------------

您可能认为这是 Junit 的问题,因为 4.8 是现有版本,但事实并非如此。在我的项目中,我部署了从 1.0.0 到 1.0.15 的版本(没有 1.0 版!),但 mvn dependency:tree 抱怨缺少 1.0 版的工件。

【问题讨论】:

    标签: maven-2 dependencies range


    【解决方案1】:

    仅当您实际指定版本范围时才有效如果您有多个 POM。您使用 4.8 这是一个单一的版本号,所以 Maven 尝试直接解决它。版本范围必须以 [( 开头(分别为包含和排除)。

    在您的情况下,请尝试:[4.8,4.9)

    这应该为您提供具有相同 API 的最高版本(即所有错误修复但没有重大更改)。

    本文档展示了 Maven 如何解释版本:https://maven.apache.org/enforcer/enforcer-rules/versionRanges.html

    第一行似乎支持您的立场(4.8 表示“至少 4.8”)但有一个问题:如果有人特别要求,Maven 只会选择更高的版本。因此,除非您的构建中有更多 POM 并且其中一个要求 4.8.2,否则 4.8 对于 Maven 来说“足够好”。

    将其视为解决冲突的提示。如果 POM A 要求 4.8 而 B 要求 4.8.2 并且 B 依赖于 A,那么 Maven 必须做出决定。它应该失败吗?它应该使用4.8吗?还是 4.8.2?

    规则通过选择 4.8.2 来解决此冲突,而不给出警告或错误。

    如果 A 请求 [4.8],你会得到一个错误,因为 Maven 不能静默地将依赖“升级”到 4.8.2,它当然不能将 4.8.2 降级到 4.8。

    【讨论】:

    • 嗯,Maven 范围规范docs.codehaus.org/display/MAVEN/… 区分了“硬”要求(例如 [4.8])和“软”要求(例如不带括号的 4.8)。那么软需求有什么用呢?
    • @Jay:从未听说过这个词。 4.8.1 只选择那个版本,没有别的。我的猜测是文档已经过时了。
    • 软需求按应有的方式工作。当解决依赖关系并且版本之间存在冲突时,如果其中最多一个是硬性要求,则选择最好的一个。请参阅问题中链接末尾的注释。
    • Maven defines 1.0 to mean x &gt;= 1.0 with 1.0 preferred。因此,如果另一个依赖项想要一个大于1.0 的版本,Maven 将使用更大的版本来满足两者。但是如果你使用[1.0],这是一个硬性要求,任何对不同版本的硬性依赖都是不兼容的。
    • 嗨亚伦,我认为你的回答看起来不错。我认为添加链接很好,因为 Maven 特别对待要求1.0。每当调查此类版本交互时,我们都会使用mvn dependency:tree。谢谢。
    【解决方案2】:

    version 标记中似乎没有范围限定符。也许您打算使用以下内容来要求版本 4.8 或更高版本:

    [4.8,)

    【讨论】:

      【解决方案3】:

      如果您想使用版本范围,请指定其他人指出的版本范围。目前,你不是。

      但我真正的建议是根本不要使用版本范围,版本范围对于构建可重复性来说是个坏主意,而且您最不想要的就是构建突然开始失败,因为不明原因。只是不要,它们是一种不好的做法(这可能是不再记录版本范围的原因)。

      【讨论】:

      • (+1) 这是我今天的最后一票 :-) 顺便说一句,谁制作了这个 CW,为什么?
      • 同意,除非您想自动使用 bugfixversion。但真是让人头疼……
      • @seanizer:要么是 OP(只有 OP 可以自己提出问题 CW),要么是 7/8(?)编辑后的系统。但在这种情况下,它是我们在修订历史中看到的 OP。可能是一个“错误”,但这里的 OP 是新的。
      • 为什么这是个坏主意? OSGI 一直使用版本范围。请务必证明你的观点。
      • OSGi 有明确定义的版本语法语义......问题是 maven 无处不在。如果您使用语义版本,则只能指定范围。工件的语义版本不如 OSGi 使用的包依赖项有用。
      【解决方案4】:

      就我而言,一切正常,但突然间我收到了这个错误

      No versions are present in the repository for the artifact with a range [x,y)
      

      我去了.m2/repository文件夹内的库位置并删除了整个文件夹,

      如果您删除了特定版本的库的文件夹,它将无法工作,应该删除该库的所有版本的文件夹

      还有一件事,如果库是可传递的,您可能需要删除依赖路径中的所有库

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-22
        相关资源
        最近更新 更多