You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Maven多模块项目:寻找替代mvn package的精准打包插件调用方案

如何在拆分的CI任务中通用替代mvn package执行对应打包插件?

我的CI系统必须把Maven拆成三个独立任务:

  1. 只做编译和测试编译:mvn compiler:compile compiler:testCompile
  2. 只跑测试:mvn surefire:test
  3. 只做打包+部署

这套系统要适配各种项目:单模块的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 15:23:11