에러 상황

노트북을 변경해 개발환경 세팅을 다시 하고 Android 프로젝트 내 repository에서 clone 받아 실행하려고 할 때 Gradle과 JDK 버전 충돌로 인해 빌드가 실패하는 문제가 발생했다.

Your build is currently configured to use incompatible Java 21.0.4 and Gradle 8.2. Cannot sync the project.
We recommend upgrading to Gradle version 8.9.
The minimum compatible Gradle version is 8.5.
The maximum compatible Gradle JVM version is 19.

Gradle 8.2를 사용하고 있었는데, JDK 21과 호환되지 않는다는 메시지가 출력되었다. Gradle의 최대 호환 가능한 Java 버전은 Java 19이며, 현재 설치된 Java는 21이어서 충돌이 발생했다.

또한 Gradle Sync를 실행하면 다음과 같이 Gradle Daemon이 정상적으로 시작되지 못하는 문제도 함께 발생했다.

Unable to start the daemon process.
This problem might be caused by incorrect configuration of the daemon.
Process command line: /Applications/Android Studio.app/Contents/jbr/Contents/Home/bin/java --add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED ...

오류: 기본 클래스 When을(를) 찾거나 로드할 수 없습니다.
원인: java.lang.ClassNotFoundException: When

에러 원인 및 해결

에러 원인

  1. Gradle 8.2와 Java 21이 호환되지 않음
    → Java 17 이하로 변경해야 함

  2. Gradle Daemon이 JVM 옵션을 올바르게 인식하지 못함
    → gradle.properties의 JVM 설정 확인 필요

  3. Gradle Sync 중 ClassNotFoundException 발생
    → --add-exports 옵션을 추가해야 할 가능성이 있음

에러 해결

1️⃣ JDK 버전 다운그레이드 (Java 17로 변경)

Gradle 8.2와 호환되는 Java 17을 사용하기로 결정했다.

다음 명령어를 터미널에서 실행한다.

🔹 Homebrew를 이용해 OpenJDK 17 설치

brew install openjdk@17

🔹 설치된 JDK 버전 확인

/usr/libexec/java_home -V

// 출력값 예시
Matching Java Virtual Machines (4):
    21.0.6 (arm64) "Oracle Corporation" - "Java SE 21.0.6" /Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home
    21.0.6 (arm64) "Amazon.com Inc." - "Amazon Corretto 21" /Users/yeseul/Library/Java/JavaVirtualMachines/corretto-21.0.6/Contents/Home
    21.0.6 (x86_64) "Oracle Corporation" - "Oracle GraalVM 21.0.6+8.1" /Users/yeseul/Library/Java/JavaVirtualMachines/graalvm-jdk-21.0.6/Contents/Home
    17.0.14 (arm64) "Homebrew" - "OpenJDK 17.0.14" /opt/homebrew/Cellar/openjdk@17/17.0.14/libexec/openjdk.jdk/Contents/Home
/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home

2️⃣ gradle.properties에 JVM 옵션 추가

Gradle Daemon이 Javac 컴파일러에 접근할 수 있도록 JVM 옵션을 추가했다.

org.gradle.jvmargs=--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED \
                   --add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED \
                   --add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \
                   --add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED \
                   --add-exports=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED \
                   --add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED \
                   --add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED \
                   --add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED \
                   --add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED

Gradle이 내부적으로 사용하는 Javac의 API에 접근 가능하도록 설정

3️⃣ Rebuild 및 Sync 실행

빌드 후 Sync 하면 정상적으로 실행된다.

📌 얻은 교훈

  • Gradle과 JDK 버전 호환성을 반드시 확인하기
  • org.gradle.jvmargs 설정이 JVM 내부 API 접근에 영향을 미칠 수 있음
  • Gradle이 올바른 JDK를 사용하도록 명시적으로 org.gradle.java.home을 설정하는 것이 중요함
profile
Android 짱이 되고싶은 개발 기록 (+ ios도 조금씩,,👩🏻‍💻)

0개의 댓글

Powered by GraphCDN, the GraphQL CDN