编译器执行策略
Kotlin 编译器执行策略 定义了 Kotlin 编译器的运行位置。 诸如 Gradle 或 Maven 等构建工具会配置该策略。
有两种编译器执行策略:
| 策略 | Kotlin 编译器的运行位置 | 其他特性与说明 |
|---|---|---|
| Kotlin daemon | 在其自身的守护进程中运行 | 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 daemon 的通信失败,编译器将回退到“进程内 (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 时,如果 daemon 的启动或通信出现问题,构建将失败。 在 gradle.properties 中声明此属性:
kotlin.daemon.useFallbackStrategy=falseKotlin 编译任务中还有一个 useDaemonFallbackStrategy 属性。如果您同时使用这两个属性,useDaemonFallbackStrategy 属性具有更高优先级。
tasks {
compileKotlin {
useDaemonFallbackStrategy.set(false)
}
}tasks.named("compileKotlin").configure {
useDaemonFallbackStrategy = false
}如果内存不足以运行编译,日志中会显示相关消息。
