Maven多模块项目:寻找替代mvn package的精准打包插件调用方案
如何在拆分的CI任务中通用替代
mvn package执行对应打包插件? 我的CI系统必须把Maven拆成三个独立任务:
- 只做编译和测试编译:
mvn compiler:compile compiler:testCompile - 只跑测试:
mvn surefire:test - 只做打包+部署
这套系统要适配各种项目:单模块的Jar/War/Ear、多模块项目(顶级POM是pom类型,子模块混合不同打包类型)。之前用mvn package -DskipTests这类生命周期命令,会触发不该执行的前置阶段;换成直接调jar:jar这类插件目标,又没法通用适配所有打包类型,特别是多模块场景。
最优方案:用mvn package加跳过参数
不用放弃生命周期命令,只要加参数跳过已经在前置任务完成的环节,就能让mvn package只执行打包插件的目标,不会触发编译、测试等操作,还能完美适配所有项目类型。
打包任务用这个命令
mvn package -Dmaven.compile.skip=true -Dmaven.test.skip=true -Dmaven.install.skip=true
-Dmaven.compile.skip=true:跳过所有编译操作(包括主代码和测试代码编译),这些已经在第一个任务做完了-Dmaven.test.skip=true:跳过测试执行和测试编译,避免重复操作-Dmaven.install.skip=true:跳过把包装到本地仓库的步骤(如果你的流程不需要的话)
部署任务配套命令
部署的时候直接跑:
mvn deploy:deploy -Dmaven.compile.skip=true -Dmaven.test.skip=true -Dmaven.packaging.skip=true
-Dmaven.packaging.skip=true:跳过打包,因为已经在前面的任务完成了
备用方案:脚本动态判断打包类型(必须直接调插件的场景)
如果你的流程严格要求不能用生命周期命令,只能直接调用插件目标,可以用CI脚本动态获取每个模块的打包类型,拼接对应的命令:
单模块项目脚本
# 获取当前项目的打包类型 PACKAGING=$(mvn help:evaluate -Dexpression=project.packaging -q -DforceStdout) # 映射对应的插件目标 case "$PACKAGING" in jar) PACKAGE_GOAL="jar:jar" ;; war) PACKAGE_GOAL="war:war" ;; ear) PACKAGE_GOAL="ear:ear" ;; pom) PACKAGE_GOAL="" ;; # pom类型不需要打包 *) echo "不支持的打包类型: $PACKAGING" && exit 1 ;; esac # 执行打包(如果有目标的话) if [ -n "$PACKAGE_GOAL" ]; then mvn "$PACKAGE_GOAL" fi
多模块项目脚本
遍历所有子模块,分别处理:
# 获取所有子模块路径 MODULES=$(mvn help:evaluate -Dexpression=project.modules -q -DforceStdout | tr -d '[],' | xargs) for MODULE in $MODULES; do # 进入子模块获取打包类型 PACKAGING=$(cd "$MODULE" && mvn help:evaluate -Dexpression=project.packaging -q -DforceStdout) case "$PACKAGING" in jar) PACKAGE_GOAL="jar:jar" ;; war) PACKAGE_GOAL="war:war" ;; ear) PACKAGE_GOAL="ear:ear" ;; pom) continue ;; # 跳过pom类型的子模块 *) echo "子模块 $MODULE 不支持的打包类型: $PACKAGING" && exit 1 ;; esac # 在子模块执行打包目标 mvn -f "$MODULE/pom.xml" "$PACKAGE_GOAL" done
方案对比
| 方案 | 优势 | 劣势 |
|---|---|---|
| 生命周期+跳过参数 | 完全通用,不用写额外脚本,Maven原生支持,适配所有项目 | 依赖参数生效,要确认项目没自定义覆盖这些参数 |
| 脚本动态判断 | 严格直接调用插件目标,完全避免生命周期前置阶段 | 要维护CI脚本,多模块场景处理更复杂 |
内容的提问来源于stack exchange,提问作者Wouter Verhelst
相关产品推荐
相关产品推荐

