如何告诉Maven使用最新版本的依赖项?
在Maven中,依赖关系通常是这样设置的:
<dependency> <groupId>wonderful-inc</groupId> <artifactId>dream-library</artifactId> <version>1.2.3</version> </dependency>
现在,如果我们正在使用发布频繁的库,则不断更新<version>标记可能会有些烦人。有什么方法可以告诉Maven始终使用最新的可用版本(来自存储库)?
解决方案
回答
我们是否可能依赖在开发过程中发生很大变化的开发版本?
除了增加开发版本的版本外,我们还可以使用在必要时覆盖的快照版本,这意味着我们不必在每次较小的更改时都更改版本标签。像1.0-快照...
但是也许我们正在尝试实现其他目标;)
回答
请查看此页面("依赖版本范围"部分)。我们可能想做的是
<version>[1.2.3,)</version>
这些版本范围在Maven2中实现。
回答
笔记:
此答案仅适用于Maven 2!在6年前,"为了可复制的构建"已在Maven 3中删除了提到的"最新"和"发布"转换。
请参考此兼容Maven 3的解决方案。
如果你总是想使用最新的版本,Maven有可以作为替代版本范围使用两个关键字。我们应该谨慎使用这些选项,因为我们将不再控制所使用的插件/依赖项。
When you depend on a plugin or a dependency, you can use the a version value of LATEST or RELEASE. LATEST refers to the latest released or snapshot version of a particular artifact, the most recently deployed artifact in a particular repository. RELEASE refers to the last non-snapshot release in the repository. In general, it is not a best practice to design software which depends on a non-specific version of an artifact. If you are developing software, you might want to use RELEASE or LATEST as a convenience so that you don't have to update version numbers when a new release of a third-party library is released. When you release software, you should always make sure that your project depends on specific versions to reduce the chances of your build or your project being affected by a software release not under your control. Use LATEST and RELEASE with caution, if at all.
有关更多详细信息,请参见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>
将版本声明为最新(将解析为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选择依赖项版本(最新,发布和版本范围)的方法都可以让我们开放以解决构建时间问题,因为更高版本的行为可能不同(例如,依赖项插件先前已将默认设置切换为默认值)。值从true到false,结果令人困惑)。
因此,通常最好在发行版中定义确切的版本。正如Tim的答案所指出的那样,maven-versions-plugin是用于更新依赖项版本的便捷工具,尤其是版本:use-latest-versions和版本:use-latest-releases目标。
回答
现在我知道这个主题很旧,但是阅读问题和OP提供的答案后,似乎Maven Versions插件实际上可能是对他的问题的更好答案:
特别是可以使用以下目标:
- 版本: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才能运行此目标)。
- version:lock-snapshots在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中搜索所有已经是较新版本的版本,并将其替换为下一个版本。
- 版本:commit删除pom.xml.versionsBackup文件。构成内置的"穷人SCM"的一半。
- 版本:revert从pom.xml.versionsBackup文件中恢复pom.xml文件。构成内置的"穷人SCM"的一半。
只是以为我会把它包括在内以备将来参考。