将exec'dbatch file中的退出代码传播回ant

我需要从ant中调用sbt。 我正在做这个“exec”任务如下:

<target name="publish-jar"> <exec executable="sbt.bat" failonerror="true"> <arg value="publish"/> </exec> </target> 

如果sbt任务失败,我需要ant任务“失败”,这就是为什么使用failonerror="true"的原因。 但是,这不起作用。 当sbt任务失败时,ant不会报告失败的构build。

这看起来像这里讨论的问题: Ant执行结果属性不起作用 。 build议的解决方法是从sbt.bat删除“/ B”。 换句话说,改变:

 exit /B %ERROR_CODE% 

 exit %ERROR_CODE% 

但是,正如一位评论者所说:

这样做的缺点是,如果直接运行batch file进行testing,它会终止你的shell。 你可以在batch file中使用一个if和一个arg来select\ b,当ant调用它时,select正常退出。

问:是否有一个解决scheme,当发生故障时:(1)不终止调用者的shell并且(2)将退出代码传播给ant?

更新

这是运行我的ant任务的输出。 实际的错误在这里并不重要(我故意不configuration一个版本库来发布,强制错误):

 C:\dev\la\sdf3\modules\test>ant publish-jar Buildfile: C:\dev\la\sdf3\modules\test\build.xml publish-jar: [exec] [info] Loading global plugins from C:\Users\jn\.sbt\0.13\plugins [exec] [info] Set current project to test (in build file:/C:/dev/la/sdf3/modules/test/) [exec] :: loading settings :: file = C:\dev\la\sdf3\modules\ivysettings.xml [exec] [info] :: delivering :: com.jn#test;SNAPSHOT :: SNAPSHOT :: integration :: Fri Mar 14 08:45:58 HST 2014 [exec] [info] delivering ivy file to C:\dev\la\sdf3\modules\com.jn\target\scala-2.10\ivy-SNAPSHOT.xml [exec] java.lang.RuntimeException: Repository for publishing is not specified. [exec] at scala.sys.package$.error(package.scala:27) [exec] at sbt.Classpaths$$anonfun$getPublishTo$1.apply(Defaults.scala:1203) [exec] at sbt.Classpaths$$anonfun$getPublishTo$1.apply(Defaults.scala:1203) [exec] at scala.Option.getOrElse(Option.scala:120) [exec] at sbt.Classpaths$.getPublishTo(Defaults.scala:1203) [exec] at sbt.Classpaths$$anonfun$57.apply(Defaults.scala:1037) [exec] at sbt.Classpaths$$anonfun$57.apply(Defaults.scala:1037) [exec] at scala.Function1$$anonfun$compose$1.apply(Function1.scala:47) [exec] at sbt.$tilde$greater$$anonfun$$u2219$1.apply(TypeFunctions.scala:42) [exec] at sbt.std.Transform$$anon$4.work(System.scala:64) [exec] at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237) [exec] at sbt.Execute$$anonfun$submit$1$$anonfun$apply$1.apply(Execute.scala:237) [exec] at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:18) [exec] at sbt.Execute.work(Execute.scala:244) [exec] at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237) [exec] at sbt.Execute$$anonfun$submit$1.apply(Execute.scala:237) [exec] at sbt.ConcurrentRestrictions$$anon$4$$anonfun$1.apply(ConcurrentRestrictions.scala:160) [exec] at sbt.CompletionService$$anon$2.call(CompletionService.scala:30) [exec] at java.util.concurrent.FutureTask.run(FutureTask.java:262) [exec] at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) [exec] at java.util.concurrent.FutureTask.run(FutureTask.java:262) [exec] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [exec] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [exec] at java.lang.Thread.run(Thread.java:744) [exec] [error] (*:publishConfiguration) Repository for publishing is not specified. [exec] [error] Total time: 0 s, completed Mar 14, 2014 8:45:59 AM BUILD SUCCESSFUL Total time: 4 seconds 

我只是做了一个简单的批次:
@echo off echo [batch] exit /b 2从上面你的ant脚本,和exec从我的批处理返回错误代码。 一切正常。
exec returned: 2

这是测试:
Apache Ant(TM) version 1.9.3 compiled on December 23 2013Apache Ant(TM) version 1.9.3 compiled on December 23 2013Windows 7 64-bit上进行了Apache Ant(TM) version 1.9.3 compiled on December 23 2013

你应该粘贴你的批处理文件和运行你的蚂蚁得到的实际结果。 要么你正在使用的Ant的版本有问题,要么是( 最有可能的 )批处理文件的错误。

请执行下列操作

  • sbt.bat publish运行sbt.bat publish
  • 在这之后立即运行echo %ERRORLEVEL%并记下结果

如果你得到0 ,你的批处理是问题。

编辑:或者,这里有一篇文章描述了一个macrodef解决方法