【发布时间】:2018-11-01 21:51:44
【问题描述】:
这个问题是为了获得有关使用 Maven 构建的多模块 Java 应用程序的建议版本控制系统的反馈。
我们开发了一个包含大约 15 个模块/jar 的多 jar 系统(微服务)。其中一些 (5) 是系统中其他模块使用但不在系统外部使用的库。这些模块都存储在单独的 git 存储库中。
我们已经发布了第一个版本,需要认真对待分支/版本控制。
目标:尽量减少需要完成的版本控制工作(更新版本号、由于每个分支的版本信息不同而手动合并等)。
如何:模块是通过模块名称和git分支名称来识别的,而不是模块名称和版本
我们构建自己的“版本文件”并保存为每个模块中的资源。这些包含模块本身以及包含的模块的构建时间、git commit-id、分支名称、构建 URL 等。所以部署后我们不需要任何 Maven 版本号。
注意:对于系统外的库模块,我们对内部开发和外部开发的模块都使用标准方法。 IE。使用 Maven 依赖系统进行严格编号的版本控制。
我正在考虑的系统是
- 始终在 pom 文件中使用版本号
<branch-name>-SNAPSHOT,并将 Maven 配置为始终获取最新的 SNAPSHOT 版本(不仅是默认情况下每天 - 参考 What exactly is a Maven Snapshot and why do we need it?)。 - 使用 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=<branch-name>-SNAPSHOT(参考:https://maven.apache.org/maven-ci-friendly.html)。
正如 pom 所示,我们将(大部分)在系统中使用的每个分支名称都有一个 BOM 版本,版本名称 <branch-name>-SNAPSHOT - 与模块本身相同。 BOM 文件应包括使用显式版本的依赖项,也适用于系统内部模块。
示例流程:
- 一个简单的功能分支。在分支中修改 pom,使 BOM 引用与父分支相同 - 替换
${revision}为 BOM 引用。 IE。您不需要单独的 BOM(目前...) - 内部库的简单功能分支。与之前相同,但您可能应该为使用此库的模块创建相同的分支,并为 BOM 创建相同的分支,以确保两个模块是链接的。
- 系统版本。在所有模块(git 存储库)上创建发布分支。包括 BOM 模块。例如:
release201810。在分支release201810的 BOM 文件中,确保使用版本release201810-SNAPSHOT引用所有引用的系统内部模块。 - 并行开发。根据需要在模块上创建自定义分支。更新自定义 BOM,因为为此开发分支了模块。
这是个好主意吗?
【问题讨论】:
-
问题太长了
-
“这是个好主意吗”是一个非常开放的问题。你能缩小范围吗?