Maven:多模块项目和版本控制

时间:2011-11-30 17:15:39

标签: maven versioning multi-module

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

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

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

由于

4 个答案:

答案 0 :(得分:6)

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

以这种方式思考:如果你有一个非多模块项目而你只需要更改服务层中的一行,你必须重建整个项目并再次部署所有代码......甚至虽然只有你的服务层会改变。

使用多模块项目,您可以重新生成项目并仅部署更改了...您的服务。这样可以降低风险,并确保只更改了服务模块。

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

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

答案 1 :(得分:5)

我自己正在为这个问题寻找解决方案,versions-maven-plugin正是我所需要的。我不喜欢与SCM系统通信的发布插件。版本插件正是我们所需要的:它在项目的所有poms中设置一个新的版本号:

mvn versions:set -DnewVersion=2.0.0

然后我可以继续提交,标签和官方构建服务器构建......

修改

版本插件取决于maven多模块项目的组织方式:因此,它通常不会更新复杂的多模块项目中的所有POM文件。 我发现sed并且找到了更可靠的工作:

sed -i 's/1.0.0-SNAPSHOT/1.0.0-RC1/g' `find . -name 'pom.xml'`

答案 2 :(得分:2)

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

在任何情况下,让各个模块的版本号以锁定步骤移动是有意义的。但是,Maven并不强制执行

关于你的问题

  

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

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

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

答案 3 :(得分:0)

我在使用 a project I`m working on 时遇到了同样的问题。我还决定使用单独的版本,甚至只有在某些托管依赖项发生更改时才需要更新对父 pom 的依赖项。 (主要是@vinnybad 描述的)

两个补充

exists-maven-plugin

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

版本控制

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

  • 我的项目的当前版本是什么?
  • 哪些模块版本可以相互配合? (即使认为它们不直接相互依赖,一个依赖另一个做什么,例如它们共享数据库架构)

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

这样我将“被迫”在每次更改时更新父 pom,因为它指的是已发布的模块版本。这样父 pom 将拥有“领先”版本,并在依赖项管理块中声明所有相互兼容的模块的版本(这将由集成测试确保)。