在Maven中,依赖关系通常是这样设置的:
<dependency>
<groupId>wonderful-inc</groupId>
<artifactId>dream-library</artifactId>
<version>1.2.3</version>
</dependency>
现在,如果您使用的是频繁发布的库,那么不断更新<version>标记可能会有些烦人。有没有办法告诉Maven始终使用最新的可用版本(来自存储库)?
在Maven中,依赖关系通常是这样设置的:
<dependency>
<groupId>wonderful-inc</groupId>
<artifactId>dream-library</artifactId>
<version>1.2.3</version>
</dependency>
现在,如果您使用的是频繁发布的库,那么不断更新<version>标记可能会有些烦人。有没有办法告诉Maven始终使用最新的可用版本(来自存储库)?
当前回答
如果你想让Maven使用最新版本的依赖项,那么你可以使用版本Maven插件以及如何使用这个插件,Tim已经给出了一个很好的答案,跟随他的答案。
但作为一名开发人员,我不会推荐这种类型的实践。为什么?
Pascal Thivent在问题评论中已经给出了原因的答案
我真的不推荐这种做法(也不使用版本范围)为了构建再现性。突然开始的构建由于未知原因而失败比手动更新更令人讨厌版本号。
我将推荐这种做法:
<properties>
<spring.version>3.1.2.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
它易于维护和调试。您可以随时更新POM。
其他回答
与其他人不同,我认为有很多原因可以解释为什么你总是想要最新版本。特别是如果您正在进行连续部署(我们有时一天会发布5个版本),并且不想进行多模块项目。
我所做的是让Hudson/Jenkins为每个构建执行以下操作:
mvn clean versions:use-latest-versions scm:checkin deploy -Dmessage="update versions" -DperformRelease=true
也就是说,我使用版本插件和scm插件来更新依赖项,然后将其签入源代码管理。是的,我让我的CI进行SCM签入(对于maven发布插件,无论如何都必须这样做)。
您需要设置版本插件以仅更新您想要的内容:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>versions-maven-plugin</artifactId>
<version>1.2</version>
<configuration>
<includesList>com.snaphop</includesList>
<generateBackupPoms>false</generateBackupPoms>
<allowSnapshots>true</allowSnapshots>
</configuration>
</plugin>
我使用发布插件来进行发布,该插件负责-SNAPSHOT,并验证是否存在-SNAPSHO的发布版本(这很重要)。
如果您执行我所做的操作,您将获得所有快照版本的最新版本和发布版本的最新版。您的构建也将是可复制的。
使现代化
我注意到一些评论询问了此工作流的一些细节。我会说,我们不再使用这种方法了,maven版本插件存在缺陷的主要原因是它本身就存在缺陷。
这是有缺陷的,因为要运行版本插件来调整版本,pom需要存在所有现有版本才能正确运行。也就是说,如果找不到pom中引用的版本,版本插件就无法更新到最新版本。这实际上相当令人讨厌,因为我们经常因为磁盘空间的原因清理旧版本。
实际上,您需要一个独立于maven的工具来调整版本(因此您不需要依赖pom文件才能正确运行)。我用低级语言Bash编写了这样一个工具。该脚本将像版本插件一样更新版本,并将pom检查回源代码管理。它的运行速度也比mvn版本插件快100倍。不幸的是,它不是以公共使用的方式编写的,但如果人们感兴趣,我可以这样做,并将其放入要旨或github中。
当一些评论问及我们的工作时,返回工作流:
我们有大约20个项目在他们自己的存储库中,他们有自己的jenkins工作当我们发布maven发布插件时,将使用该插件。该插件的文档中介绍了其工作流程。maven发布插件有点糟糕(我很友好),但它确实有效。有一天,我们计划用更优化的方法来替代这种方法。当其中一个项目发布后,jenkins会运行一个特殊的作业,我们称之为更新所有版本作业(jenkins如何知道它的发布是一个复杂的方式,部分原因是maven jenkins发布插件也很糟糕)。更新所有版本作业了解所有20个项目。它实际上是一个聚合器pom,以依赖关系顺序特定于模块部分中的所有项目。Jenkins运行我们神奇的groovy/bash-foo,它会将所有项目更新到最新版本,然后签入pom(同样是基于模块部分的依赖顺序)。对于每个项目,如果pom发生了更改(由于某些依赖项的版本更改),它将被检入,然后我们立即ping jenkins为该项目运行相应的作业(这是为了保持构建依赖项顺序,否则您将受到SCM轮询调度程序的支配)。
在这一点上,我认为无论如何,将发布和自动版本作为一个独立于常规构建的工具是一件好事。
现在您可能会认为maven有点糟糕,因为上面列出的问题,但对于没有声明性易于解析的可扩展语法(也称为XML)的构建工具来说,这实际上相当困难。
事实上,我们通过命名空间添加自定义XML属性来帮助提示bash/groovy脚本(例如,不要更新此版本)。
我在maven 3.5.4中的解决方案,在eclipse中使用nexus:
<dependency>
<groupId>yilin.sheng</groupId>
<artifactId>webspherecore</artifactId>
<version>LATEST</version>
</dependency>
然后在eclipse:atl+F5中,选择快照/发布的强制更新
这对我有用。
依赖项语法位于依赖项版本需求规范文档中。这里是为了完整:
依赖项的版本元素定义版本要求,用于计算有效的依赖项版本。版本要求具有以下语法:1.0:1.0上的“软”要求(仅为建议,如果它与依赖关系的所有其他范围相匹配)[1.0]:1.0中的“硬”要求(,1.0]:x<=1.0[1.2,1.3]:1.2<=x<=1.3[1.0,2.0):1.0<=x<2.0[1.5,):x>=1.5(,1.0],[1.2,):x<=1.0或x>=1.2;多个集合以逗号分隔(,1.1),(1.1,):这不包括1.1(例如,如果不知道与此库结合使用)
在您的情况下,您可以执行类似于<version>〔1.2.3,)</version>的操作
在提出这个问题时,maven中的版本范围存在一些问题,但这些问题已经在maven的新版本中得到解决。本文很好地捕捉了版本范围的工作原理和最佳实践,以更好地理解maven如何理解版本:https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8855
请查看此页(“依赖项版本范围”部分)。你可能想做的是
<version>[1.2.3,)</version>
这些版本范围在Maven2中实现。