如何在 Maven POM 中更新版本号



我们设置了一个非常模块化的Maven pom,普通罐子和特定的罐子都被捆绑在战争和耳朵中。由于 70+ 模块之间存在如此多的重用,我们不使用多模块,每个模块都可以并且确实有自己的生命周期,并且可以独立于任何其他模块发布。

所有模块都继承自各种父 pom,最终每个 pom 都继承自主 POM,其中定义了所有外部版本(如 spring 和通用本地模块版本)。

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

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

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

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

编写 shell 脚本似乎是一种解决方案,但我们有 Windows 和 Linux 的开发和构建系统组合。我相信其他人会解决这个问题。任何人都可以建议他们是如何解决这个问题的吗?

在类似的设置中,我让所有父 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. 重建目标终端应用程序(耳朵、战争、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. 模块-x 依赖于模块 Y:1.2.3
  2. 模块-x 被构建(jar 是使用引用模块 MANIFEST 的 MANIFEST 创建:y:1.2.3)
  3. 修改父 POM 以设置<module-y.version>1.2.4</module-y.version>
  4. 模块 y 被重建以创建 1.2.4 工件
  5. 构建模块 x(jar 是使用 MANIFEST 引用模块 y:1.2.4 创建的)

但请注意,#2 和 #5 都构建了模块 x,具有相同的模块 x 版本,但两个不同的嵌入式 MANIFEST 引用了不同的模块 y 版本。

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

相关内容

  • 没有找到相关文章

最新更新