将exec'd批处理文件中的退出代码传播回ant

Jim*_*imN 5 windows ant batch-file exit-code sbt

我需要从蚂蚁那里打电话给sbt.我正在使用"exec"任务执行此操作,如下所示:

  <target name="publish-jar">
    <exec executable="sbt.bat" failonerror="true">
      <arg value="publish"/>
    </exec>
  </target>
Run Code Online (Sandbox Code Playgroud)

如果sbt任务失败,我需要ant任务"失败",这就是使用的原因failonerror="true".但是,这不起作用.当sbt任务失败时,ant不会报告失败的构建.

这看起来像这里讨论的问题: Ant exec resultproperty不起作用.建议的解决方法是从中删除"/ B" sbt.bat.换句话说,改变:

exit /B %ERROR_CODE%
Run Code Online (Sandbox Code Playgroud)

exit %ERROR_CODE%
Run Code Online (Sandbox Code Playgroud)

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

这样做的缺点是,如果直接运行批处理文件进行测试,它将终止你的shell.您可以在批处理文件中使用if和arg来选择\ b,当ant调用它时,正常退出时不选择.

问题: 当发生故障时是否有修复:(1)不终止调用者的shell和(2)将退出代码传播给ant?

更新

这是运行我的ant任务的输出.实际错误在这里并不重要(我故意不配置存储库来发布,强制错误):

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
Run Code Online (Sandbox Code Playgroud)

Sla*_*lav 2

我刚刚做了一个简单的批处理:
@echo off echo [batch] exit /b 2 以及上面的 ant 脚本,并且 exec 返回了我的批处理中的错误代码。一切都很好。
exec returned: 2

这是在
Apache Ant(TM) version 1.9.3 compiled on December 23 2013以下位置测试的:Windows 7 64-bit

您应该粘贴批处理文件和运行 ant 得到的实际结果。您使用的 Ant 版本有问题,或者(很可能)批处理文件有问题。

请执行下列操作

  • sbt.bat publish从命令行运行
  • 之后立即运行echo %ERRORLEVEL%并记下结果

如果您收到0,则说明您的批次有问题。

编辑: 或者,这里有一篇文章描述了宏定义的解决方法