SBT停止运行而没有退出

时间:2011-02-28 01:45:30

标签: scala sbt terminate

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

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

4 个答案:

答案 0 :(得分:76)

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

cancelable in Global := true

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

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

报告了一些错误:

答案 1 :(得分:42)

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

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

fork in run := true

答案 2 :(得分:5)

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

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

fork in run := true

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

connectInput in run := true

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

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

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

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

现在,当你想要停止进程时,通过在sbt shell中键入CTRL-D来关闭它的stdin。

答案 3 :(得分:0)

请考虑使用sbt-revolver。我们在公司中使用它,非常方便。 对于您的要求,可以通过以下方式完成:

reStart

reStop

无需配置build.sbt文件。

您可以通过添加以下内容来使用此插件:

addSbtPlugin("io.spray" % "sbt-revolver" % "0.9.1")

到您的项目/plugins.sbt