apereo/cas · error · GradleException

Current Java version

Error message

Current Java version ${JavaVersion.current()} does not match required Java version ${requiredVersion}

What it means

The verifyRequiredJavaVersion task in the root build.gradle compares JavaVersion.current() (the JVM running Gradle) against the required version derived from project.targetCompatibility (Java 25 for CAS) and throws GradleException on mismatch. It is a build-time guard so contributors don't compile CAS with an unsupported JDK.

Solutions

  1. Set JAVA_HOME to a Java 25 JDK before running Gradle (export JAVA_HOME=/path/to/jdk-25).
  2. Update CI runner images / GitHub Actions setup-java to version 25.
  3. Point the IDE/Gradle daemon JVM (org.gradle.java.home in gradle.properties or ~/.gradle/gradle.properties) at JDK 25.
  4. Stop stale daemons (./gradlew --stop) after changing the JDK so they restart with the right version.

Example fix

// before
export JAVA_HOME=/usr/lib/jvm/jdk-21
// after
export JAVA_HOME=/usr/lib/jvm/jdk-25
Defensive patterns

Strategy: validation

Validate before calling

// shell check before invoking gradle
[ "$JAVA_HOME" ] && "$JAVA_HOME/bin/java" -version 2>&1 | grep -q 'version "25' || echo "JDK 25 required"

Prevention

When it happens

Trigger: Running any Gradle task (e.g. ./gradlew build) with a JDK older than the required version (or a toolchain daemon pinned to an old JDK) after the task executes.

Common situations: Developer machine default JAVA_HOME points to JDK 17/21; IDE Gradle daemon uses an embedded JRE; CI runner image not updated to Java 25.

Understand the failure class

Background: "is not a compatible type" / "cannot merge" errors: when a value's type doesn't match what the library requires — this error's family across 65 libraries.

Related errors


AI-assisted analysis of apereo/cas@e7288fc434 (2026-09-08). Data as JSON: /api/errors/cf4cdd07778ceb03. Report an issue: GitHub.

Appendix: source

Thrown at build.gradle:324

tasks.register('tomcatVersion') {
    description = "Display current Apache Tomcat version"
    doLast {
        println "${tomcatVersion}"
    }
}

tasks.register('signingKey') {
    description = "Display CAS signing key id"
    doLast {
        println "Signing key: " + project.findProperty("signing.keyId")
    }
}

tasks.register('verifyRequiredJavaVersion') {
    def requiredVersion = JavaVersion.toVersion(project.targetCompatibility)
    if (!JavaVersion.current().isCompatibleWith(requiredVersion)) {
        throw new GradleException("Current Java version ${JavaVersion.current()} does not match required Java version ${requiredVersion}")
    }
}

def projectModulesMetadataTaskRequested = CasBuildSettings.isTaskRequested(project, 'generateProjectModulesMetadata') ||
    CasBuildSettings.isTaskRequested(project, 'publishProjectModulesMetadata')
if (projectModulesMetadataTaskRequested) {
    def modulesOutputFile = layout.buildDirectory.file('modules.json')
    def projectVersion = version.toString().replaceAll('-SNAPSHOT', '')
    def projectGroup = group.toString()
    def moduleMetadataResults = CasBuildSettings.includedProjectPaths(project)
        .findAll { projectPath -> projectPath != project.path }
        .collectMany { projectPath ->
            def moduleInfo = CasBuildSettings.projectModuleMetadata(project, projectPath)
            if (!moduleInfo.publishMetadata) {
                return []
            }
            def projectName = CasBuildSettings.projectNameFromPath(projectPath)
            def metadata = new LinkedHashMap<>(moduleInfo.projectMetadata as Map)

View on GitHub (pinned to e7288fc434)