【问题标题】:How to update version number in Maven POMs如何更新 Maven POM 中的版本号
【发布时间】:2015-04-01 12:54:27
【问题描述】:

我们有一个非常模块化的 Maven pom 设置,常见的 jar 和特定的 jar 都被捆绑到一个 war 和 ear 中。由于在 70 多个模块中有如此多的重用,我们不使用多模块,每个模块可以而且确实有自己的生命周期,并且可以独立于任何其他模块发布。

所有模块都从各种父 pom 继承,最终每个 pom 都从 master POM 继承,其中定义了所有外部版本,例如 spring 和常见的本地模块版本。

在我们发布之前,这一切正常。如果主 POM 需要更改(它偶尔会这样做),ALL pom 需要以一种或另一种方式更新。我知道 maven 版本插件可以使用最新的 SNAPSHOT 版本等更新特定的 POM,但这仅适用于单个 POM 级别。

我们希望能够在发布完成后迭代地更改所有 pom。

我们不使用多模块 POM,也无法更改我们的构建过程以使用此机制。

我已经阅读了 SO,最接近问题的地方就在这里。 https://stackoverflow.com/a/3615417/1279002

编写 shell 脚本似乎是一种解决方案,但我们有一个 Windows 和 Linux 混合的开发和构建系统。我相信其他人会解决这个问题。谁能告诉他们如何解决这个问题?

【问题讨论】:

  • 您能否更详细地解释一下:“如果主 POM 需要更改,它偶尔会这样做,所有的 pom 都需要以一种或另一种方式进行更新。”为什么?怎么样?
  • 如果您在模块之间有重用和依赖关系,我建议您从它构建一个单一的多模块。使依赖模块的版本的所有处理更简单。在此基础上,您可以使用 maven-release-plugin 之类的默认值来一次性发布整个项目。
  • @Lutz Horm:如果所有子 POM 都继承自主 POM 并且主 POM 版本增加,那么所有子 POM 都必须更改为指向主 POM 的新版本.
  • @khmarbaise:我们在主 POM 中使用依赖管理部分(和插件管理)来管理通用版本。多模块不是一个选项。我们目前使用 maven 3.2.4。
  • 另一个可能类似的问题stackoverflow.com/questions/8466033/…

标签: java maven maven-3 pom.xml parent-pom


【解决方案1】:

在类似的设置中,我让所有父 POM 始终保持在 1.0.0-SNAPSHOT 并在父 POM 中设置各种属性以跟踪内部模块版本号(因此此设置现在集中了依赖管理版本和自定义模块版本 [通过属性] 到父 POM 中)。

所以如果我需要更新一些com.myco:module-x 的引用,我可以这样做:

  1. 编辑相应的父 POM 并将 <module-x.version>1.2.3</module-x.version> 属性设置为新值
  2. 重建/安装父 POM
  3. 重建目标终端应用程序(ear、war、jar 应用程序等)。

module-x 的 POM 中的定义可能是这样的:

<groupId>com.myco</groupId> 
<artifactId>module-x</artifactId>
<version>${module-x.version}</version>

任何引用 com.myco:module-x 的 POM 也通过 ${module-x.version} 引用它。

此时,应用程序的构建将获取父 POM 中的更改,因此它对父 POM 中定义的任何属性的任何引用。

在“中间人”模块何时/如何需要重建方面存在一些微妙的细微差别......

但我真的不相信这里有什么灵丹妙药。

我们采用的方法效果很好,再加上 Jenkins 可以在父 POM 发生变化时自动重建具有相互依赖关系的模块。

这里的好处是除了父 POM 之外,您几乎不需要修改任何内容。中间人模块和应用程序 POM 无需更新即可获得新的版本号等。

最大的警告是给定模块的两次重建在同一版本可能会导致不同的工件,例如:

  1. module-x 依赖于 module-y:1.2.3
  2. module-x 已构建(jar 是使用 MANIFEST 引用 module-y:1.2.3 创建的)
  3. 父POM修改为设置&lt;module-y.version&gt;1.2.4&lt;/module-y.version&gt;
  4. module-y 被重建以创建 1.2.4 工件
  5. module-x 已构建(jar 是使用 MANIFEST 引用 module-y:1.2.4 创建的)

但请注意,#2 和 #5 都使用 相同版本为 module-x 构建了 module-x,但两个不同的嵌入式 MANIFEST 引用了不同的 module-y 版本。

我们通过使用 Jenkins CI 服务器自动化所有依赖模块来克服这种细微差别

【讨论】:

  • 你使用哪个 Maven 版本?
  • 感谢您抽出宝贵时间回复。如果我正确理解您的回复,那么在使用 maven 发布插件执行发布时,将主 POM 永久保留在 SNAPSHOT 会导致问题,因为它不允许任何 SNAPSHOT。它还将消除可重复的构建承诺,即在发布时拥有所有 POM 会给出,因为我怀疑如果您总是使用定义版本的外部属性文件针对 SNAPSHOT 主 POM 构建,您如何知道使用了哪个版本的模块特定的构建?我们想发布所有 pom 并更新版本。有什么想法吗?
  • 这就是为什么我概述了一些警告。我认为你想要的没有灵丹妙药。如果您想要 100% 可重复的构建工件而不是多模块构建,那么您唯一的选择是采用每个模块的完整生命周期,并编写一些脚本来尝试自动化并减少处理过程中的痛苦。只要您了解后果并通过自动化减轻它们,我概述的模型效果很好。我不使用maven-release-plugin,而是通过一些简单的git-flow 样式分支和脚本标记来维护版本控制
猜你喜欢
  • 2013-10-02
  • 2015-09-24
  • 1970-01-01
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多