升级Android Studio至Flamingo后kotlin-kapt插件引发JVM版本兼容错误
问题背景
将Android Studio从Electric Eel版本升级到Flamingo版本后,使用id 'kotlin-kapt'插件时出现编译错误:任务:app:kaptGenerateStubsDebugKotlin执行失败,提示compileDebugJavaWithJavac任务的JVM目标版本为1.8,而kaptGenerateStubsDebugKotlin任务的目标版本为17,二者JVM版本不兼容。注释掉kotlin-kapt插件错误会消失,但无法使用Room、Dagger、Hilt等注解处理器。
错误堆栈
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 * Try: > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. * Exception is: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:kaptGenerateStubsDebugKotlin'. at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:149) ...(省略部分堆栈内容) 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. Consider using JVM toolchain: https://kotl.in/gradle/jvm/toolchain ...(省略部分堆栈内容)
项目build.gradle配置
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'kotlin-kapt' id 'com.google.dagger.hilt.android' } android { namespace 'com.example.dnddavanok' compileSdk 33 kotlin { jvmToolchain(17) } defaultConfig { applicationId "com.example.dnddavanok" minSdk 26 targetSdk 33 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } buildFeatures{ viewBinding true } } kapt{ correctErrorTypes = true } dependencies { implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4' implementation 'com.google.dagger:hilt-android:2.45' implementation 'com.google.dagger:dagger:2.45' implementation 'androidx.core:core-ktx:1.10.0' kapt 'com.google.dagger:hilt-android-compiler:2.45' kapt 'com.google.dagger:dagger-compiler:2.45' implementation 'androidx.room:room-common:2.5.1' implementation 'androidx.room:room-runtime:2.5.1' implementation "androidx.room:room-ktx:2.5.1" kapt "androidx.room:room-compiler:2.5.1" annotationProcessor 'androidx.room:room-compiler:2.5.1' implementation 'androidx.navigation:navigation-fragment-ktx:2.5.3' implementation 'androidx.navigation:navigation-ui-ktx:2.5.3' implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.1' implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1' implementation 'androidx.fragment:fragment-ktx:1.5.6' implementation 'androidx.core:core-ktx:1.10.0' implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.8.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' }
解决方案
问题根源是同时配置了kotlin.jvmToolchain(17)和kotlinOptions.jvmTarget = '1.8',导致Kotlin与Java编译任务的JVM版本不一致,升级到Flamingo后该冲突被严格校验。提供两种解决方式:
方式一:统一升级到JDK 17(推荐)
既然已配置jvmToolchain(17),直接同步Java编译选项到17:
修改compileOptions部分:
compileOptions { sourceCompatibility JavaVersion.VERSION_17 targetCompatibility JavaVersion.VERSION_17 }
同时可删除kotlinOptions中的jvmTarget配置,因为jvmToolchain会自动同步该参数,避免重复配置。
方式二:统一回退到JDK 8
若暂时不想升级JDK,删除kotlin.jvmToolchain(17)配置,保留kotlinOptions.jvmTarget = '1.8'和compileOptions的1.8配置,确保所有任务的JVM版本统一为1.8。
额外优化:依赖中同时使用了kapt "androidx.room:room-compiler:2.5.1"和annotationProcessor 'androidx.room:room-compiler:2.5.1',Kotlin项目只需保留kapt一行,删除annotationProcessor配置以避免冗余。
内容的提问来源于stack exchange,提问作者Davanok

