Maven 父 POM 的源代码版本控制

Source code versioning of Maven Parent POM

我管理一个 Maven POM 项目,该项目(与 POM 项目一样)由 1 个文件组成:pom.xml。有多个其他项目从该 POM 继承设置。父 pom 不作为聚合器;其中没有定义模块。

由于 POM 项目与依赖于它的项目具有不同的发布周期和版本历史记录,因此将它放在单独的 SCM 存储库中对我来说似乎是合乎逻辑的。这个想法是在提交时触发自动构建作业,然后可以将新的 POM 发布到中央工件存储库 (Nexus)。这导致我有一个包含 1 个文件的 Git 回购协议。

问题:这是 normal/desired 处理 POM 项目源代码版本控制的方法吗?

一个通用的全球(或企业)父 pom 被认为是一个独立的产品,它本身就是一个工件,有自己的生命周期和 CI 作业(将它发布到 Maven 存储库,比如Nexus 在你的情况下),因此也有自己的版本控制库。

此外,它也可能不是只有一个文件的存储库,即基本的 pom.xml 文件,但还提供更多资源。例如,site folder,其 site.xml 文件指定了一个额外的报告或部分。如果是 git 存储库,它还应该提供一个有据可查的 README.md 文件。


根据经验,由于全局 Maven 父 POM 被许多不同的项目使用,因此最好注意其版本控制和发行说明。出于这个原因,我建议有以下内容:

  • 具有以下site.xml配置的site文件夹(作为示例):
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/DECORATION/1.4.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/DECORATION/1.4.0
                            http://maven.apache.org/xsd/decoration-1.4.0.xsd">
        <body>
            <menu ref="reports" />
            <menu name="Release Notes">
                <item name="0.0.1" href="release-notes-0.0.1.html" />
            </menu>
        </body>
    </project>
    
  • site 下的附加 markdown 文件夹提供每个版本的发行说明。例如,从上面的 href 中,将选取以下文件:release-notes-0.0.1.md.vm,提供有关其发布的信息,然后将在 POM 的 Maven 站点中结束。

如您所见,存储库可能包含多个 pom.xml 文件,即使对于超级父 POM 也是如此。因此,它应该始终有自己的版本控制(在本例中为 git)存储库。


补充说明:

  • 全局父 POM 通常应用 -parent 后缀(例如 maven-parent, spring-parent, hibernate-parent)。虽然不是标准,但这是事实上的约定,建议遵循
  • 对于 POM 部分,最好遵循 Maven official layout
  • 根据个人经验,避免使用 SNAPSHOT 版本:最好有多个次要(但固定)版本的公共父 POM,而不是不稳定或可能影响 SNAPSHOT 版本:它是全局父pom,它的目标是提供治理和通用的最小配置,它不应该引入不稳定。

您会在这里找到详细的解决方案

Single click code-versioning (Complimenting cloud-native Architecture)

我们的想法是使用 maven 插件 jgit-flow 插件并使用 Jenkins 和这个插件我们创建了整个管道来自动化这个过程。