1. 分叉

分叉 

默认情况下,run 任务在与 sbt 相同的 JVM 中运行。但是,在某些情况下需要分叉。或者,您可能希望在实现新任务时分叉 Java 进程。

默认情况下,分叉的进程使用与构建所用相同的 Java 和 Scala 版本,以及当前进程的工作目录和 JVM 选项。本页介绍了如何为runtest 任务启用和配置分叉。每种任务类型都可以通过在下面解释的范围内限定相关键来单独配置。

启用分叉 

fork 设置控制是否启用分叉(true)或不启用(false)。它可以在run 范围内设置,以仅分叉run 命令,或者在test 范围内设置,以仅分叉test 命令。

要分叉所有测试任务(testtestOnlytestQuick)和运行任务(runrunMainTest / runTest / runMain),

fork := true

要仅分叉Compile / runCompile / runMain

Compile / run / fork := true

要仅分叉Test / runTest / runMain

Test / run / fork := true

注意:runrunMain 共享相同的配置,不能单独配置。

要仅启用分叉所有test 任务,请在Test 范围内将fork 设置为true

Test / fork := true

有关如何将测试分配给 JVM 以及如何将哪些选项传递给每个组的更多控制,请参阅测试

更改工作目录 

要更改分叉时的工作目录,请设置Compile / run / baseDirectoryTest / baseDirectory

// sets the working directory for all `run`-like tasks
run / baseDirectory := file("/path/to/working/directory/")

// sets the working directory for `run` and `runMain` only
Compile / run / baseDirectory := file("/path/to/working/directory/")

// sets the working directory for `Test / run` and `Test / runMain` only
Test / run / baseDirectory := file("/path/to/working/directory/")

// sets the working directory for `test`, `testQuick`, and `testOnly`
Test / baseDirectory := file("/path/to/working/directory/")

分叉的 JVM 选项 

要指定提供给分叉 JVM 的选项,请设置javaOptions

run / javaOptions += "-Xmx8G"

或指定仅影响主或测试run 任务的配置

Test / run / javaOptions += "-Xmx8G"

或仅影响test 任务

Test / javaOptions += "-Xmx8G"

Java 主目录 

通过设置javaHome 目录来选择要使用的 Java 安装。

javaHome := Some(file("/path/to/jre/"))

请注意,如果全局设置了此项,它还会设置用于编译 Java 源代码的 Java 安装。您可以通过在run 范围内设置它来将其限制为仅运行

run / javaHome := Some(file("/path/to/jre/"))

与其他设置一样,您可以指定仅影响主或测试run 任务或仅影响test 任务的配置。

配置输出 

默认情况下,分叉的输出被发送到 Logger,标准输出在Info 级别记录,标准错误在Error 级别记录。这可以通过outputStrategy 设置进行配置,该设置的类型为OutputStrategy

// send output to the build's standard output and error
outputStrategy := Some(StdoutOutput)

// send output to the provided OutputStream `someStream`
outputStrategy := Some(CustomOutput(someStream: OutputStream))

// send output to the provided Logger `log` (unbuffered)
outputStrategy := Some(LoggedOutput(log: Logger))

// send output to the provided Logger `log` after the process terminates
outputStrategy := Some(BufferedOutput(log: Logger))

与其他设置一样,这可以针对主或测试run 任务或针对test 任务单独配置。

配置输入 

默认情况下,sbt 进程的标准输入不会转发到分叉的进程。要启用此功能,请配置connectInput 设置

run / connectInput := true

直接使用 

要分叉一个新的 Java 进程,请使用Fork API。感兴趣的值是Fork.javaFork.javacFork.scalaFork.scalac。这些是Fork 类型的,并提供applyfork 方法。例如,要分叉一个新的 Java 进程,

val options = ForkOptions(...)
val arguments: Seq[String] = ...
val mainClass: String = ...
val exitCode: Int = Fork.java(options, mainClass +: arguments)

ForkOptions 定义了要使用的 Java 安装、工作目录、环境变量等等。例如,

val cwd: File = ...
val javaDir: File = ...
val options = ForkOptions(
   envVars = Map("KEY" -> "value"),
   workingDirectory = Some(cwd),
   javaHome = Some(javaDir)
)