Gradle6.7版本开始支持一个新特性Toolchain。 默认情况下,Gradle使用相同的Java版本运行Gradle本身以及构建JVM项目,而这个特性除了可以全局设置项目的Java版本以外,还能够分别为不同的Gradle Task设置不同的Java版本。 以下贴一个官方基础示例,这指定构建、运行、测试项目还有生成javadoc都使用JDK11。

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(11)
    }
}

如果是要单独给不同的Gradle Task设置特别的Java版本,可以这样配置。

tasks.withType(JavaCompile).configureEach {
    javaCompiler = javaToolchains.compilerFor {
        languageVersion = JavaLanguageVersion.of(8)
    }
}
task('testsOn14', type: Test) {
    javaLauncher = javaToolchains.launcherFor {
        languageVersion = JavaLanguageVersion.of(14)
    }
}

默认情况下,Toolchain会自动检测本地Gradle user home directory(此路径可自定义多个,下面再说)以及JDK版本管理工具(包管理器)是否有指定的JDK版本可用。

具体支持以下几个JDK版本管理工具(包管理器),这里引用官方文档说明。

Supported Package Managers:

我没有使用过这三个包管理器,猜测大概是可以查询这些包管理器已安装的JDK列表。

如果本地没有从Gradle user home directory以及JDK版本管理工具(包管理器)中自动检测到指定的JDK版本,还能够从网络上下载JDK,默认下载的是AdoptOpenJDK,以下示例的vendor就是声明使用哪个供应商的JDK。

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(11)
        vendor = JvmVendorSpec.ADOPTOPENJDK
    }
}

查看JvmVendorSpec源码,有以下JDK供应商可以使用。

    public static final JvmVendorSpec ADOPTOPENJDK;
    public static final JvmVendorSpec AMAZON;
    public static final JvmVendorSpec APPLE;
    public static final JvmVendorSpec AZUL;
    public static final JvmVendorSpec BELLSOFT;
    @Incubating
    public static final JvmVendorSpec GRAAL_VM;
    public static final JvmVendorSpec HEWLETT_PACKARD;
    public static final JvmVendorSpec IBM;
    public static final JvmVendorSpec ORACLE;
    public static final JvmVendorSpec SAP;

从供应商自动下载JDKGradle user home directory,如果是Windows系统,那就是会存放在

echo %GRADLE_USER_HOME%\.jdks
//output E:\.gradle\.jdks

上面说过这个自动检测的默认JDK安装路径是可以自定义,并且能够配置多个,方法就是在项目根目录的gradle.properties配置文件,增加以下配置:

org.gradle.java.installations.paths=/custom/path/jdk1.8,/shared/jre11

如果是多个路径需要使用”,”隔开。 如果想知道自动检测本地有哪些JDK版本,可通过gradle -q javaToolchains进行查询。 我是Windows系统,要使用gradlew,有以下输出结果:

>gradlew -q javaToolchains
 + Options
     | Auto-detection:     Enabled
     | Auto-download:      Enabled

 + AdoptOpenJDK 1.8.0_292-b10
     | Location:           E:\.gradle\jdks\jdk8u292-b10
     | Language Version:   8
     | Vendor:             AdoptOpenJDK
     | Is JDK:             true
     | Detected by:        Auto-provisioned by Gradle

 + AdoptOpenJDK 11.0.10+9
     | Location:           E:\.jdks\adopt-openjdk-11.0.10
     | Language Version:   11
     | Vendor:             AdoptOpenJDK
     | Is JDK:             true
     | Detected by:        Current JVM

至此,常用的功能就说完了,如果想知道更多用法,请自行查看官方文档