sbt run

概要

sbt [query / ] run [args]

描述

run 任务提供运行用户程序的方式。

在 sbt 1.x 及更早版本中,run 任务在与 sbt server 相同的 Java 虚拟机(JVM)中运行用户程序。sbt 2.x 实现了 客户端 run:run 任务创建包含程序的沙箱环境,将信息发回 sbtn,由 sbtn 在新的 JVM 中启动用户程序。

动机

客户端 run 有若干动机。

  1. sys.exit 支持。用户代码可调用 sys.exit,通常会关闭 JVM。在 sbt 1.x 中,我们需使用 JDK SecurityManager 拦截这些 sys.exit 调用,以防 run 关闭 sbt 会话;但 JDK 17 弃用 SecurityManager 后,TrapExit 在 sbt 1.6.0(2021)中被移除。由于客户端 run 在独立 JVM 中运行用户程序,因此可调用 sys.exit。
  2. 隔离。用户代码也可启动线程或分配其他资源,这些可能在 main 方法返回后继续运行。在独立 JVM 中运行用户代码可在 sbt server 与用户代码之间提供隔离。
  3. sbt server 可用性。由于程序在 sbt server 外运行,sbt server 可更及时响应其他客户端的请求,例如测试或 IDE 集成。