此问题旨在获取有关使用 Maven 构建的多模块 Java 应用程序的建议版本控制系统的反馈。
我们开发了一个包含大约 15 个模块/jar 的多 jar 系统(微服务)。其中一些 (5) 是系统中其他模块使用的库,但系统外部不使用。这些模块都存储在单独的 git 存储库中。
我们已经发布了第一个版本,需要认真对待分支/版本控制。
目标:最大限度地减少版本控制所需的工作(更新版本号、由于每个分支的版本信息不同而手动 merge 等)。
如何:模块通过模块名称和 git 分支名称来标识,而不是通过模块名称和版本
我们构建自己的“版本文件”,在每个模块中保存为资源。其中包含模块本身以及包含的模块的构建时间、git commit-id、分支名称、构建 URL 等。所以部署后我们不需要任何Maven版本号。
注意:对于系统外部的库模块,我们对内部开发和外部开发的模块都使用标准方法。 IE。使用 Maven 依赖系统进行严格的编号版本控制。
我正在考虑的系统是
- 始终使用版本号
<branch-name>-SNAPSHOT
在 pom 文件中,加上配置 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,因为模块已针对此开发进行了分支。
这是个好主意吗?
最佳答案
我有一些担忧:
- 您通常将整个多模块项目放入一个 git 存储库中。然后你在整个项目上进行分支,而不是在单个模块上。
- 整个项目通常有一个 x.y.z-SNAPSHOT 形式的版本号,该版本号会随着时间的推移而增加。发布版本应该使用发布版本来构建,而在开发过程中您可以使用快照版本。
- 可以将分支构建为 x.y.z-branchname-SNAPSHOT,但将版本号全部删除是非常不标准的。
我必须说,每次我偏离标准(出于充分的理由,例如公司的遗留结构),都会在以后引起问题。
关于java - 使用 git 分支进行 Maven 版本控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53109862/