在部署任何模块之前,让maven父项目测试所有模块

时间:2012-10-08 13:01:40

标签: java maven

我有一个传统的maven设置与父项目和许多模块子项目。当我执行mvn deploy时,它会按顺序(深度优先)为每个项目运行完整生命周期(包括test)到deploy。如果任何项目无法构建,我想避免部署任何子项目。换句话说,我希望整个父项目的deploy是“全有或全无”。有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:8)

Maven本身不能这样做(还)。目前,构建过程单独运行每个模块上的所有目标。有计划允许目标看到全局,但这可能是Maven 4。

同时,您可以使用一个小shell脚本:

 mvn clean install && mvn deploy -DskipTests=true

第一次运行构建了一切。第二次运行不会做太多(所有代码都已编译,并且跳过了长测试),所以速度非常快。

我实际上更喜欢这种方法,因为我的脚本还将任何现有的distributionManagement元素替换为我公司缓存的元素。这意味着我可以为公司部署任何项目,而无需对原始POM进行任何更改。这是脚本:

#!/bin/bash

if [[ ! -e pom.xml ]]; then
    echo "Missing pom.xml" 1>&2
    exit 1
fi

sed \
    -e '/<distributionManagement>/,/<\/distributionManagement>/d' \
    -e '/<\/project/d' \
    pom.xml > pom-deploy.xml || exit 1

cat >> pom-deploy.xml  <<EOF


    <!-- ADDED BY $0 -->
    <distributionManagement>
        ... whatever you need ...
    </distributionManagement>
</project>
EOF

mvn -f pom-deploy.xml clean install && \
    mvn -f pom-deploy.xml deploy -DskipTests=true && \
    rm pom-deploy.xml

exit 0

gist

答案 1 :(得分:3)

如果您的远程存储库是Sonatype Nexus Pro实例,那么Nexus Pro的“Staging”工具将允许原子发布到存储库。

如果您使用的是Jenkins,则会有一个延迟部署插件,它会将所有工件部署为构建后(或非常后构建)的操作(不介意使用哪个存储库管理器)

最后,我对mrm-maven-plugin @ codehaus的一个中期长期目标是允许本地升级部署,以便您能够执行类似

的操作
mvn mrm:catch-deploy deploy mrm:push-deploy

但是最后一个还没写好!