我们设置了一个非常模块化的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
的引用,我可以这样做:
- 编辑相应的父 POM 并将
<module-x.version>1.2.3</module-x.version>
属性设置为新值 - 重建/安装父 POM
- 重建目标终端应用程序(耳朵、战争、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不需要更新即可获得新版本号等。
最大的警告是,在同一版本中对给定模块进行两次重建可能会导致不同的工件,例如:
- 模块-x 依赖于模块 Y:1.2.3
- 模块-x 被构建(jar 是使用引用模块 MANIFEST 的 MANIFEST 创建:y:1.2.3)
- 修改父 POM 以设置
<module-y.version>1.2.4</module-y.version>
- 模块 y 被重建以创建 1.2.4 工件
- 构建模块 x(jar 是使用 MANIFEST 引用模块 y:1.2.4 创建的)
但请注意,#2 和 #5 都构建了模块 x,具有相同的模块 x 版本,但两个不同的嵌入式 MANIFEST 引用了不同的模块 y 版本。
我们通过使用 Jenkins CI 服务器自动化所有依赖模块来克服这种细微差别