Android AGP 8 + Gradle 8 + Kotlin 1.8在Kapt中导致错误
我刚刚更新到Android Studio Flamingo | 2022.2.1
。现在我得到这个错误:
Execution failed for task ':app:kaptGenerateStubsDebugKotlin'.
> '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.
Consider using JVM toolchain: https://kotl.in/gradle/jvm/toolchain
我使用的是AS包含的Kotlin,它是1.8.0
,但这在AGP 7.4.2
和Gradle 7.5
时工作得很好--只有在AS Flamingo的Gradle和AGP更新中才会出现问题。另外:
- 如果我把Kotlin降级到
1.7.20
,它就能重新工作了。 - 如果我将Kotlin更新为
1.8.20
,就会出现上述错误。
我有编译的选项:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
我也试过AS应用的样本,但它们有Kotlin 1.7.20
。它们也可以在Kotlin 1.8.0
下工作--除非你在依赖关系中引入kapt
!(例如Dagger)
那么,什么是应该工作的组合--包括kapt--并且有Android Studio的最新稳定推荐版本?
- Android Studio的版本?
- AGP版本吗?
- Gradle的版本?
- Kotlin的版本?
请不要提供未经测试的答案。我知道这应该是可行的,但它并不可行。
最新的Android Gradle插件和Kotlin kapt之间存在一个兼容性问题。因此,你在Android配置中指定的jvmTarget
将在Kotlin编译任务中设置,但在kapt任务中不设置,后者默认使用工具链版本(目前是JDK 17)。
作为一种变通方法,在kapt任务上手动设置jvmTarget
(在你的例子中,目标是Java 1.8):
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KaptGenerateStubs).configureEach {
kotlinOptions {
jvmTarget = "1.8"
}
}
我认为使用jvmToolchain作为错误信息的说法会解决这个问题:
考虑使用JVM工具链:https://kotl.in/gradle/jvm/toolchain
用下面的版本和配置,我的项目工作得很好。
- Android Studio Flamingo 2022.2.1
- AGP version 8.0.0
- Gradle version 8.0
- Kotlin version 1.8.0
在build.gradle中的配置:
kotlin {
jvmToolchain(8)
}
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
如果想了解更多的细节,你可以在下面两个链接中看到相关的官方文件和解释:
https://kotlinlang.org/docs/gradle-configure-project.html#gradle-java-toolchains-support
无法设置kapt jvm的目标版本:
> No matching toolchains found for requested specification: {languageVersion=8, vendor=any, implementation=vendor-specific}.
- RumburaK 2023-04-19
我在我的项目中使用了以下版本,在这些版本中,项目的构建没有问题:
- Android Studio Flamingo
2022.2.1
AGP
版本8.0.0
Gradle
版本8.0
Kotlin
版本1.8.0
要摆脱这个错误,请将你的代码改为以下内容:
android {
...
compileOptions {
sourceCompatibilityJavaVersion.VERSION_17
targetCompatibilityJavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = '17'
}
...
}
在这里你可以看到Gradle 8.0.0
兼容性表,其中有项目中应该使用的JDK的版本。
这对我来说是非常有效的╰( ͡° ͜ʖ ͡° )つ──☆*:・゚。
项目的build.gradle文件中:
allprojects { tasks.withType(org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile).configureEach {
kotlinOptions {
jvmTarget = "1.8"
apiVersion = "1.8"
languageVersion = "1.8"
}
}
}