我如何告诉Maven使用最新版本的依赖关系?

在Maven中,依赖关系通常是这样设置的:

<dependency>
  <groupId>wonderful-inc</groupId>
  <artifactId>dream-library</artifactId>
  <version>1.2.3</version>
</dependency>

现在,如果您正在处理频繁发布的库,不断更新<version>标签可能会有些恼人。 有什么办法可以告诉Maven始终使用最新的可用版本(来自存储库)?


注意:

这个答案只适用于Maven 2! 所提到的LATESTRELEASE metaversions已被丢弃在Maven的3“的重现性着想建立”,在6年前。 请参考这个符合Maven 3的解决方案


如果您始终想要使用最新版本,Maven有两个关键字可用作版本范围的替代品。 您应该小心使用这些选项,因为您不再控制所使用的插件/依赖项。

当您依赖插件或依赖项时,可以使用LATEST或RELEASE的版本值。 最新引用特定工件的最新发布或快照版本,这是特定存储库中最近部署的工件。 RELEASE引用存储库中的最后一个非快照版本。 一般来说,设计取决于工件的非特定版本的软件不是最佳实践。 如果您正在开发软件,则可能需要使用RELEASE或LATEST作为便利,以便在发布第三方库的新版本时不必更新版本号。 当您发布软件时,您应该始终确保您的项目依赖于特定版本,以减少您的构建或您的项目受不受您控制的软件版本影响的可能性。 如果有的话,请谨慎使用最新版和发行版。

有关更多详细信息,请参阅Maven书籍的POM语法部分。 或者在依赖版本范围中查看此文档,其中:

  • 方括号( [] )表示“关闭”(含)。
  • 括号( () )表示“开放”(不包括)。
  • 以下是一个说明各种选项的例子。 在Maven仓库中,com.foo:my-foo具有以下元数据:

    <?xml version="1.0" encoding="UTF-8"?><metadata>
      <groupId>com.foo</groupId>
      <artifactId>my-foo</artifactId>
      <version>2.0.0</version>
      <versioning>
        <release>1.1.1</release>
        <versions>
          <version>1.0</version>
          <version>1.0.1</version>
          <version>1.1</version>
          <version>1.1.1</version>
          <version>2.0.0</version>
        </versions>
        <lastUpdated>20090722140000</lastUpdated>
      </versioning>
    </metadata>
    

    如果需要对该工件的依赖关系,则可以使用以下选项(当然,可以指定其他版本范围,只是在此显示相关的版本):

    声明确切版本(将始终解析为1.0.1):

    <version>[1.0.1]</version>
    

    声明一个明确的版本(除非发生冲突,否则当Maven将选择一个匹配的版本时,将永远解析为1.0.1):

    <version>1.0.1</version>
    

    声明所有1.x的版本范围(目前将解析为1.1.1):

    <version>[1.0.0,2.0.0)</version>
    

    声明开放式版本范围(将解析为2.0.0):

    <version>[1.0.0,)</version>
    

    声明版本为LATEST(将解析为2.0.0)(从maven 3.x中移除)

    <version>LATEST</version>
    

    声明版本为RELEASE(将解析为1.1.1)(从maven 3.x中删除):

    <version>RELEASE</version>
    

    请注意,默认情况下,您自己的部署将更新Maven元数据中的“latest”条目,但要更新“release”条目,您需要激活Maven super POM中的“release-profile”。 您可以使用“-Prelease-profile”或“-DperformRelease = true”


    值得强调的是,任何允许Maven选择依赖版本(最新版本,发布版本和版本范围)的方法都可能会导致构建时间问题,因为以后的版本可能会有不同的行为(例如,依赖项插件先前已切换为默认值从真到假,结果令人困惑)。

    因此,在发行版中定义精确版本通常是一个好主意。 正如Tim的回答指出的那样,maven-versions-plugin是更新依赖版本的便捷工具,特别是版本:use-latest-versions和versions:use-latest-releases目标。


    现在我知道这个话题已经很老了,但是阅读这个问题,OP提供了答案,似乎Maven Versions Plugin可能实际上是对他的问题的更好回答:

    特别是可以使用以下目标:

  • 版本:use-latest-versions在pom中搜索所有新版本的版本,并用最新版本替换它们。
  • 版本:use-latest-releases在pom中搜索所有非SNAPSHOT版本,这些版本是较新的版本,并用最新版本替换它们。
  • 版本:update-properties更新项目中定义的属性,以便它们对应于特定依赖项的最新可用版本。 如果一组依赖项必须全部锁定到一个版本,这可能很有用。
  • 还提供了以下其他目标:

  • 版本:display-dependency-updates扫描项目的依赖关系,并生成具有可用新版本的依赖关系的报告。
  • 版本:display-plugin-updates扫描项目的插件并生成可用更新版本的插件报告。
  • 版本:update-parent更新项目的父节,以便它引用最新的可用版本。 例如,如果您使用公司根POM,那么如果您需要确保使用最新版本的公司根POM,则此目标可能会有帮助。
  • 版本:update-child-modules更新项目的子模块的父节,以便版本与当前项目的版本相匹配。 例如,如果聚合器pom也是其聚合的项目的父项,并且子项和父项版本不同步,则此mojo可以帮助修复子模块的版本。 (注意,如果你的项目由于版本不匹配而无法构建,那么你可能需要使用-N选项来调用Maven才能运行此目标)。
  • 版本:锁定快照在pom中搜索所有-SNAPSHOT版本,并使用该-SNAPSHOT的当前时间戳版本替换它们,例如-20090327.172306-4
  • 版本:unlock-snapshots在pom中搜索所有时间戳锁定的快照版本,并用-SNAPSHOT替换它们。
  • 版本:resolve-ranges使用版本范围查找依赖关系,并将范围解析为正在使用的特定版本。
  • 版本:use-releases在pom中搜索已发布的所有-SNAPSHOT版本,并用相应的发行版本替换它们。
  • 版本:use-next-releases在pom中搜索所有非SNAPSHOT版本,这些版本是较新的版本,并将其替换为下一版本。
  • 版本:use-next-versions在pom中搜索所有已经更新版本的版本,并将其替换为下一个版本。
  • 版本:提交删除pom.xml.versionsBackup文件。 形成内置的“穷人的SCM”的一半。
  • 版本:恢复从pom.xml.versionsBackup文件恢复pom.xml文件。 形成内置的“穷人的SCM”的一半。
  • 只是以为我会将它包括在内以备将来参考。


    请看这个页面(“依赖版本范围”部分)。 你可能想要做的是类似的

    <version>[1.2.3,)</version>
    

    这些版本范围在Maven2中实现。

    链接地址: http://www.djcxy.com/p/5035.html

    上一篇: How do I tell Maven to use the latest version of a dependency?

    下一篇: How do I suppress maven assembly plugin skipping files that are already added? Or allow overwrite?