elastic/elasticsearch · error · GradleException

Project requires Java version of {} or newer but Gradle JAVA

Error message

Project requires Java version of {} or newer but Gradle JAVA_HOME is {}

What it means

Thrown by GlobalBuildInfoPlugin.assertMinimumCompilerVersion() when the Gradle daemon's own JAVA_HOME (Jvm.current()) has a Java version older than minimumCompilerVersion (from version.properties). This check is skipped when system property idea.active=true (IntelliJ integration). The comparison uses JavaVersion.compareTo.

Source

Thrown at build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/info/GlobalBuildInfoPlugin.java:375

    }

    private static void throwInvalidJavaHomeException(String description, File javaHome, int expectedVersion, int actualVersion) {
        String message = String.format(
            Locale.ROOT,
            "The %s must be set to a JDK installation directory for Java %d but is [%s] corresponding to [%s]",
            description,
            expectedVersion,
            javaHome,
            actualVersion
        );

        throw new GradleException(message);
    }

    private static void assertMinimumCompilerVersion(JavaVersion minimumCompilerVersion) {
        JavaVersion currentVersion = Jvm.current().getJavaVersion();
        if (System.getProperty("idea.active", "false").equals("true") == false && minimumCompilerVersion.compareTo(currentVersion) > 0) {
            throw new GradleException(
                "Project requires Java version of " + minimumCompilerVersion + " or newer but Gradle JAVA_HOME is " + currentVersion
            );
        }
    }

    private RuntimeJava findRuntimeJavaHome() {
        Properties versionProperties = (Properties) project.getExtensions().getByName(VERSIONS_EXT);
        String bundledJdkVersion = versionProperties.getProperty("bundled_jdk");
        String bundledJdkMajorVersion = bundledJdkVersion.split("[.+]")[0];

        String runtimeJavaProperty = System.getProperty("runtime.java");
        if (runtimeJavaProperty != null) {
            if (runtimeJavaProperty.toLowerCase().endsWith("-pre")) {
                // handle pre-release builds differently due to lack of support in Gradle toolchain service
                // we resolve them using JdkDownloadPlugin for now.
                return resolvePreReleaseRuntimeJavaHome(runtimeJavaProperty, bundledJdkMajorVersion);
            } else {
                return runtimeJavaHome(resolveJavaHomeFromToolChainService(runtimeJavaProperty), true, bundledJdkMajorVersion);

View on GitHub (pinned to db6a809a66)

Solutions

  1. Set JAVA_HOME to a JDK >= minimumCompilerJava: export JAVA_HOME=/path/to/jdk-21.
  2. Stop and restart the Gradle daemon so it picks up the new JAVA_HOME: ./gradlew --stop && ./gradlew build.
  3. Check the required version in version.properties (minimumCompilerJava).
  4. If running in IntelliJ, the check is bypassed (idea.active=true), but command-line builds still require the correct JAVA_HOME.

Example fix

# before
export JAVA_HOME=/opt/jdk-17  # Gradle runs on 17, project requires 21
./gradlew build

# after
export JAVA_HOME=/opt/jdk-21
./gradlew --stop  # kill old daemon
./gradlew build
Defensive patterns

Strategy: validation

Validate before calling

// Validate Gradle JDK version before build
Properties vp = (Properties) project.getExtensions().getByName(VERSIONS_EXT);
JavaVersion minimum = JavaVersion.toVersion(vp.get("minimumCompilerJava"));
if (Jvm.current().getJavaVersion().compareTo(minimum) < 0) {
    throw new GradleException("Gradle JAVA_HOME must be Java " + minimum + "+");
}

Prevention

When it happens

Trigger: Gradle is launched with a JAVA_HOME that points to a JDK older than minimumCompilerJava from version.properties. The check runs during apply() unless idea.active is 'true'. For example, minimumCompilerJava is 21 but Gradle runs on Java 17.

Common situations: JAVA_HOME env var points to an old JDK used by other projects. The Gradle daemon was started with an old JDK and is being reused. A CI agent has a default JAVA_HOME that is outdated. IntelliJ is configured correctly (idea.active=true bypasses this) but command-line builds fail.

Related errors


AI-assisted analysis of elastic/elasticsearch@db6a809a66 (2026-08-12). Data as JSON: /api/errors/1d36cceab5ab0f8c. Report an issue: GitHub.