如何告诉Maven使用最新版本的依赖项?

问题

在Maven中,依赖项通常设置如下:

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

现在,如果你正在使用频繁发布的库,不断更新<version>标记可能有些烦人。有没有办法告诉Maven始终使用最新的可用版本(来自存储库)?


#1 热门回答(638 赞)

注意:

这个答案仅适用于Maven 2! 6年前提到的“LATEST”和“RELEASE”metaversionshave been dropped in Maven 3 "for the sake of reproducible builds"。请参考这个Maven 3 compliant solution

如果你总是想使用最新版本,Maven有两个关键字,你可以使用它们作为版本范围的替代品。你应该小心使用这些选项,因为你不再控制正在使用的插件/依赖项。

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

有关详细信息,请参阅POM Syntax section of the Maven book。或者在57822338上查看此文档,其中:

  • 方括号([&])表示“关闭”(包括)。
  • 括号((&))表示“打开”(不包括)。

这是一个说明各种选项的示例。在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>

如果需要依赖于该工件,则可以使用以下选项(当然可以指定otherversion ranges,只显示相关的选项):

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

<version>[1.0.1]</version>

声明一个显式版本(除非发生冲突,否则将始终解析为1.0.1,当Maven将选择匹配版本时):

<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元数据中的“最新”条目,但要更新“发布”条目,你需要激活Maven super POM中的“发布配置文件”。你可以使用“-Prelease-profile”或“-DperformRelease = true”执行此操作

值得强调的是,任何允许Maven选择依赖版本(LATEST,RELEASE和版本范围)的方法都会让你开放构建时间问题,因为后续版本可能会有不同的行为(例如,依赖插件之前已经切换了默认值值从真到假,结果令人困惑)。

因此,在版本中定义确切版本通常是个好主意。 AsTim's answer指出,4336504523是一个更新依赖版本的便利工具,特别是versions:use-latest-versionsversions:use-latest-releases目标。


#2 热门回答(309 赞)

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

特别是以下目标可能有用:

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

还提供了以下其他目标:

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

我以为我会把它包含在以后的任何参考中。


#3 热门回答(162 赞)

请查看this page(“依赖版本范围”部分)。你可能想做的事情是这样的

<version>[1.2.3,)</version>

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