컴파일러 실행 전략
컴파일러 실행 전략 (Compiler execution strategy)
코틀린 컴파일러 실행 전략(execution strategy)은 코틀린 컴파일러가 어디서 실행되는지를 정의해요. Gradle이나 Maven 같은 빌드 도구가 이 전략을 설정해요.
컴파일러 실행 전략에는 두 가지가 있어요.
| 전략 | 코틀린 컴파일러가 실행되는 위치 | 기타 특징 및 참고 |
|---|---|---|
| Kotlin daemon | 자체 데몬 프로세스 내부 | Gradle과 Maven에서 기본이며 가장 빠른 전략이에요. 데몬 프로세스는 여러 빌드 시스템 프로세스와 여러 병렬 컴파일 사이에서 공유될 수 있어요. |
| In process | 빌드 도구의 프로세스 내부 | 메모리 관리 관점에서 가장 단순한 전략이지만, JVM 시스템 속성 같은 상태를 공유하기 때문에 같은 프로세스에서 돌아가는 다른 로직과 덜 격리돼요. |
Gradle에서 설정하기
코틀린 컴파일러 실행 전략은 다음 속성 중 하나로 정의할 수 있어요.
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 태스크 속성을 설정하세요. 코틀린 DSL(Gradle Kotlin DSL)에서는 이렇게 써요.
import org.jetbrains.kotlin.gradle.tasks.CompileUsingKotlinDaemon
import org.jetbrains.kotlin.gradle.tasks.KotlinCompilerExecutionStrategy
// ...
tasks.withType<CompileUsingKotlinDaemon>().configureEach {
compilerExecutionStrategy.set(KotlinCompilerExecutionStrategy.IN_PROCESS)
}
Groovy DSL에서는 이렇게 써요.
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.
조용한 폴백은 많은 시스템 리소스를 소비하거나 비결정적(non-deterministic) 빌드를 만들 수 있어요. 자세한 내용은 이 YouTrack 이슈를 참고하세요.
폴백을 막으려면 kotlin.daemon.useFallbackStrategy Gradle 속성을 사용하세요. 기본값은 true예요. false로 설정하면 데몬 시작이나 통신에 문제가 있을 때 빌드가 실패해요. 이 속성은 gradle.properties에 선언하세요.
kotlin.daemon.useFallbackStrategy=false
코틀린 컴파일 태스크에도 useDaemonFallbackStrategy 속성이 있어요. 두 속성을 모두 쓰면 useDaemonFallbackStrategy 태스크 속성이 우선해요.
Kotlin DSL에서는 이렇게 설정해요.
tasks {
compileKotlin {
useDaemonFallbackStrategy.set(false)
}
}
Groovy DSL에서는 이렇게 설정해요.
tasks.named("compileKotlin").configure {
useDaemonFallbackStrategy = false
}
컴파일을 실행할 메모리가 부족하면 로그에 관련 메시지가 표시돼요.
Maven에서 설정하기
기본적으로 Maven은 Kotlin daemon 컴파일러 실행 전략을 사용해요. "in process" 전략으로 전환하려면 pom.xml 파일에 다음 속성을 설정하세요.
<properties>
<kotlin.compiler.daemon>false</kotlin.compiler.daemon>
</properties>