# 编译器执行策略 Kotlin 编译器执行策略 定义了 Kotlin 编译器在何处运行. 构建工具, 例如[Gradle](gradle.html) 或 [Maven](maven.html), 会配置这个策略. 有两种编译器执行策略: | 策略 | Kotlin 编译器的运行位置 | 其他特性和注意事项 | | --- | --- | --- | | [Kotlin Daemon](kotlin-daemon.html) | 在独立的 daemon 进程内 | 这是 Gradle 和 Maven 中 默认而且最快的策略. Daemon 进程可以在不同的构建系统进程之间共用, 并且支持多个并行编译. | | In process | 在构建工具的进程内 | 从内存管理的角度来看这是最简单的策略, 但是, 由于它与同一进程中运行的其他逻辑共享状态 (例如 JVM 系统属性), 因此隔离性较差. | ## 在 Gradle 中配置 你可以使用以下属性之一, 定义 Kotlin 编译器执行策略: * Gradle 属性 `kotlin.compiler.execution.strategy`. * 编译任务属性 `compilerExecutionStrategy`. ### 使用 Gradle 属性 `kotlin.compiler.execution.strategy` 属性的可选值为: * `daemon` (默认值) * `in-process` 在 `gradle.properties` 中设置 `kotlin.compiler.execution.strategy` 属性: ```PROPERTIES kotlin.compiler.execution.strategy=in-process ``` ### 使用编译任务属性 `compilerExecutionStrategy` task 属性的优先级高于 Gradle 属性 `kotlin.compiler.execution.strategy`. `compilerExecutionStrategy` task 属性的可选值为: * [DAEMON](https://kotlinlang.org/api/kotlin-gradle-plugin/kotlin-gradle-plugin-api/org.jetbrains.kotlin.gradle.tasks/-kotlin-compiler-execution-strategy/-d-a-e-m-o-n/) (默认值) * [IN_PROCESS](https://kotlinlang.org/api/kotlin-gradle-plugin/kotlin-gradle-plugin-api/org.jetbrains.kotlin.gradle.tasks/-kotlin-compiler-execution-strategy/-i-n_-p-r-o-c-e-s-s/) 在构建脚本中设置 `compilerExecutionStrategy` task 属性: Kotlin: ```KOTLIN import org.jetbrains.kotlin.gradle.tasks.CompileUsingKotlinDaemon import org.jetbrains.kotlin.gradle.tasks.KotlinCompilerExecutionStrategy // ... tasks.withType().configureEach { compilerExecutionStrategy.set(KotlinCompilerExecutionStrategy.IN_PROCESS) } ``` Groovy: ```GROOVY 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 issue](https://youtrack.jetbrains.com/issue/KT-48843/Add-ability-to-disable-Kotlin-daemon-fallback-strategy). 要禁止回退, 请使用 Gradle 属性 `kotlin.daemon.useFallbackStrategy`. 这个属性的默认值为 `true`. 当设置为 `false` 时, 如果 Daemon 的启动或通信出现问题, 构建会失败. 请在 `gradle.properties` 中声明这个属性: ```PROPERTIES kotlin.daemon.useFallbackStrategy=false ``` Kotlin 编译 task 中还有一个 `useDaemonFallbackStrategy` 属性. 如果两个属性都使用, `useDaemonFallbackStrategy` 属性的优先级更高. Kotlin: ```KOTLIN tasks { compileKotlin { useDaemonFallbackStrategy.set(false) } } ``` Groovy: ```GROOVY tasks.named("compileKotlin").configure { useDaemonFallbackStrategy = false } ``` 如果内存不足以运行编译, 日志中会显示相关信息. ## 在 Maven 中配置 默认情况下, Maven 使用 Kotlin Daemon 编译器执行策略. 要切换到 "in process" 策略, 请在你的 `pom.xml` 文件中设置以下属性: ```XML false ```