协慌网

登录 贡献 社区

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

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

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

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

答案

注意:

这个答案仅适用于 Maven 2! 6 年前,所提到的LATESTRELEASE metaversions 已经在 Maven 3“中为了可重复的构建而被删除” 。请参阅此Maven 3 兼容解决方案


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

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

有关更多详细信息,请参阅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>

声明一个显式版本(除非发生冲突,否则将始终解析为 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 超级 POM 中的 “发布配置文件”。您可以使用 “-Prelease-profile” 或“-DperformRelease = true” 执行此操作


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

因此,在版本中定义确切版本通常是个好主意。正如Tim 的回答所指出的, maven-versions-plugin是一个用于更新依赖版本的便利工具,特别是版本:use-latest-versionsversions:use-latest-releases目标。

现在我知道这个主题是旧的,但是阅读问题和 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” 的一半。

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

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

<version>[1.2.3,)</version>

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

注意:

这个答案仅适用于 Maven 2! 6 年前,所提到的LATESTRELEASE metaversions 已经在 Maven 3“中为了可重复的构建而被删除” 。请参阅此Maven 3 兼容解决方案


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

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

有关更多详细信息,请参阅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>

声明一个显式版本(除非发生冲突,否则将始终解析为 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 超级 POM 中的 “发布配置文件”。您可以使用 “-Prelease-profile” 或“-DperformRelease = true” 执行此操作


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

因此,在版本中定义确切版本通常是个好主意。正如Tim 的回答所指出的, maven-versions-plugin是一个用于更新依赖版本的便利工具,特别是版本:use-latest-versionsversions:use-latest-releases目标。

现在我知道这个主题是旧的,但是阅读问题和 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” 的一半。

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

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

<version>[1.2.3,)</version>

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