【问题标题】:Maven versioning using git branches使用 git 分支的 Maven 版本控制
【发布时间】:2018-11-01 21:51:44
【问题描述】:

这个问题是为了获得有关使用 Maven 构建的多模块 Java 应用程序的建议版本控制系统的反馈。

我们开发了一个包含大约 15 个模块/jar 的多 jar 系统(微服务)。其中一些 (5) 是系统中其他模块使用但不在系统外部使用的库。这些模块都存储在单独的 git 存储库中。

我们已经发布了第一个版本,需要认真对待分支/版本控制。

目标:尽量减少需要完成的版本控制工作(更新版本号、由于每个分支的版本信息不同而手动合并等)。

如何:模块是通过模块名称和git分支名称来识别的,而不是模块名称和版本

我们构建自己的“版本文件”并保存为每个模块中的资源。这些包含模块本身以及包含的模块的构建时间、git commit-id、分支名称、构建 URL 等。所以部署后我们不需要任何 Maven 版本号。

注意:对于系统外的库模块,我们对内部开发和外部开发的模块都使用标准方法。 IE。使用 Maven 依赖系统进行严格编号的版本控制。

我正在考虑的系统是

  1. 始终在 pom 文件中使用版本号 <branch-name>-SNAPSHOT,并将 Maven 配置为始终获取最新的 SNAPSHOT 版本(不仅是默认情况下每天 - 参考 What exactly is a Maven Snapshot and why do we need it?)。
  2. 使用 BOM(参考 Maven BOM [Bill Of Materials] Dependency)来定义依赖关系。

此系统中模块的 pom 文件将类似于:

<project>
 ...
 <version>${revision}</version>

  <dependencies>
    <dependency>
            <groupId>mygroup</groupId>
            <artifactId>bom</artifactId>
            <version>${revision}</version>
            <type>pom</type>
            <scope>import</scope>
    </dependency>
  </dependencies>
 <properties>
   <revision>default_version</revision>
 <properties>
</project>

此版本是在构建期间通过执行 mvn 指定的,使用类似于:mvn deploy -Drevision=&lt;branch-name&gt;-SNAPSHOT(参考:https://maven.apache.org/maven-ci-friendly.html)。

正如 pom 所示,我们将(大部分)在系统中使用的每个分支名称都有一个 BOM 版本,版本名称 &lt;branch-name&gt;-SNAPSHOT - 与模块本身相同。 BOM 文件应包括使用显式版本的依赖项,也适用于系统内部模块。

示例流程:

  • 一个简单的功能分支。在分支中修改 pom,使 BOM 引用与父分支相同 - 替换 ${revision} 为 BOM 引用。 IE。您不需要单独的 BOM(目前...)
  • 内部库的简单功能分支。与之前相同,但您可能应该为使用此库的模块创建相同的分支,并为 BOM 创建相同的分支,以确保两个模块是链接的。
  • 系统版本。在所有模块(git 存储库)上创建发布分支。包括 BOM 模块。例如:release201810。在分支 release201810 的 BOM 文件中,确保使用版本 release201810-SNAPSHOT 引用所有引用的系统内部模块。
  • 并行开发。根据需要在模块上创建自定义分支。更新自定义 BOM,因为为此开发分支了模块。

这是个好主意吗?

【问题讨论】:

  • 问题太长了
  • “这是个好主意吗”是一个非常开放的问题。你能缩小范围吗?

标签: java git maven


【解决方案1】:

我有一些顾虑:

  1. 您通常将整个多模块项目放入 one git 存储库中。然后在整个项目上进行分支,而不是在单个模块上。
  2. 整个项目通常有一个 x.y.z-SNAPSHOT 形式的版本号,该版本号会随着时间的推移而增加。发布应该使用发布版本构建,而在开发过程中您可以拥有 SNAPSHOT 版本。
  3. 可以将分支构建为 x.y.z-branchname-SNAPSHOT,但同时删除版本号是非常不标准的。

我必须说,每次我偏离标准(出于充分的理由,例如公司的遗留结构),它都会在以后造成问题。

【讨论】:

  • 感谢您的 cmets。关于 1,这些模块处于可重用于其他项目和在该系统内部使用之间的某种即时状态,因此我们希望它们在单独的存储库中。关于 2 和 3,这是我试图避免的系统。但是正如您所说,尝试以非标准方式使用系统通常是一个坏主意。但是,我希望在某个时候看到一个版本控制系统,该模块的唯一标识符是 git 存储库和 git 分支名称。作为总结;我将继续以标准方式使用 Maven。
猜你喜欢
  • 2014-02-21
  • 2014-11-19
  • 1970-01-01
  • 2012-11-15
  • 2012-05-04
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
相关资源
最近更新 更多