Maven版本控制最佳实践


69

更改Maven项目版本,发布该版本然后返回*-SNAPSHOT开发的最佳方法是什么。

目前,我正在执行以下操作:

  • SNAPSHOT从中检索当前版本(最有可能与)pom.xml
  • 增量版本(mvn -DnewVersion=<something> versions:set),遵守问题Maven工件版本中描述的补丁规则
  • mvn:install 发送回购
  • 重命名版本再次添加SNAPSHOT后缀。
  • 提交更改(使用某些版本控制系统)

我有一种强烈的感觉,我做错了和/或效率低下。


通常,每夜构建都具有next-release-number-SNAPSHOT。因此,在释放时只需删除-SNAPSHOT并释放它即可。
Nikhil

Answers:


77

您应该使用maven-release-plugin释放工件。发行插件会自动将所有版本自动增加。如果从1.0.3-SNAPSHOT转到1.1.0-SNAPSHOT可能是一个例外。使用Maven进行开发的时间表是:

1.0.0-SNAPSHOT
1.0.0
1.0.1-SNAPSHOT
1.0.1
1.0.2-SNAPSHOT
1.0.2
..

要从SNAPSHOT迈向发行版,您应该使用maven发行插件,您可以使用以下方法来发行工件:

第一步:

mvn release:prepare 

最后一步:

mvn release:perform

如果您想接受默认值,则只需添加-B即可:

mvn -B release:prepare 

或者您可以将这些步骤合并为一个步骤:

mvn -B release:prepare release:perform

以上内容也可以在CI解决方案中使用。

使用mvn install仅用于将工件安装到本地存储库中。如果您正在使用像存储库管理器这样的真实库(我可以推荐),则必须使用:

mvn deploy 

使用release插件的一个要求是在pom中配置scm区域(我希望您使用的是版本控件?)。


您甚至可以省略z位置,因为例如1.1和1.1.0相等。这就是我要做的,所有的Maven插件都做。而且,release:peform由于您未提供,鞋底将失败-DscmUrl=...
Michael-O

2
@ Michael-O为什么在命令行上指定SCM URL?我怀疑khmarbaise已通过POM设置<scm> <developerConnection>提供了它
earcam

@earcam,因为插件需要从那里知道发布的版本。scm元素在默认签出中不包含中继。
Michael-O

1
磕碰。release:prepare实际上在提交时在TAG中添加了scm路径。执行release:perform时,将构建最新的标签,该标签神奇地设置了scm路径。这就是为什么您不必在中继项目中指定任何路径的原因。
JohanTidén2013年

2
我可以确认。如果您想使用1.0-SNAPSHOT该发行版,那么1.0...而不是1.0.0...
khmarbaise19年

5

如果要对发布阶段进行更多控制,则maven-release-plugin(mrp)不会对您有太大帮助。

在那种情况下,我修改了versions-maven-plugin,使其能够增加版本并添加/删除SNAPSHOT后缀

由于有了这些新功能,您可以编写与mrp相同功能的脚本,但是您可以完全控制每个步骤。

例如,mrp会实际尝试构建更改版本之前提交更改的版本。如果构建失败,则必须还原该提交,如果是SVN,则必须执行另一个还原提交。

注意:我不是递增函数的原始作者。我已经从autoincrement-versions-maven-plugin中采用了它,如github页面上所述。


1
我已经在官方versions-maven-plugin github页面上创建了pull请求,希望他们将其集成到github.com/mojohaus/versions-maven-plugin/pull/23
PetrÚjezdský16年

如果我不想让Maven与SCM发生冲突该怎么办?例如,通过GitHub动作,我可以使用TAG动作触发一些CI,但这与mavens发布过程直接冲突……
Alex Barker

好吧,最近五年发生了很多变化。如果他们没有将插件更新为更可用(但是他们甚至没有理会我上面的pull-request),我会考虑使用其他方法。虽然不知道哪一个。
PetrÚjezdský20年

由于无法找到合适的解决方案,我最终问了另一个SO问题。事实证明,可以使用版本插件来完成。
Alex Barker

我上面的解决方案也使用versions-maven-plugin。它只是增加了另一个目标,使其更加灵活。我想虽然现在有点过时了。
PetrÚjezdský20年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.