{"record":{"id":"1d36cceab5ab0f8c","repo":"elastic/elasticsearch","slug":"project-requires-java-version-of-or-newer-but-g","errorCode":null,"errorMessage":"Project requires Java version of {} or newer but Gradle JAVA_HOME is {}","messagePattern":"Project requires Java version of (.+?) or newer but Gradle JAVA_HOME is (.+?)","errorType":"validation","errorClass":"GradleException","httpStatus":null,"severity":"error","filePath":"build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/info/GlobalBuildInfoPlugin.java","lineNumber":375,"sourceCode":"    }\n\n    private static void throwInvalidJavaHomeException(String description, File javaHome, int expectedVersion, int actualVersion) {\n        String message = String.format(\n            Locale.ROOT,\n            \"The %s must be set to a JDK installation directory for Java %d but is [%s] corresponding to [%s]\",\n            description,\n            expectedVersion,\n            javaHome,\n            actualVersion\n        );\n\n        throw new GradleException(message);\n    }\n\n    private static void assertMinimumCompilerVersion(JavaVersion minimumCompilerVersion) {\n        JavaVersion currentVersion = Jvm.current().getJavaVersion();\n        if (System.getProperty(\"idea.active\", \"false\").equals(\"true\") == false && minimumCompilerVersion.compareTo(currentVersion) > 0) {\n            throw new GradleException(\n                \"Project requires Java version of \" + minimumCompilerVersion + \" or newer but Gradle JAVA_HOME is \" + currentVersion\n            );\n        }\n    }\n\n    private RuntimeJava findRuntimeJavaHome() {\n        Properties versionProperties = (Properties) project.getExtensions().getByName(VERSIONS_EXT);\n        String bundledJdkVersion = versionProperties.getProperty(\"bundled_jdk\");\n        String bundledJdkMajorVersion = bundledJdkVersion.split(\"[.+]\")[0];\n\n        String runtimeJavaProperty = System.getProperty(\"runtime.java\");\n        if (runtimeJavaProperty != null) {\n            if (runtimeJavaProperty.toLowerCase().endsWith(\"-pre\")) {\n                // handle pre-release builds differently due to lack of support in Gradle toolchain service\n                // we resolve them using JdkDownloadPlugin for now.\n                return resolvePreReleaseRuntimeJavaHome(runtimeJavaProperty, bundledJdkMajorVersion);\n            } else {\n                return runtimeJavaHome(resolveJavaHomeFromToolChainService(runtimeJavaProperty), true, bundledJdkMajorVersion);","sourceCodeStart":357,"sourceCodeEnd":393,"githubUrl":"https://github.com/elastic/elasticsearch/blob/db6a809a667c081ca1dc7500389d26975573215f/build-tools-internal/src/main/java/org/elasticsearch/gradle/internal/info/GlobalBuildInfoPlugin.java#L357-L393","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Set JAVA_HOME to a JDK >= minimumCompilerJava: export JAVA_HOME=/path/to/jdk-21.","Stop and restart the Gradle daemon so it picks up the new JAVA_HOME: ./gradlew --stop && ./gradlew build.","Check the required version in version.properties (minimumCompilerJava).","If running in IntelliJ, the check is bypassed (idea.active=true), but command-line builds still require the correct JAVA_HOME."],"exampleFix":"# before\nexport JAVA_HOME=/opt/jdk-17  # Gradle runs on 17, project requires 21\n./gradlew build\n\n# after\nexport JAVA_HOME=/opt/jdk-21\n./gradlew --stop  # kill old daemon\n./gradlew build","handlingStrategy":"validation","validationCode":"// Validate Gradle JDK version before build\nProperties vp = (Properties) project.getExtensions().getByName(VERSIONS_EXT);\nJavaVersion minimum = JavaVersion.toVersion(vp.get(\"minimumCompilerJava\"));\nif (Jvm.current().getJavaVersion().compareTo(minimum) < 0) {\n    throw new GradleException(\"Gradle JAVA_HOME must be Java \" + minimum + \"+\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Set JAVA_HOME to a JDK >= minimumCompilerJava before launching Gradle.","Restart the Gradle daemon after changing JAVA_HOME: ./gradlew --stop.","Verify java -version matches expectations before building."],"tags":["java-toolchain","jdk","version-compatibility","gradle","environment"],"analyzedSha":"db6a809a667c081ca1dc7500389d26975573215f","analyzedAt":"2026-08-12T01:39:14.192Z","schemaVersion":2},"datasetVersion":"2026-08-12T08:17:17.861Z"}