コンパイラの実行戦略
「Kotlinコンパイラの実行戦略(Kotlin compiler execution strategy)」は、Kotlinコンパイラがどこで実行されるかを定義します。 Gradle や Maven などのビルドツールがこの戦略を設定します。
コンパイラの実行戦略には以下の2つがあります:
| 戦略 | Kotlinコンパイラの実行場所 | その他の特徴と注意点 |
|---|---|---|
| Kotlinデーモン | 独自のデーモンプロセス内 | GradleおよびMavenにおけるデフォルトで最速の戦略です。デーモンプロセスは、異なるビルドシステムプロセス間や複数の並列コンパイル間で共有できます。 |
| インプロセス(In process) | ビルドツールのプロセス内 | メモリ管理の観点からは最もシンプルな戦略ですが、JVMシステムプロパティなどの状態を共有するため、同じプロセス内で実行されている他のロジックからの分離性は低くなります。 |
Gradleでの設定
Kotlinコンパイラの実行戦略は、以下のいずれかのプロパティを使用して定義できます:
kotlin.compiler.execution.strategyGradleプロパティ。compilerExecutionStrategyコンパイルタスクプロパティ。
Gradleプロパティを使用する
kotlin.compiler.execution.strategy プロパティに指定可能な値は以下の通りです:
daemon(デフォルト)in-process
gradle.properties で kotlin.compiler.execution.strategy プロパティを設定します:
kotlin.compiler.execution.strategy=in-processコンパイルタスクプロパティを使用する
compilerExecutionStrategy タスクプロパティは、kotlin.compiler.execution.strategy Gradleプロパティよりも優先されます。
compilerExecutionStrategy タスクプロパティに指定可能な値は以下の通りです:
DAEMON(デフォルト)IN_PROCESS
ビルドスクリプトで compilerExecutionStrategy タスクプロパティを設定します:
import org.jetbrains.kotlin.gradle.tasks.CompileUsingKotlinDaemon
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilerExecutionStrategy
// ...
tasks.withType<CompileUsingKotlinDaemon>().configureEach {
compilerExecutionStrategy.set(KotlinCompilerExecutionStrategy.IN_PROCESS)
}import org.jetbrains.kotlin.gradle.tasks.CompileUsingKotlinDaemon
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilerExecutionStrategy
// ...
tasks.withType(CompileUsingKotlinDaemon)
.configureEach {
compilerExecutionStrategy = KotlinCompilerExecutionStrategy.IN_PROCESS
}フォールバック戦略
Kotlinデーモンとの通信に失敗した場合、コンパイラは「インプロセス(In process)」戦略にフォールバックします。
このフォールバックが発生すると、Gradleはビルド出力に以下の警告を表示します:
Failed to compile with Kotlin daemon: java.lang.RuntimeException: Could not connect to Kotlin compile daemon
[exception stacktrace]
Using fallback strategy: Compile without Kotlin daemon
Try ./gradlew --stop if this issue persists.サイレントなフォールバックは、多くのシステムリソースを消費したり、非決定的なビルドにつながったりする可能性があります。 詳細については、こちらの YouTrackの課題 を参照してください。
フォールバックを防止するには、kotlin.daemon.useFallbackStrategy Gradleプロパティを使用します。デフォルト値は true です。 false に設定すると、デーモンの起動や通信に問題がある場合にビルドが失敗します。 gradle.properties でこのプロパティを宣言します:
kotlin.daemon.useFallbackStrategy=falseまた、Kotlinコンパイルタスクには useDaemonFallbackStrategy プロパティもあります。両方のプロパティを使用した場合、useDaemonFallbackStrategy プロパティが優先されます。
tasks {
compileKotlin {
useDaemonFallbackStrategy.set(false)
}
}tasks.named("compileKotlin").configure {
useDaemonFallbackStrategy = false
}コンパイルを実行するためのメモリが不足している場合、ログに関連するメッセージが表示されます。
