デフォルトでは、`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` タスクのみに影響するように設定を指定できます。
デフォルトでは、フォークされた出力はロガーに送信され、標準出力は `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)
)