默认情况下,run 任务在与 sbt 相同的 JVM 中运行。但是,在某些情况下需要分叉。或者,您可能希望在实现新任务时分叉 Java 进程。
默认情况下,分叉的进程使用与构建所用相同的 Java 和 Scala 版本,以及当前进程的工作目录和 JVM 选项。本页介绍了如何为run 和test 任务启用和配置分叉。每种任务类型都可以通过在下面解释的范围内限定相关键来单独配置。
fork 设置控制是否启用分叉(true)或不启用(false)。它可以在run 范围内设置,以仅分叉run 命令,或者在test 范围内设置,以仅分叉test 命令。
要分叉所有测试任务(test、testOnly 和testQuick)和运行任务(run、runMain、Test / run 和Test / runMain),
fork := true
要仅分叉Compile / run 和Compile / runMain
Compile / run / fork := true
要仅分叉Test / run 和Test / runMain
Test / run / fork := true
注意:run 和runMain 共享相同的配置,不能单独配置。
要仅启用分叉所有test 任务,请在Test 范围内将fork 设置为true
Test / fork := true
有关如何将测试分配给 JVM 以及如何将哪些选项传递给每个组的更多控制,请参阅测试。
要更改分叉时的工作目录,请设置Compile / run / baseDirectory 或Test / 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 的选项,请设置javaOptions
run / javaOptions += "-Xmx8G"
或指定仅影响主或测试run 任务的配置
Test / run / javaOptions += "-Xmx8G"
或仅影响test 任务
Test / javaOptions += "-Xmx8G"
通过设置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.java、Fork.javac、Fork.scala 和Fork.scalac。这些是Fork 类型的,并提供apply 和fork 方法。例如,要分叉一个新的 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)
)