SBT 停止运行而不退出
Posted
技术标签:
【中文标题】SBT 停止运行而不退出【英文标题】:SBT stop run without exiting 【发布时间】:2011-07-05 11:30:54 【问题描述】:如何在不退出的情况下终止 SBT 中的运行?
我正在尝试 CTRL+C,但它退出了 SBT。有没有办法在保持 SBT 打开的同时只退出正在运行的应用程序?
【问题讨论】:
Ctrl+D
不起作用。
我认为Ctrl + D
仅适用于 Play 框架。
【参考方案1】:
在默认配置中,你的运行发生在 sbt 运行的同一个 JVM 中,所以你不能轻易地单独杀死它们。
如果您在单独的分叉 JVM 中运行,如 Forking 所述,那么您可以终止该 JVM(通过您的操作系统提供的任何方式)而不影响 sbt 的 JVM:
fork in run := true
【讨论】:
我正在尝试这样做。具体来说,我已经实现了:***.com/questions/3868863/…,但是当我执行 CTRL+C 时 sbt 仍然退出。如何只杀死分叉的 JVM? 在命令行、任务管理器 (Windows)、强制退出或活动监视器 (Mac OS X) 等中使用kill
。
fork 后,要杀死除 sbt 之外的所有 java,运行:kill -9 `ps -h | grep java | grep -v sbt-launch | grep -v grep | awk 'print $1'`
我喜欢这个想法,但它似乎没有帮助。我正在运行 sbt 0.13.1 并将这一行添加到我的 build.sbt 文件中..
你需要用CTRL+D杀死run
【参考方案2】:
当我可以控制从 sbt 运行的应用程序的主循环时,我发现以下内容很有用。
我告诉 sbt 在运行应用程序时 fork(在 build.sbt 中):
fork in run := true
我还告诉 sbt 将标准输入从 sbt shell 转发到应用程序(在 build.sbt 中):
connectInput in run := true
最后,在应用程序的主线程中,我在标准输入上等待文件结束,然后关闭 JVM:
while (System.in.read() != -1)
logger.warn("Received end-of-file on stdin. Exiting")
// optional shutdown code here
System.exit(0)
当然,您可以使用任何线程来读取标准输入和关闭,而不仅仅是主线程。
最后启动sbt,随意切换到你要运行的子项目,运行。
现在,当你想停止进程时,通过在 sbt shell 中输入 CTRL-D 来关闭它的标准输入。
【讨论】:
【参考方案3】:从 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
报告了一些错误:
https://github.com/sbt/sbt/issues/1442 https://github.com/sbt/sbt/issues/1855【讨论】:
【参考方案4】:考虑使用sbt-revolver。我们在公司使用它,它真的很方便。 对于您所要求的可以通过以下方式完成:
reStart
reStop
无需配置 build.sbt 文件。
您可以通过添加以下内容来使用此插件:
addSbtPlugin("io.spray" % "sbt-revolver" % "0.9.1")
到你的项目/plugins.sbt
【讨论】:
以上是关于SBT 停止运行而不退出的主要内容,如果未能解决你的问题,请参考以下文章
如何设置 SBT 构建以在 Jenkins 测试失败时返回零退出代码?