公司项目区使用maven,用maven的module划分了项目中各层的代码,维护其中的依赖关系,其中junit测试层依赖了web层(war类型module),因此无法直接通过maven命令打包,因为war包无法打到jar里。
示例pom:
<modules>
<module>common/dal</module>
<module>common/util</module>
<module>core/model</module>
<module>core/service</module>
<module>biz/shared</module>
<module>biz/task</module>
<module>biz/service-impl</module>
<module>common/service/facade</module>
<module>common/service/integration</module>
<module>web/home</module>
<module>deploy</module>
<module>test</module>
</modules>
此问题由来已久,但一直未真正解决,期间使用git切分支,在release分支上删除test模块的方式解决打包问题,但公司内部还有人在使用svn,git的分支特性并不能很好地被应用,也不适合为了这么一点事推翻公司固有的传统。
解决这个问题最好的办法就是通过命令,选择性地编译和打包,而此前半年多,我竟然始终没有google,baidu到合适的方法。苍天,原来解决的方法就在 help 里:
usage: mvn [options] [<goal(s)>] [<phase(s)>]
Options:
-am,--also-make If project list is specified, also
build projects required by the
list
-amd,--also-make-dependents If project list is specified, also
build projects that depend on
projects on the list
...
-pl,--projects <arg> Build specified reactor projects
instead of all projects
...
-am:如果 pl 参数存在,就同时构建 pl 参数所列模块依赖的其他模块
-amd:如果 pl 参数存在,就同时构建依赖于 pl 参数所列模块的其他模块
-pl,--projects <arg>:构建指定模块,多个模块用逗号(,)分隔
最终POM文件不用做任何变更,只要在打包脚本中使用以下命令即可实现排除test模块构建:
mvn clean package -pl deploy -am -Dmaven.test.skip
模块名如果包含/也是可以的
mvn clean package -pl common/service/facade,common/util -am -Dmaven.test.skip
感叹下,学会 --help 是多么重要