如何配置Gradle为不同项目模块指定不同JDK版本?
完全可以做到!Gradle从6.7版本开始引入了Java Toolchains功能,让你能为每个子项目单独指定编译使用的JDK版本,不需要依赖bash或其他外部脚本。这正好适配你的场景:公共组件和安卓用JDK8,PC端用JDK10。
为什么之前的sourceCompatibility/targetCompatibility没用?
这些配置只控制字节码的兼容级别,不会改变实际编译使用的JDK版本。如果你的全局JDK是9/10,哪怕设置了1.7的兼容级别,编译时还是会用高版本JDK的API和编译器特性——这就是安卓启动报错的根源:安卓运行时不支持这些隐形的高版本特性。
具体配置步骤
1. 升级Gradle版本(如果需要)
Java Toolchains在Gradle 6.7+才稳定可用。打开根目录的gradle/wrapper/gradle-wrapper.properties,确保distributionUrl指向足够新的版本:
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
2. 根build.gradle配置默认JDK(可选但推荐)
在根build.gradle里设置全局默认JDK为8,这样公共组件和安卓项目不用重复配置,只需要在PC项目里覆盖即可:
subprojects { // 给非安卓的Java类项目应用基础插件 if (!plugins.hasPlugin('com.android.application') && !plugins.hasPlugin('com.android.library')) { apply plugin: 'java' } // 默认使用JDK8 java { toolchain { languageVersion = JavaLanguageVersion.of(8) } } }
3. PC子项目配置JDK10
在PC项目的build.gradle里覆盖默认配置,指定使用JDK10:
java { toolchain { // 指定JDK版本 languageVersion = JavaLanguageVersion.of(10) // 如果不想让Gradle自动下载JDK,可以手动指定本地路径 // installationPath = file('/usr/lib/jvm/jdk-10') } } // 可选:明确设置source/target兼容(Toolchains会自动处理,但加上更保险) sourceCompatibility = JavaVersion.VERSION_10 targetCompatibility = JavaVersion.VERSION_10
4. 安卓子项目确保使用JDK8
在安卓项目的build.gradle里,除了设置compileOptions,还要加上Toolchains配置,确保编译环境是JDK8:
android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 // 安卓建议开启这个,解决Lambda等JDK8特性的运行兼容问题 coreLibraryDesugaringEnabled true } // 强制使用JDK8编译 java { toolchain { languageVersion = JavaLanguageVersion.of(8) } } } // 如果启用了coreLibraryDesugaring,需要添加对应依赖(安卓Gradle插件4.0+支持) dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' }
工作原理
Java Toolchains会自动检测本地是否安装了指定版本的JDK,如果没有,会从Adoptium(原AdoptOpenJDK)自动下载并缓存。这样每个子项目都会用你指定的JDK版本编译,彻底隔离了不同模块的编译环境,完美解决高版本JDK编译安卓代码导致的运行错误。
这样配置后,你只需要执行普通的Gradle命令(比如./gradlew build),Gradle就会自动为每个子项目使用对应的JDK,完全不需要外部工具!
内容的提问来源于stack exchange,提问作者Mateusz Krawczuk




