2016-08-03 73 views
1

我有以下插件运行.sh脚本:EXEC Maven插件:退出代码

<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> 

其拷贝一些文件夹和文件到一定的位置。有用。不过,为了以防万一,我希望有一个错误失败机制。我在.sh脚本中已经有set -e命令,但我也想要一个maven解决方案。我听说有一个叫successCodestag,我试着把它合并。但到目前为止没有运气。有人能指出正确的做法吗?

编辑:.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 

情况,预计万一失败,这些文件夹/文件不存在。所以,作为一个测试,我手动更改上面的路径,并期望它失败。它执行失败并告诉我错误(因为我在.sh脚本中有set -e命令),但maven报告是“成功”的。

回答

2

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

退出代码被解析为成功执行对不符合规定的应用程序(应用程序不返回:

successCodes参数情况下可执行的具有比0为“成功执行”不同的退出代码是有用0表示成功)。

The default behaviour是考虑退出代码0作为一个成功的执行,并作为失败的所有其他人,该插件会在这种情况下构建失败。

在您的Shell脚本中,您有多个命令,each of which has its own exit code。作为一个整体,脚本本身的退出代码没有任何额外的处理,就是最后一个命令的退出代码。因此,即使其中一个命令失败(因此其退出代码不为零)之后的成功命令也会将脚本退出代码重置为0.您可以通过在Maven之外的命令行上调用脚本来测试该脚本,并且可以使用echo $?变量,which contains the exit code

因此,您需要测试可能在您的Shell中失败的每个调用命令的退出代码。 (您也可以使用a bit of arithmetic累积每个退出代码。)

+0

完美答案,谢谢。 –