작업 단위 설정과 고급 Tool Chain 구성
이 글은 Gradle 공식 문서의 한국어 번역 두 번째 편으로, 작업(Task) 단위에서의 tool chain 구성 방법과, Java vendor 필터링, GraalVM 설정 등 고급 기능을 다룹니다.
🔧 작업(Task) 단위 Tool Chain 구성
특정 작업에서 사용하는 Java tool chain을 세부적으로 조정하려면, 해당 작업에 어떤 실행 도구를 사용할지 명시할 수 있습니다.
예: Test
작업은 어떤 java
실행 파일을 사용할지 결정하는 JavaLauncher
속성을 노출합니다.
다음은 컴파일 작업은 Java 8로, 테스트는 Java 17로 설정하는 예시입니다:
// list/build.gradle
tasks.withType(JavaCompile).configureEach {
javaCompiler = javaToolchains.compilerFor {
languageVersion = JavaLanguageVersion.of(8)
}
}
tasks.register('testsOn17', Test) {
javaLauncher = javaToolchains.launcherFor {
languageVersion = JavaLanguageVersion.of(17)
}
}
▶ 실행 작업에 JDK 지정
애플리케이션 하위 프로젝트에서는 Java 17로 애플리케이션을 실행하는 작업도 다음과 같이 추가할 수 있습니다:
// application/build.gradle
tasks.register('runOn17', JavaExec) {
javaLauncher = javaToolchains.launcherFor {
languageVersion = JavaLanguageVersion.of(17)
}
classpath = sourceSets.main.runtimeClasspath
mainClass = application.mainClass
}
📎 실행 파일 경로 직접 설정
Gradle에서는 javaLauncher
를 통해 실행기를 설정할 수도 있지만, 다음과 같이 경로나 홈 디렉터리를 명시적으로 지정하는 것도 가능합니다.
Java 실행 파일 경로 설정
def launcher = javaToolchains.launcherFor {
languageVersion = JavaLanguageVersion.of(11)
}
tasks.named('sampleTask') {
javaExecutable = launcher.map { it.executablePath }
}
Java 홈 디렉터리 설정
def launcher = javaToolchains.launcherFor {
languageVersion = JavaLanguageVersion.of(11)
}
tasks.named('anotherSampleTask') {
javaHome = launcher.map { it.metadata.installationPath }
}
Java 컴파일러 경로 설정
def compiler = javaToolchains.compilerFor {
languageVersion = JavaLanguageVersion.of(11)
}
tasks.named('yetAnotherSampleTask') {
javaCompilerExecutable = compiler.map { it.executablePath }
}
⚠️ .get()
을 직접 호출하는 방식은 tool chain을 즉시 생성 및 다운로드할 수 있으므로, 가능하면 .map {}
과 같은 lazy 방식으로 설정하는 것이 좋습니다.
🔄 Java Tool Chain 사용 효과
Gradle은 다음과 같은 동작을 자동으로 수행합니다:
- 컴파일, 테스트, 문서화 작업에 대해 설정한 tool chain 적용
- 로컬에 설치된 tool chain 자동 감지
- 조건에 맞는 tool chain 선택
- 해당 버전의 tool chain이 없을 경우 자동 다운로드 (tool chain 저장소 설정 시)
🏷️ Java Vendor 필터링
특정 Java 벤더(JDK 공급자)를 요구하는 경우, 다음과 같이 vendor 설정이 가능합니다:
java {
toolchain {
languageVersion = JavaLanguageVersion.of(11)
vendor = JvmVendorSpec.ADOPTIUM
}
}
만약 Gradle이 인식하지 못하는 커스텀 vendor가 필요할 경우 다음과 같이 vendor 이름의 일부 문자열을 매칭하는 방식도 가능합니다:
java {
toolchain {
languageVersion = JavaLanguageVersion.of(11)
vendor = JvmVendorSpec.matching("customString")
}
}
(대소문자 구분 없이 java.vendor
시스템 속성을 기준으로 필터링됩니다.)
🧱 GraalVM Native Image 사용 설정
다음과 같이 설정하면 Native Image 기능이 가능한 tool chain만 선택되도록 필터링할 수 있습니다:
java {
toolchain {
languageVersion = JavaLanguageVersion.of(21)
nativeImageCapable = true
}
}
nativeImageCapable
를 지정하지 않거나 false로 설정하면, 해당 조건은 선택 기준에 영향을 주지 않습니다.
🧠 JVM 구현체 필터링 (J9 등)
특정 JVM 구현체를 요구할 경우, implementation
속성으로 필터링할 수 있습니다.
java {
toolchain {
languageVersion = JavaLanguageVersion.of(11)
vendor = JvmVendorSpec.IBM
implementation = JvmImplementation.J9
}
}
사용 가능한 구현체:
VENDOR_SPECIFIC
: 모든 구현체와 일치J9
: IBM의 OpenJ9 엔진만 일치
✅ 유효한 Tool Chain 사양의 조건
Gradle은 JavaToolchainSpec
이 다음 두 조건 중 하나를 만족해야 유효하다고 판단합니다:
- 아무 속성도 설정되지 않음 (비어 있음)
languageVersion
이 설정됨 → 이후 vendor, implementation 등을 추가 설정 가능
즉, vendor 또는 implementation을 지정할 경우 반드시 languageVersion
도 설정되어야 합니다.
Gradle 8.0 이상에서는 유효하지 않은 사양 사용 시 빌드 오류가 발생합니다.
👉 다음 글(3/3)에서는 tool chain 설치 경로 지정, 우선순위 규칙, plugin에서의 활용, Alpine 환경 제한사항까지 마무리로 다룹니다.
관련 문서
Toolchains for JVM projects
In case you want to tweak which toolchain is used for a specific task, you can specify the exact tool a task is using. For example, the Test task exposes a JavaLauncher property that defines which java executable to use for launching the tests. In the exam
docs.gradle.org
'CS' 카테고리의 다른 글
@PathVariable vs @RequestParam (0) | 2025.05.17 |
---|---|
[Spring boot] Gradle Toolchains (3/3) (0) | 2025.05.06 |
[Spring boot] Gradle Toolchains (1/3) (0) | 2025.05.04 |
[CS] HTTP 상태 코드 (0) | 2025.03.14 |
[JAVA] Exception & Error (0) | 2024.12.12 |