24

使用 Maven 进行软件版本控制和多模块项目的最佳实践是什么?

我的意思是,当我使用 Maven 创建一个多模块项目时,版本控制的最佳方法是什么?为所有模块使用一个版本(在顶级项目中定义)?为每个模块使用一个版本(在每个模块的 POM 中定义)?我还缺少另一种方法吗?每种方法的优缺点是什么?

一般来说,不同的模块是否一起发布(可能共享相同的版本号)?

谢谢

4

4 回答 4

7

老实说,这取决于您想做什么。创建多模块项目有多种原因,其中之一是您只需要部署已更改的内容而不是所有模块。

可以这样想:如果您有一个非多模块项目,并且您只需要更改服务层中的一行,那么您必须重新构建整个项目并再次部署所有代码......即使只有您的服务层将发生变化。

使用多模块项目,您可以重新生成项目并仅部署更改的内容……您的服务。这降低了风险,并且您确信只有您的服务模块发生了变化。

使用我未在此处列出的多模块项目还有很多好处,但是不保持模块的版本号同步肯定有很大的好处。

构建项目时,请考虑将其部署到一个存储库,该存储库将所有兼容的 jar 保存在一起以进行构建(每个构建创建一个具有最父级 pom 版本号的新文件夹)。这样,您就不需要保留有关哪些 jar 兼容的文档……它们都只是与内部版本号一起部署。

于 2011-11-30T18:13:03.333 回答
5

我自己正在寻找这个确切问题的解决方案,而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'`
于 2012-01-11T11:17:51.507 回答
3

通常,您创建一个多模块项目,因为您认为各个模块是一个整体的一部分。也许是客户端、控制器和服务。或者也许是带有服务的 UI。

无论如何,让各个模块的版本号同步移动是有意义的。然而,Maven 并没有将其作为一项规则强制执行。

至于你的问题

不同的模块是一起发布的(可能共享相同的版本号)

我会这么认为。这就是让它成为一个多模块项目的原因之一。否则,您可以将模块作为独立项目。

当然,这是一种充满边缘情况和例外的东西;-)

于 2011-11-30T17:59:51.300 回答
0

我正在做的一个项目也遇到了同样的问题。我还决定使用单独的版本,甚至只有在某些托管依赖项发生更改时才需要更新对父 pom 的依赖项。(所以大部分是@vinnybad 描述的)

两个补充

存在-maven-插件

使用“org.honton.chas.exists-maven-plugin”只会将模块部署到实际更改的存储库中,这真的很棒,因为只有在某些情况下才会发布相应的 docker-images其中一项服务发生了变化。这避免了使用不同但未更改的版本“污染”图像存储库。

版本控制

这种方法的一个主要缺点是有关版本控制的问题:

  • 我的项目的当前版本是什么?
  • 哪些模块版本可以相互配合?(甚至认为它们并不直接相互依赖,一个确实依赖于另一个所做的,例如它们共享数据库模式)

为了解决这个问题,我将所有模块版本放入父 pom 的依赖管理部分,即使没有其他模块依赖它们。“集成测试”模块可以通过依赖所有模块来解决这个问题——当然还要一起测试它们。

这样,我将“被迫”在每次更改时更新父 pom,因为它指的是已发布的模块版本。这样,父 pom 将具有“领先”版本,并且在依赖管理块状态下,所有模块的版本相互兼容(这将通过集成测试来确保)。

于 2021-02-10T11:12:46.277 回答