[Gradle] Java 25 업데이트: sourceCompatibility 대신 Toolchain을 선택한 이유 (feat. Gradle 버전 에러, Gradle 공식 문서)

jiyoon·2026년 3월 1일

0. 프로젝트 상황: 자바와 스프링 버전 업그레이드

프로젝트 중 자바와 스프링 버전을 상위 버전으로 올리면서 build.gradle 파일을 수정하게 되었다.
이전에는 아래와 같은 sourceCompatibility의 방식으로 자바 버전을 적용했다.

sourceCompatibility = '17'

버전을 업데이트 하는 과정에서는 아래의 toolchain 방식으로 변경했다.

java {
	toolchain {
		languageVersion = JavaLanguageVersion.of(25)
	}
}

두 방식의 차이가 뭔지, 어떤 방식을 사용하는 게 좋을지 검색해보다가 Gradle의 공식 문서를 들어가보았다.

Gradle 공식 문서

Gradle은 자바 버전을 구성하는 데 다섯 가지 주요 방법을 제공한다. 아래의 방법들은 상호 배타적인 방법이 아니므로, 필요에 따라 결합해서 사용할 수 있다.

1. Java toolchains
2. The --release flag
3. Source and Target compatibility
4. Environment variables (JAVA_HOME)
5. IDE settings

이중 내가 궁금했던 부분은 첫번째 toolchain 방식과 세번째 Source and Target compatibility 부분이다.




1. Java toolchains

toolchain 방식은 내가 원하는 자바 버전을 블록 안에 선언하면 되고, 블록은 유연한 편이라 버전 숫자뿐만 아니라 다른 설정 옵션까지 지원한다.

이 프로젝트에서는 해당 자바 버전이 반드시 필요하며, 없으면 Gradle이 직접 다운로드하도록 하는 강력한 명령이다.

따라서 개발자마다 로컬 PC에 설치된 JDK 버전이 달라도, toolchain을 통해 모든 팀원이 동일한 환경에서 빌드됨을 보장하는 것이다.

더 최신 방식이고 현업에서도 더 권장되는 방식이라고 한다.


2. Source and Target compability

sourceCompability 방식은 자바 컴파일러에게 특정 자바 버전과 호환되는 바이트코드를 생성하라고 하지만 실행되는 JDK Gradle 자체를 강제하지 않는다.

따라서 실행되고 있는 JDK가 올바른지를 보장해주지 않고 API가 오래된 자바 버전을 사용할 때 에러를 발생시킬 수 있다.
자바의 새로운 기능(API)이 낮은 자바 버전에서도 작동하는 경우가 간혹 있을 수 있는데(backport), 이 코드가 컴파일을 통과해버려 정작 서버에서 돌아갈 때 에러를 뱉을 수 있다는 것이다.

"이 방법은 이전 버전과의 호환성이 필요하지만 툴체인을 사용할 수 없는 경우에만 사용해야 합니다." 라고 명시되어 있는 걸 보면 공식 문서에서도 아까 1번 툴체인 방식을 권장하는 듯 보인다.


3. Gradle과의 버전 불일치 에러 해결

plugins {
    id 'java'
    id 'org.springframework.boot' version "4.0.2"
    id 'io.spring.dependency-management' version "1.1.7"
}

group = 'me.jiyoonhwang'
version = '1.0'

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(25)
    }
}

위와 같이 build.gradle 파일의 버전을 변경하고 아래의 탭의 설정 또한 수정했다.

1. File > Project Structure 탭: 인텔리제이가 프로젝트 코드를 분석하고 컴파일할 때 쓰는 SDK 설정

  • Project: SDK 버전 25로 변경
  • Modules: Language Level 25로 변경

2. Settings > Build, Execution, Deployment > Build Tools > Gradle 탭: Gradle이 빌드를 수행할 때 빌려 쓰는 자바 엔진 설정

  • Gradle JVM: Project SDK(25)로 설정
  • 이게 어긋나면 build.gradle에 적은 toolchain 설정과 충돌할 수 있음

3. Settings > Build, Execution, Deployment > Compiler > Java Compiler 탭:

  • Project bytecode version: 25로 변경

그러나 설정을 마치고 build.gradle을 새로 고침했을 때 아래와 같은 에러가 떴다. 내가 쓰고 있는 Gradle 버전이 오래되어서 최신 Java 25 버전을 감당할 수 없다는 것이다.

Your build is currently configured to use incompatible Java 25.0.2 and Gradle 8.4. Cannot sync the project.
The maximum compatible Gradle JVM version is 20.

이를 해결하기 위해 gradle/wrapper/gradle-wrapper.properties 파일의 distributionUrl 부분에서 Gradle을 최신 버전으로 업데이트해줬다.
Gradle 공식 홈페이지에 들어가본 결과 가장 최신 버전이 9.3.1이라고 되어 있어서 이걸로 변경해주었다.

distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip

참고로 자바 버전은 25로 유지한 채 Gradle 실행 JVM의 버전만 낮추는 방법도 있는데 지금 굳이 필요한 방법이 아니라서 패스했다.

이러한 경험을 통해 Gradle 버전마다 지원하는 Java 버전의 상한선이 정해져 있으므로, 자바 버전을 올릴 때 Gradle wrapper 버전도 함께 체크해야 한다는 것을 알게 되었다.



0개의 댓글