You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何配置Gradle为不同项目模块指定不同JDK版本?

解决方案:为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

火山引擎 最新活动