6

最近发布了一个maven项目,忍不住想整个过程非常复杂,容易出错。假设我有一个应用程序,它由 3 个模块 A、B 和 C 组成,每个模块在 subversion 中都有自己的文件夹,在 Hudson 中有一个单独的构建作业。每个模块都有一个父 POM,它聚合了多个工件。A 依赖于 B,B 依赖于 C。依赖版本在顶级 POM D 中定义,它是 A、B 和 C 的父级。它除了确保所有版本都保存在一个位置之外,什么也不做。整个项目中使用的每个工件只有一个版本。为了发布,我执行以下操作:

  1. 通过 Hudson 使用发布插件发布顶级 POM D。
  2. 从没有进一步依赖关系的 C 开始。
  3. 更改 C 以引用 D 的已发布版本。使用发布插件发布 C。
  4. 在 D 中输入 C 的发布版本,这样依赖 C 的模块就可以用 C 的稳定版本发布。
  5. 使用发布插件再次发布 D。
  6. 为 B 做 3-5
  7. 为 A 做 3-5

之后,我对 A、B 和 C 中的所有工件进行了稳定的非快照构建,并且可以将它们组装在一起以形成应用程序的最终稳定版本。

实际上,我不仅有 3 个,而且有 20 个这样的模块。现在我发现这个过程非常复杂,我认为它有很多潜在的问题:

  • 我需要多次发布 D,对于依赖层次结构中的每个级别一次。最后,我得到了 D,其中只有稳定版本的 A、B 和 C。要继续下一个开发版本,我必须再次编辑 D 并引用已发布模块的所有新快照版本。通常,依赖管理必须全部手动完成,即使使用发布插件也是如此。

  • 如果有人在我发布时提交,可能会搞砸事情。为了确保我必须检查所有模块的特定修订版,构建并测试它,然后发布该修订版上的所有模块。但是,我如何确保 Hudson 和多个工作?

  • 依赖于 3 个不同的系统:Subversion 服务器、Hudson 服务器和 Maven 存档服务器。如果只有一个倒下,我就不能再释放了。

  • 耗时的。在这个过程中,我发布的每个模块一次又一次地进行大量的构建、打包、上传、下载、提取等。与存档发生大量冗余数据交换。但实际上一切都可以在本地完成,因为 Hudson 拥有它需要的所有源代码。最后只需要上传一次最终包。

  • 假设我在存档服务器上丢失了包。没有简单的方法可以告诉 Hudson 检查标记的版本并以正确的顺序重新构建它们。

为什么这不像一次性检查所有代码、调整一个全局版本、构建和测试它、提交、标记提交并最终上传二进制文件那样简单?

感谢您对此的任何想法。

4

2 回答 2

1

就这么容易。使用父 pom,您可以让所有模块指向同一个父级。然后将子模块版本设置为: ${version.properties},当您运行构建时使用mvn -Dversion.properties x.y.x-SNAPSHOT(用于开发)或x.y.z生产构建运行它,那么所有模块将一次部署为相同的版本。

因此,对于要在 settings.xml 中指定的自动构建<version.properties>1.1.1-SNAPSHOT</version.properties>,如果您需要已发布的产品,请在运行时指定一个附加参数-Dx.y.z以覆盖 settings.xml 文件。

唯一的窍门是你的父 pom 需要有一个非动态指定的版本,并且也需要在所有子文档中设置。因此,在每个版本之后,您可能需要手动更新该版本号(尽管可能有一个插件)

于 2011-03-12T19:42:19.710 回答
0

如果你总是同步发布你的模块,我将为整个项目创建一个父 pom,其中包括所有模块并确保所有版本都相同。当您发布顶层时,它会一次性发布所有模块和正确的版本。

于 2011-03-12T19:55:16.350 回答