컴파일러 실행 전략

컴파일러 실행 전략 (Compiler execution strategy)

코틀린 컴파일러 실행 전략(execution strategy)은 코틀린 컴파일러가 어디서 실행되는지를 정의해요. Gradle이나 Maven 같은 빌드 도구가 이 전략을 설정해요.

컴파일러 실행 전략에는 두 가지가 있어요.

전략 코틀린 컴파일러가 실행되는 위치 기타 특징 및 참고
Kotlin daemon 자체 데몬 프로세스 내부 Gradle과 Maven에서 기본이며 가장 빠른 전략이에요. 데몬 프로세스는 여러 빌드 시스템 프로세스와 여러 병렬 컴파일 사이에서 공유될 수 있어요.
In process 빌드 도구의 프로세스 내부 메모리 관리 관점에서 가장 단순한 전략이지만, JVM 시스템 속성 같은 상태를 공유하기 때문에 같은 프로세스에서 돌아가는 다른 로직과 덜 격리돼요.

출처: 공식문서 - Compiler execution strategy

Gradle에서 설정하기

코틀린 컴파일러 실행 전략은 다음 속성 중 하나로 정의할 수 있어요.

  • kotlin.compiler.execution.strategy Gradle 속성.
  • compilerExecutionStrategy 컴파일 태스크 속성.

Gradle 속성 사용하기

kotlin.compiler.execution.strategy 속성에 넣을 수 있는 값은 다음과 같아요.

  • daemon (기본값)
  • in-process

gradle.propertieskotlin.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>

더 알아보기 (Learn more)