깃허브에 학습용으로 참고할만한 프로젝트를 발견하여 클론해서 구동시켜보기 위해 클론을 한 뒤에 build을 해보았다.
(AGP 버전이 8.0.0-rc01 이기 때문에 Preview 버전의 Android Studio 를 통해 클론을 진행하였다)
몇몇 모듈들에 (network, designsystem, domain, sharedpreference) 빌드가 실패하는 것을 확인 하였고 에러 메세지는 다음과 같았다.
Caused by: org.gradle.api.GradleException: 'compileDebugJavaWithJavac' task (current target is 1.8) and 'kaptGenerateStubsDebugKotlin' task (current target is 17) jvm target compatibility should be set to the same Java version.
이를 해결하기 위해 구글링을 해보았고, 가장 비슷한 질문을 찾을 수 있었다.
https://stackoverflow.com/questions/69079963/how-to-set-compilejava-task-11-and-compilekotlin-task-1-8-jvm-target-com
대충 짐작하자면 current target인 1.8에 맞춰줘야 한다는 것인데.
이미 sourceCompatibility 와 targetCompatibility 그리고 kotlinOptions 의 jvmTarget 까지 1.8로 설정이 되어있기 때문에 다른 문제가 있을 것이라 판단했다.
(app 모듈의 build.gradle.kts에만 위에 옵션들이 설정되어있고 다른 모듈에는 존재하지 않았다.)
그렇다면 target 17 은 어디서 나온 숫자인가.. 생각을 해보았고
현재 안드로이드 스튜디오의 JDK 가 JAVA 몇 버전으로 설정되어있는지 확인해보았다.
(맥 기준 단축키 cmd + ; 를 통해 바로 JDK 버전을 변경하는 setting에 진입할 수 있다.)
11 로 적혀있지만 Runtime version 17.0.5 로 17버전임을 확인할 수 있었다.
따라서 JAVA 1.8 버전으로 JDK 를 변경해주었고 다시 build 를 진행해보았다.
그리고 등장한 에러는 다음과 같다..
Could not resolve all files for configuration ':classpath'.
Could not resolve com.android.tools.build:gradle:8.0.0-rc01.
Required by:
project : > com.android.application:com.android.application.gradle.plugin:8.0.0-rc01
project : > com.android.library:com.android.library.gradle.plugin:8.0.0-rc01
No matching variant of com.android.tools.build:gradle:8.0.0-rc01 was found. The consumer was configured to find a library for use during runtime, compatible with Java 8, packaged as a jar, and its dependencies declared externally, as well as attribute 'org.gradle.plugin.api-version' with value '8.0' but:
- Variant 'apiElements' capability com.android.tools.build:gradle:8.0.0-rc01 declares a library, packaged as a jar, and its dependencies declared externally:
- Incompatible because this component declares a component for use during compile-time, compatible with Java 11 and the consumer needed a component for use during runtime, compatible with Java 8
- Other compatible attribute:
- Doesn't say anything about org.gradle.plugin.api-version (required '8.0')
- Variant 'javadocElements' capability com.android.tools.build:gradle:8.0.0-rc01 declares a component for use during runtime, and its dependencies declared externally:
- Incompatible because this component declares documentation and the consumer needed a library
- Other compatible attributes:
- Doesn't say anything about its target Java version (required compatibility with Java 8)
- Doesn't say anything about its elements (required them packaged as a jar)
- Doesn't say anything about org.gradle.plugin.api-version (required '8.0')
- Variant 'runtimeElements' capability com.android.tools.build:gradle:8.0.0-rc01 declares a library for use during runtime, packaged as a jar, and its dependencies declared externally:
- Incompatible because this component declares a component, compatible with Java 11 and the consumer needed a component, compatible with Java 8
- Other compatible attribute:
- Doesn't say anything about org.gradle.plugin.api-version (required '8.0')
- Variant 'sourcesElements' capability com.android.tools.build:gradle:8.0.0-rc01 declares a component for use during runtime, and its dependencies declared externally:
- Incompatible because this component declares documentation and the consumer needed a library
- Other compatible attributes:
- Doesn't say anything about its target Java version (required compatibility with Java 8)
- Doesn't say anything about its elements (required them packaged as a jar)
- Doesn't say anything about org.gradle.plugin.api-version (required '8.0')
'8.0' 이라는 버전은 gradle-wrapper.properties의 적혀있는 gradle 버전을 의미하는것으로 추측된다.
gradle/wrapper/gradle-wrapper.properties
#Fri Mar 31 14:37:20 KST 2023
distributionBase=GRADLE_USER_HOME
distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
이번에도 역시 비슷한 질문이 있는지 구글링 해보았고 가장 유사한 스택오버플로우 질문 글은 다음과 같았다.
질문의 AGP 버전(7.4.0)과 현재 프로젝트의 AGP 버전(8.0.0-rc01)은 상이하지만
JDK 버전 1.8, 17(기본) 일때 모두 빌드를 실패하였으므로 답변에 적혀있은 JDK 를 11버전으로 변경한뒤 빌드를 수행해보도록 하였다.
결과는 다음과 같다.
An exception occurred applying plugin request [id: 'com.android.application', version: '8.0.0-rc01']
Failed to apply plugin 'com.android.internal.application'.
Android Gradle plugin requires Java 17 to run. You are currently using Java 11.
Your current JDK is located in /Users/yijihun/Library/Java/JavaVirtualMachines/corretto-11.0.18/Contents/Home
You can try some of the following options:
- changing the IDE settings.
- changing the JAVA_HOME environment variable.
- changingorg.gradle.java.home
ingradle.properties
.
상당히 친숙한 에러 메세지이다.
Android Gradle plugin requires Java 17 to run. You are currently using Java 11.
Your current JDK is located in /Users/yijihun/Library/Java/JavaVirtualMachines/corretto-11.0.18/Contents/Home
AGP 가 JAVA 17버전을 필요로 하며, 현재 내 JAVA 버전은 11이다. 그러므로 17로 변경하여 돌려라라는 의미인데. 이럴 경우 글의 맨처음 에러로 다시 돌아가게 된다.. ㅠ
혹시몰라 기존에 깔려있던 JDK 가 아닌 새로운 JDK 17버전을 설치해서 다시 빌드를 해보았다.
Caused by: org.gradle.api.GradleException: 'compileDebugJavaWithJavac' task (current target is 1.8) and 'kaptGenerateStubsDebugKotlin' task (current target is 17) jvm target compatibility should be set to the same Java version.
처음 에러메세지로 회귀하게 된건 변함이 없었다 ㅠ
해당 에러에서 JDK 를 변경하는 것이 해답이 아닌것 같은데(추측) 아직 해결법을 찾지 못했다.
혹시 글의 에러를 해결하셨던 분이 계시다면 조언 부탁드립니다 ㅠ!
workspace 님께서 알려주신 링크를 통해 위의 글 관련 이슈가 있다는 것을 확인하였고(내(안드로이드 스튜디오) 문제가 아니었다!ㅠ) 해당 링크에 다른 분들이 공유해주신 해결법을 에러가 터지는 모듈들에 build.gradle.kts 에 적용해보았다.
하지만 적용을 해도 빌드를 실패하기도 했고, 최신(AGP 8.0.0) 이상버전들에서 문제가 발생하는 상황이었기 때문에, 이는 아직 불안정한 상태라 판단하여
1) 우선 AGP 버전은 각각 7.4.2 버전으로 downgrade 해주었다 (각각 8.0.0 미만의 버전이면 어떤 버전이든 상관없다.)
2) 문제가 발생하는 각각의 모듈의 build.gradle.kts 에
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_17.toString()
}
해당 코드를 추가, jvmTarget 버전을 명시해주어 정상적으로 빌드에 성공할 수 있었다...
Android 모듈이 아닌, Kotlin or Java 라이브러리 모듈인 경우엔
java {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
이것만 추가해주면 된다
jvmToolchain 버전을 별도로 명시하지 않아도 정상적으로 빌드가 되었다.
참고)
https://daryeou.tistory.com/347
https://findmypiece.tistory.com/325
https://kotlinlang.org/docs/releases.html#release-details
https://issuetracker.google.com/issues/260059413
https://kotlinlang.org/docs/gradle-configure-project.html#gradle-java-toolchains-support
https://youtrack.jetbrains.com/issue/KT-55947/Unable-to-set-kapt-jvm-target-version#focus=Comments-27-6805028.0-0
이 이슈를 겪고 계신 것 같네요. kotlin 1.8로 올리고 문제를 겪었었고, 잘 기억은 안나는데 댓글에 있는 jvmToolchain 명시로 문제가 해결되었었습니다. 그런데 최근 jvmToolChain 요게 문제를 일으켜서 지웠는데 빌드가 잘 됩니다. agp 쪽에 문제가 있었는데 해결 된 것일지도...? 스튜디오는 플라밍고 썼습니다.