我们现在通用的maven项目结构可能是这样的:
*parent module*
*module A*
*module B*
大家遇到过以下几个问题没?
1.maven多个模块之间互相依赖,一个模块更新影响另一个模块的运行;
2.maven 不小心把开发版jar包deploy到远程仓库,影响到了线上的正式环境;
3.团队有人更新了SNAPSHOT版本,你rebuild之后无法运行;
一个父模块下有几个子模块,父模块包含所有子模块的公共依赖,比如使用的日志系统;指定公共的模块版本,比如数据库驱动版本等等。
同时子模块都继承父模块,就有个很常见的问题产生,如果父模块的版本更新了,需要手动一个一个子模块修改继承的父模块的版本号,例如下面的例子:
<!--父模块版本信息-->
<version>1.1.0-SNAPSHOT</version>
<modules> <module>pulldata-contract</module> <module>pulldata-common-service</module> <module>pulldata-notifyservice</module> <!--<!–<module>pulldata-pullservice</module>–>--> <module>pulldata-dataproviders</module> <module>pulldata-webservice</module> <module>pulldata-mqservice</module> <module>hbxj-dataproviders</module> </modules>
一个父模块下有7个子模块,如果父模块的version从1.1.0-SNAPSHOT更新到了1.1.1-SNAPSHOT,每一个子模块都需要一个个更新,其实说这么多就是为了引出maven的版本管理插件 Versions,
verisons提供了很多好用的功能,我们看下怎么解决刚才说的问题:
1,先安装,很简单,在父pom文件中加入如下代码:
<build> <pluginManagement> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>versions-maven-plugin</artifactId> <version>2.7</version> </plugin> </plugins> </pluginManagement> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>versions-maven-plugin</artifactId> <version>2.7</version> </plugin> </plugins> </build>
2. 比如上面这个问题,我们可以直接运行一条maven指令:
mvn -N versions:update-child-modules //更新所有的子模块继承的父模块版本号
就可以把所有继承的子模块更新为和父模块一致了。
3.还有很多好用的功能,
3.1我们开发的版本一般用SNAPSHOT版本,线上版本用RELEASE版本,一般SNAPSHOT 没有自定义或手动deploy的话,deploy的频率是一天一次。
为了防止你项目中依赖的SNAPSHOT版本的代码因为团队其他同事的deploy操作而变得不可用,可以先用
mvn versions:lock-snapshots
锁住当前项目中的snapshot依赖包,开发完成之后再用
mvn versions:unlock-snapshots
解锁。
3.2 下面这个命令很有用,可以设置整个项目的版本号,在你需要设置新版本号,可以全局更新项目版本号。一般开发环境就设置成SNAPHSHOT版本,测试测完之后没问题设置成Release版。
mvn versions:set -DnewVersion=1.0.1-SNAPSHOT //更新整个项目版本
3.3 其他命令参考文档
versions:set versions:lock-snapshots versions:resolve-ranges versions:unlock-snapshots versions:update-child-modules versions:update-parent versions:update-properties versions:set-property versions:use-latest-releases versions:use-latest-snapshots versions:use-latest-versions versions:use-next-releases versions:use-next-snapshots versions:use-next-versions versions:use-releases
我一般主要用到的几个还是上面提到的。
另外附一些我常用mvn指令
mvn clean package -pl 要编译module目录 -am -Pdev -DskipTests // -pl 只编译指定module 节省时间 -am 指定module依赖的模块也编译
mvn clean install //安装jar包到本地仓库
mvn deploy //deploy jar包到远程仓库
参考 https://danielflower.github.io/2015/03/08/The-Multi-Module-Maven-Release-Plugin-for-Git.html