【发布时间】:2014-03-14 03:30:25
【问题描述】:
我需要从 ant 调用 sbt。我正在使用“exec”任务执行此操作,如下所示:
<target name="publish-jar">
<exec executable="sbt.bat" failonerror="true">
<arg value="publish"/>
</exec>
</target>
如果 sbt 任务失败,我需要 ant 任务“失败”,这就是使用 failonerror="true" 的原因。但是,这不起作用。当 sbt 任务失败时,ant 不会报告构建失败。
这看起来像这里讨论的问题:Ant exec resultproperty is not working。建议的解决方法是从sbt.bat 中删除“/B”。换句话说,改变:
exit /B %ERROR_CODE%
到
exit %ERROR_CODE%
然而,正如一位评论者所说:
这样做的缺点是,如果您直接运行批处理文件进行测试,它将终止您的 shell。您可以在批处理文件中使用 if 和 arg 在 ant 调用它时选择 \b 并在不调用时正常退出。
问题:是否有修复方法,当失败发生时:(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
【问题讨论】:
标签: windows batch-file ant sbt exit-code