1

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

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

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

一旦发布完成,我们希望能够迭代地更改所有 pom。

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

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

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

4

1 回答 1

1

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

因此,如果我需要更新对 some 的引用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>

并且任何引用它的 POM 也com.myco:module-x都通过它来引用它${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被修改为设置<module-y.version>1.2.4</module-y.version>
  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 服务器自动化所有依赖模块来克服这种细微差别

于 2015-02-02T14:58:20.830 回答