使用 Maven 进行软件版本控制和多模块项目的最佳实践是什么?
我的意思是,当我使用 Maven 创建一个多模块项目时,版本控制的最佳方法是什么?为所有模块使用一个版本(在顶级项目中定义)?为每个模块使用一个版本(在每个模块的 POM 中定义)?我还缺少另一种方法吗?每种方法的优缺点是什么?
一般来说,不同的模块是否一起发布(可能共享相同的版本号)?
谢谢
使用 Maven 进行软件版本控制和多模块项目的最佳实践是什么?
我的意思是,当我使用 Maven 创建一个多模块项目时,版本控制的最佳方法是什么?为所有模块使用一个版本(在顶级项目中定义)?为每个模块使用一个版本(在每个模块的 POM 中定义)?我还缺少另一种方法吗?每种方法的优缺点是什么?
一般来说,不同的模块是否一起发布(可能共享相同的版本号)?
谢谢
老实说,这取决于您想做什么。创建多模块项目有多种原因,其中之一是您只需要部署已更改的内容而不是所有模块。
可以这样想:如果您有一个非多模块项目,并且您只需要更改服务层中的一行,那么您必须重新构建整个项目并再次部署所有代码......即使只有您的服务层将发生变化。
使用多模块项目,您可以重新生成项目并仅部署更改的内容……您的服务。这降低了风险,并且您确信只有您的服务模块发生了变化。
使用我未在此处列出的多模块项目还有很多好处,但是不保持模块的版本号同步肯定有很大的好处。
构建项目时,请考虑将其部署到一个存储库,该存储库将所有兼容的 jar 保存在一起以进行构建(每个构建创建一个具有最父级 pom 版本号的新文件夹)。这样,您就不需要保留有关哪些 jar 兼容的文档……它们都只是与内部版本号一起部署。
我自己正在寻找这个确切问题的解决方案,而versions-maven-plugin正是我所需要的。我不喜欢与 SCM 系统通信的发布插件。版本插件正是我们需要的:它在项目的所有 pom 中设置一个新的版本号:
mvn versions:set -DnewVersion=2.0.0
然后我可以继续提交、标签和正式的构建服务器构建......
编辑:
版本插件取决于 Maven 多模块项目的组织方式:因此,它通常不会更新复杂多模块项目中的所有 POM 文件。我发现 sed 和 find 更可靠地完成这项工作:
sed -i 's/1.0.0-SNAPSHOT/1.0.0-RC1/g' `find . -name 'pom.xml'`
通常,您创建一个多模块项目,因为您认为各个模块是一个整体的一部分。也许是客户端、控制器和服务。或者也许是带有服务的 UI。
无论如何,让各个模块的版本号同步移动是有意义的。然而,Maven 并没有将其作为一项规则强制执行。
至于你的问题
不同的模块是一起发布的(可能共享相同的版本号)
我会这么认为。这就是让它成为一个多模块项目的原因之一。否则,您可以将模块作为独立项目。
当然,这是一种充满边缘情况和例外的东西;-)
我正在做的一个项目也遇到了同样的问题。我还决定使用单独的版本,甚至只有在某些托管依赖项发生更改时才需要更新对父 pom 的依赖项。(所以大部分是@vinnybad 描述的)
使用“org.honton.chas.exists-maven-plugin”只会将模块部署到实际更改的存储库中,这真的很棒,因为只有在某些情况下才会发布相应的 docker-images其中一项服务发生了变化。这避免了使用不同但未更改的版本“污染”图像存储库。
这种方法的一个主要缺点是有关版本控制的问题:
为了解决这个问题,我将所有模块版本放入父 pom 的依赖管理部分,即使没有其他模块依赖它们。“集成测试”模块可以通过依赖所有模块来解决这个问题——当然还要一起测试它们。
这样,我将“被迫”在每次更改时更新父 pom,因为它指的是已发布的模块版本。这样,父 pom 将具有“领先”版本,并且在依赖管理块状态下,所有模块的版本相互兼容(这将通过集成测试来确保)。