Maven版本控制最佳实践

77

如何更改Maven项目的版本、发布此版本,然后返回到*-SNAPSHOT开发?

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

  • pom.xml中检索当前版本(很可能带有SNAPSHOT
  • 递增版本号(mvn -DnewVersion=<something> versions:set),遵守描述在问题“Maven artifact version for patches”中的规则
  • mvn:install将其发送到存储库
  • 再次重命名版本并添加SNAPSHOT后缀。
  • 提交更改(使用某个版本控制系统)

我强烈感觉自己做错了什么和/或效率低下。


1
通常情况下,每晚的构建版本都会带有下一个发布版本号-SNAPSHOT。因此,在发布时只需删除-SNAPSHOT并进行发布即可。 - Nikhil
2个回答

87

你应该使用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 Release 插件。你可以通过以下方式简单地发布一个构件:

第一步:

mvn release:prepare 

最后一步:

mvn release:perform

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

mvn -B release:prepare 

或者你可以将这些步骤合并成一个单一的步骤:

mvn -B release:prepare release:perform

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

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

mvn deploy 

使用发布插件的一个要求是在您的POM中配置SCM区域(我希望您正在使用版本控制?)。


2
@Michael-O 为什么你要在命令行上指定 SCM URL?我猜 khmarbaise 已经通过 POM 设置 <scm><developerConnection> 提供了它。 - earcam
@Michael-O 有点晚了,但请再读一下我的第一条评论,我们有许多项目只是使用scm定义就可以正常工作,所有文档都支持这一点。如果你要反驳这一点,请引用一些证据。 - earcam
@Michael-O,引用:“release:perform将失败,因为您没有提供-DscmUrl=...”-如果您在POM的SCM标签中指定了所有相关信息,则不会失败。我每两周会发出mvn release:preparemvn release:perform几次,而无需任何其他参数。无论如何,请相信您自己的想法,这只是一个您似乎拒绝接受的小修正。祝您一切顺利,和平相伴。 - earcam
1
Bump。release:prepare实际上在提交时会在TAG中添加一个scm路径。执行release:perform时,将构建最新的标记,其中神奇地设置了scm路径。这就是为什么您不必在主干项目中指定任何路径的原因。 - Johan Tidén
2
我可以确认这一点。如果您想使用 1.0-SNAPSHOT,则发布版本将是 1.0,而不是 1.0.0 - khmarbaise
显示剩余8条评论

5
如果您想更多地控制发布阶段,那么Maven Release插件(MRP)将无法帮助您太多。在这种情况下,我有modified versions-maven-plugin,可以增加版本并添加/删除SNAPSHOT后缀。由于这些新功能,您可以编写与mrp相同的脚本,但您可以完全控制每个步骤。例如,mrp在实际尝试构建之前提交更改的版本。如果构建失败,您必须撤销该提交,或者在SVN的情况下,您必须执行另一个撤销-提交操作。
注:我不是增量函数的原始作者。如github页面所述,我从autoincrement-versions-maven-plugin中采用了它。

1
我已在官方versions-maven-plugin GitHub页面上创建了一个拉取请求,希望他们能够整合它。 https://github.com/mojohaus/versions-maven-plugin/pull/23 - Petr Újezdský
1
如果我不想让Maven干扰SCM怎么办?例如,使用GitHub Actions可以通过TAG操作触发一些CI,但这直接与Maven的发布流程冲突... - Alex Barker
过去5年里发生了很多变化。如果他们没有更新插件以使其更易用(然而他们甚至没有理会我上面的pull-request),我会考虑使用不同的方法。虽然我不知道该用哪种方法。 - Petr Újezdský
最終我在Stack Overflow上提出了一個問題,因為我無法找到合適的解決方案。結果發現可以使用版本插件來完成。 - Alex Barker
我的解决方案也使用了 versions-maven-plugin。 它只是添加了另一个目标,使其更加灵活。虽然现在有点过时,我想。 - Petr Újezdský

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接