run
和 console
操作提供了在与 sbt 相同的虚拟机中运行用户代码的方式。
run
还存在一个名为 runMain
的变体,它接受一个额外的初始参数,允许你指定要运行的主类的完全限定名称。run
和 runMain
共享相同的配置,不能单独配置。
此页面描述了在与 sbt 相同的虚拟机中运行用户代码的问题,sbt 如何解决这些问题,哪些类型的代码可以使用此功能,以及哪些类型的代码必须使用 分叉的 jvm。如果只想了解何时应该使用 分叉的 jvm,请跳到用户代码部分。
用户代码可以调用 System.exit
,它通常会关闭 JVM。由于 run
和 console
操作在与 sbt 相同的 JVM 中运行,这也会结束构建并需要重新启动 sbt。
用户代码也可以启动其他线程。主方法返回后,线程可能会继续运行。特别是,创建 GUI 会创建多个线程,其中一些线程可能不会在 JVM 终止之前终止。在调用 System.exit
或所有非守护线程终止之前,程序不会完成。
在反序列化期间,可能会由于各种复杂原因使用错误的类加载器。这可能发生在许多场景中,在 SBT 下运行只是其中之一。例如,在问题 #163 和 #136 中讨论了这个问题。原因解释 这里。