避免使用 maven-release-plugin 为下一次开发迭代更新 POM 版本

Posted

技术标签:

【中文标题】避免使用 maven-release-plugin 为下一次开发迭代更新 POM 版本【英文标题】:Avoid update POM versions for next development iteration with maven-release-plugin 【发布时间】:2015-02-27 17:04:38 【问题描述】:

我正在使用 maven-release-plugin 和 git 发布我的第一个版本。我使用的是 release:branch 目标,而不是标记。我同意完整的发布流程,除了一点:所有本地依赖项都会自动更新到开发分支中的下一个 SNAPSHOT 版本。

这是我的具体情况:我正在从事一个有 20 多个 maven 项目的项目。假设它们在开发过程中都处于 SNAPSHOT 版本。我想用 maven 插件发布。发布完成后,所有 POM 版本都已递增并再次设置为 SNAPSHOT。如果我只需要更改一个项目的一行代码(修复错误)并发布新版本,那么当我刚刚更改 其中之一时,所有项目(默认情况下)必须再次增加它们的版本他们

在我看来,使用上一个版本的状态继续开发更有意义(所有版本没有 SNAPSHOT)。在下一次开发迭代中,我只能在我改变的这些项目中手动设置下一个 SNAPSHOT 版本。在下一个版本中,只有更改的项目会被“升级”到新版本,而不是全部。

我认为这种情况并不例外,但我没有找到如何做到这一点的信息(我不知道我是否打破了“发布”哲学......)

Somedy 知道如何避免将所有 POM 更新到下一个 SNAPSHOT 版本并将 POM 文件保留为发布版本?

提前谢谢你!

【问题讨论】:

【参考方案1】:

多模块项目的理念是所有模块都属于同一个发布周期。即使某些模块不包含任何更改,它们也会成为发布的一部分。有人可能会说:版本很便宜。 与您描述的理想图片相比,好处更大:管理版本和控制模块间依赖关系要容易得多。 请记住,主干和分支都应该始终有一个 SNAPSHOT 版本,因为它们是工作副本。如果您使用最终版本,发布将失败,因为您不能两次标记相同的版本,也不能两次部署(=上传)相同的版本。这一点非常重要,因为 Maven 依赖于最终版本不可变的定义,即一旦最终版本在本地存储库中可用,Maven 将永远不会再次下载。

因此,如果某些模块的发布周期与整个多模块项目的发布周期不同,则应将它们移出该多模块项目(或一次全部发布)。

【讨论】:

好的,现在我明白了“模块化”的哲学了:)。有了这些信息,我的下一个问题是:你知道在 Maven 中是否有办法配置发布插件以发布这些自上次发布以来已更改的 SNAPSHOTS?在这种情况下,我的方案会起作用,不是吗? Maven 的作用域是当前构建和先前构建(用于支持增量构建),因此 Maven 无法检测与先前版本相比发生了哪些变化。另请注意,maven-release-plugin 不支持每个模块的标签,因为 maven-release-plugin 必须能够按标签进行检出并再次重建整个(多模块)项目。所以最可靠的方法是创建 1 个包含完整多模块的标签。您可以尝试使用 -pl 选择可发布的模块,我没有尝试过,它会使过程更加复杂。问问自己:这真的重要吗? 我同意你的看法,更新所有 POM 会更简单......但说实话,我不喜欢有不同版本的模块不改变其来源的想法!你不觉得这种情况很“肮脏”吗? :) 可以说它并不完美,但是出错的机会会减少很多。如前所述,这全都与发布周期有关。如果模块有自己的发布周期,请将其移出多模块项目。但是现在您有责任使所有依赖项引用保持最新。我可以挑战你设计你的解决方案:) 那就是:根据修订检测更改;标记时排除未更改的模块。最后,这应该适用于所有 SCM,但我很确定已经为单个 SCM 修复它很困难。可以看到:主要的问题是如何正确的指令单片机,Maven可以轻松跟上【参考方案2】:

在我的幻灯片演示 http://www.slideshare.net/geertpante/version-mgmt-in-maven(幻灯片 20 及以下)中总结了发布单个模块、应用程序或应用程序系统之间的区别。

我们有时会将快照版本设置为例如2.0-SNAPSHOT,并以 1.x.y 的形式发布。所以在开发中,我们一直使用 2.0-SNAPSHOT,但是当我们发布时,我们会选择旧版本,例如1.3、1.4,并选择2.0-SNAPSHOT作为下一个发布版本。

另外,如果您使用 git,请查看 https://bitbucket.org/atlassian/jgit-flow/wiki/Home。优点之一是它保留了一个单独的开发分支,并且只有版本合并到主分支:

mvn jgitflow:release-start -DreleaseVersion=1.2 -DdevelopmentVersion=2.0-SNAPSHOT
mvn jgitflow:release-finish -DreleaseVersion=1.2 -DdevelopmentVersion=2.0-SNAPSHOT

【讨论】:

我喜欢这个解决方案,因为它解决了与 POM 之间的依赖关系相关的所有问题(这是一个非常好的观点)。然而,当您想要发布新版本时,您需要 1) 将您的开发版本 (2.0.0-SNAPSHOT) 与您的上一个发布版本 (例如 1.1) 合并。 2)增加发布版本(1.2)并部署它。您是手动执行此过程还是可以使用 maven 自动执行此过程? 这是由 maven 使用上面提到的 jgitflow 插件自动完成的。它会在每次发布后立即自动将发布合并到开发分支。

以上是关于避免使用 maven-release-plugin 为下一次开发迭代更新 POM 版本的主要内容,如果未能解决你的问题,请参考以下文章

与 maven-release-plugin 一起使用的正确工作流程是啥?

使用 maven-release-plugin 部署程序集包

maven-release-plugin,是不是可以不使用分支标签标记 pom.xml

将 maven-release-plugin 与 git-1.8.5 一起使用

maven-release-plugin 和表达式的问题

maven-release-plugin 标签创建