我们都知道,maven 的出现使得我们可以很方便的管理项目依赖,而且可以实现多模块协作编译、打包、运行。大多数情况下,我们一个 maven 项目都包含了多个子 module,这个时候如果我们想要把一个子 module 进行打包并且 deploy 到私服上供别人引用,那我们需要:从父节点把整个 project 都 deploy 上去,这时别人才能拉到你上传的 jar 包。同时我们需要保证我们整个 project 中所有的 module 的 version 都是一致的。
问题引入
对于我们来说,通常应用发展是非常快的,也就意味着我们需要上线的周期很短,对于在测试时,我们可以使用 -SNAPSHOT 的方式,这样每次上传完,引用该依赖的项目发布时,会自动再从私服上下载最新的版本来替换本地的 jar 包。但是线上我们都是使用 release 版本发布,由于 release 版本的依赖在相同的版本号下,引用该依赖的项目在发布时,不会再自动从私服上拉去最新的包来替换本地的包,所以就会出现问题。那就会有以下问题:
正式版不能重复发布,所以每次上线版本号都需要更改
当项目中包含几个子模块时,通常我们想让子模块的版本号跟父项目的版本号保持一致
子模块间也会项目依赖
最佳实践
上面的三个问题中,最容易解决的是第三个问题,我们可以在父项目的 pom 文件中的 dependencyManagement 中进行声明依赖,子模块直接使用,不需要指定版本号。
优雅地修改多模块 maven 项目中的版本号
子项目引用时,直接进行如下引用即可:
优雅地修改多模块 maven 项目中的版本号
虽然在子 pom 文件当中,我们可以不声明 groupId 和 version 属性,这样就可以实现所有子模块的版本号都和父项目保持一致了。但是在子 pom 中的 <parent></parent> 标签中的父项目的版本号还是要写的,不然编译就会报错,还不是很清楚是 maven 还没有进化到这么智能化,还是可能会造成其他混乱从而必须要求指定。我本来想投机取巧的把这个父项目的版本号也用 ${project.version} 来替换,但很可惜没能成功,install 的时候报错了,我想可能是因为必须要先初始化 <parent> 标签才能知道 ${project.version} 是多少吧!
以往对于修改父项目的版本号,我们很痛苦,每次都要把所有子模块中的父项目的版本号都替换一下,又不敢批量替换,所以只能一个一个的改掉。那我就在寻求一种更加高效的方式,可以使得我运行一个命令或者怎么样就可以实现一次性把所有要改动的地方都改掉。念念不忘,必有回响!一个偶然的机会我还真发现了一个神器,它就是 versions-maven-plugin,在项目中引入该插件以后,就可以一行命令实现修改父项目的版本号,并且子模块中的父项目版本号的声明也会一并被改掉,具体操作如下:
首先在父项目的 pom.xml 文件中,引用如下插件:
优雅地修改多模块 maven 项目中的版本号
其中 generateBackupPoms 参数是设置是否修改版本时对现有版本的文件进行备份。因为我们的项目一般都是交给 git 管理的,所以不需要让该插件帮我们备份,改错了,直接 revert 就好了。
然后,你只需要在父 pom.xml 文件所在的文件夹下打开控制台,运行:mvn versions:set -DnewVersion=xxx,这样我们就可以实现把父项目的版本修改为 xxx 了。是不是很方便?尤其当我们的项目有几十个子模块的时候,这就给我们带来很大的效率提升了。不然升级几次版本号,一天就过去了。