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

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

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

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


答案 1

注意:

上面提到的 LATESTRELEASE 元版本在 Maven 3 中被删除了插件依赖项,“为了可重现的构建”,这是 6 年前的。(对于常规依赖项,它们仍然工作得很好。有关插件依赖项,请参阅此 Maven 3 兼容解决方案


如果您始终希望使用最新版本,Maven 有两个关键字,您可以将其用作版本范围的替代方法。您应该谨慎使用这些选项,因为您不再控制正在使用的插件/依赖项。

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

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

  • 方括号( & ) 表示“封闭”(包括)。[]
  • 括号 ( & ) 表示 “open” (exclusive)。()

下面是一个示例,用于说明各种选项。在 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 和版本范围)的方法都可能使您面临构建时问题,因为更高版本可能具有不同的行为(例如,依赖项插件之前已将默认值从 true 切换到 false,结果令人困惑)。

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


答案 2

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

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

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

还提供了以下其他目标:

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

只是以为我会把它包括在内,以供将来参考。


推荐