Running Multiple JDK Versions with the Gradle Toolchains Configuration
When working with Java projects, you may end up working across multiple JDKs. It may be that you use different vendors, such as Oracle or the OpenJDK, or whether you're working with different Java versions.
It can be annoying to constantly change your JAVA_HOME
, and doesn't work when you may need multiple JDKs in a single project.
Similar to the Maven Toolchains Plugin, from Gradle 6.7 there is toolchains support.
This allows you, in your build.gradle
to add:
plugins {
id 'java'
}
java {
// NOTE: this is very important to make sure it's applied alongside any other
// `java` configuration, such as `javadoc`
toolchain {
// if you're not yet on a newer JDK
languageVersion.set(JavaLanguageVersion.of(8))
// or if you're using a newer JDK
languageVersion.set(JavaLanguageVersion.of(17))
}
}
The Toolchains for JVM projects documentation displays more information, such as specifying a vendor's JDK.
This is super helpful, and unlike the Maven configuration, Gradle does a bit more behind the scenes for us to detect what JDKs are available, and if any are missing, it'll attempt to download them!
You can see what Gradle autodetects using gradle -q javaToolchains
:
$ gradle -q javaToolchains
+ Options
| Auto-detection: Enabled
| Auto-download: Enabled
+ OpenJDK 1.8.0_292
| Location: /usr/lib/jvm/java-8-openjdk
| Language Version: 8
| Vendor: Oracle
| Is JDK: true
| Detected by: Current JVM
+ OpenJDK 11.0.11
| Location: /usr/lib/jvm/java-11-openjdk
| Language Version: 11
| Vendor: Oracle
| Is JDK: true
| Detected by: Common Linux Locations