sbt run

概要

sbt [query / ] run [args]

描述

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

在 sbt 1.x 及更早版本中,run 任务在与 sbt server 相同的 Java 虚拟机(JVM)中运行用户程序。sbt 2.x 实现了 客户端 runrun 任务创建包含程序的沙箱环境,将信息发回 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 集成。