Expo 48升级至49后Android编译出现JVM版本兼容错误
问题:Expo 49升级后Android构建出现JVM版本不一致错误
执行./gradlew build时触发如下错误:
Execution failed for task ':expo-modules-core$android-annotation:compileKotlin'. > Inconsistent JVM-target compatibility detected for tasks 'compileJava' (11) and 'compileKotlin' (17).
当前配置信息
根build.gradle
buildscript { ext { buildToolsVersion = "33.0.0" minSdkVersion = 21 compileSdkVersion = 33 targetSdkVersion = 33 ndkVersion = "23.1.7779620" kotlin_version = '1.8.0' } repositories { google() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath("com.facebook.react:react-native-gradle-plugin") } }
app/build.gradle
compileOptions { sourceCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_11 }
gradle-wrapper.properties
distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-all.zip
原因分析
错误核心是Java编译目标版本(11)与Kotlin编译目标版本(17)不匹配。Expo 49依赖的expo-modules-core内部默认使用了更高的Kotlin JVM目标版本,而项目仅配置了Java的编译版本,未同步指定Kotlin的目标版本,导致子模块编译时出现版本冲突。
解决方案
1. 在app/build.gradle中同步Kotlin编译目标
在android块内的compileOptions下方添加kotlinOptions,确保与Java版本一致:
android { // ... 其他现有配置 compileOptions { sourceCompatibility JavaVersion.VERSION_11 targetCompatibility JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = JavaVersion.VERSION_11.toString() } }
2. 全局配置Kotlin编译目标(覆盖所有子模块)
如果单模块配置无效,可在根build.gradle的allprojects块中添加全局配置,强制所有模块(包括expo-modules-core)使用统一的JVM目标版本:
allprojects { repositories { // ... 现有仓库配置 } tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).configureEach { kotlinOptions { jvmTarget = JavaVersion.VERSION_11.toString() } } }
3. 明确指定Android Gradle插件版本
根build.gradle中com.android.tools.build:gradle未指定版本,React Native 0.72.x需要搭配Android Gradle Plugin 7.4.2或更高版本,补充版本号:
dependencies { classpath 'com.android.tools.build:gradle:7.4.2' // ... 其他依赖 }
4. 清理缓存后重新构建
执行以下命令清理Gradle缓存,避免旧配置残留:
./gradlew clean rm -rf ~/.gradle/caches ./gradlew build
内容的提问来源于stack exchange,提问作者Pavel Glebov
相关产品推荐
相关产品推荐

