SBT停止运行而没有退出

dsg*_*dsg 118 scala terminate sbt

如何在不退出的情况下终止SBT中的运行?

我正在尝试CTRL + C,但它退出了SBT.有没有办法在保持SBT打开的同时退出正在运行的应用程序?

Jon*_*nso 81

从sbt版本0.13.5开始,您可以添加到build.sbt

cancelable in Global := true
Run Code Online (Sandbox Code Playgroud)

它被定义为"启用(true)或禁用(false)使用CTRL + C中断任务执行的能力." 在Keys定义中

如果您使用的是Scala 2.12.7+,也可以使用CTRL + C取消编译.参考https://github.com/scala/scala/pull/6479

报告了一些错误:


Set*_*sue 44

在默认配置中,您的运行发生在sbt正在运行的同一JVM中,因此您无法轻松地单独终止它们.

如果您在Forking中描述的单独的分叉JVM中运行,那么您可以在不影响sbt的JVM的情况下终止该JVM(无论您的操作系统提供什么):

fork in run := true
Run Code Online (Sandbox Code Playgroud)

  • 我正在努力做到这一点.具体来说,我已实施:http://stackoverflow.com/questions/3868863/how-to-specify-jvm-maximum-heap-size-xmx-for-running-an-application-with-run/4054152#4054152但是当我按CTRL + C时,sbt仍然会退出.我如何杀死分叉的JVM? (9认同)
  • 从命令行,或在任务管理器(Windows),或强制退出或活动监视器(Mac OS X)等中使用`kill`. (2认同)

kil*_*ilo 5

当我控制从sbt运行的应用程序的主循环时,发现以下有用的东西。

我告诉sbt在运行应用程序时(在build.sbt中)分叉:

fork in run := true
Run Code Online (Sandbox Code Playgroud)

我还告诉sbt将stdin从sbt外壳转发到应用程序(在build.sbt中):

connectInput in run := true
Run Code Online (Sandbox Code Playgroud)

最后,在应用程序的主线程中,我在stdin上等待文件结束,然后关闭JVM:

while (System.in.read() != -1) {}
logger.warn("Received end-of-file on stdin. Exiting")
// optional shutdown code here
System.exit(0)
Run Code Online (Sandbox Code Playgroud)

当然,您可以使用任何线程读取stdin和shutdown,而不仅仅是主线程。

最后,启动sbt,可以选择切换到要运行的子项目。

现在,当您想停止该进程时,通过在sbt shell中键入CTRL-D来关闭其stdin。