exec maven 插件:退出代码

Sch*_*tze 4 bash maven exec-maven-plugin

我有以下插件来运行.sh脚本:

<plugin>
  <artifactId>exec-maven-plugin</artifactId>
  <groupId>org.codehaus.mojo</groupId>
  <executions>
    <execution>
      <id>deploy-bundles</id>
      <phase>install</phase>
      <goals>
        <goal>exec</goal>
      </goals>
      <configuration>
        <executable>${basedir}/deploy.sh</executable>
        <successCodes>
            <successCode>0</successCode> <-- Not working
        </successCodes>
      </configuration>
    </execution>
  </executions>
</plugin>
Run Code Online (Sandbox Code Playgroud)

它将一些文件夹和文件复制到某些位置。有用。但是,为了以防万一,我希望有一个失败错误机制。set -e我的.sh脚本中已经有了命令,但我也想要一个 Maven 解决方案。我听说有一个名为的标签successCodes,我尝试合并它。但到目前为止没有运气。有人能指出正确的做法吗?

编辑:我的.sh脚本如下所示:

cp ../template/config.properties $component/conf
cp ../../runtime/group1/group1.mw/conf/log4j.xml $component/conf
# if the component is planning, create an additional folder called plans
if [[ $component == *".planning"* ]] 
then
mkdir -p $component/plans
    # copy all the plans here
    cp ../../mission.planning/plans/* $component/plans
fi  
Run Code Online (Sandbox Code Playgroud)

如果这些文件夹/文件不存在,预计会失败。因此,作为测试,我手动更改了上面的路径并期望它失败。它确实使执行过程失败并告诉我错误(因为我set -e.sh脚本中有命令),但是 maven 报告为“成功”。

Tun*_*aki 5

这不是 Exec Maven 插件的问题,而是在 Shell 脚本中处理退出代码的问题。

successCodes参数在可执行文件的退出代码不同于“成功执行”的 0 的情况下很有用:

对于不合规的应用程序(应用程序不返回 0 表示成功),退出代码将被解析为成功执行。

默认行为是将退出代码 0 视为成功执行,所有其他行为都视为失败,在这种情况下插件将无法构建。

在您的 Shell 脚本中,您有多个命令,每个命令都有自己的退出代码。没有任何额外的处理,脚本本身的退出代码,作为一个整体,就是最后一个命令的退出代码。因此,即使其中一个命令失败(因此其退出代码不为零),之后的成功命令也会将脚本退出代码重置为 0。您可以通过在 Maven 外部的命令行上调用脚本来测试这一点,并回显的$?变量,它包含的退出代码

因此,您需要测试可能在您的 Shell 中失败的每个调用命令的退出代码。(您也可以使用一些算术来累积每个退出代码。)