{"record":{"id":"ccdd1726be32650d","repo":"apache/maven","slug":"required-java-version-is-not-met-by-current-ver","errorCode":null,"errorMessage":"Required Java version {} is not met by current version: {}","messagePattern":"Required Java version (.+?) is not met by current version: (.+?)","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"impl/maven-core/src/main/java/org/apache/maven/plugin/internal/MavenPluginJavaPrerequisiteChecker.java","lineNumber":48,"sourceCode":"import org.eclipse.aether.version.VersionScheme;\n\n@Named\n@Singleton\npublic class MavenPluginJavaPrerequisiteChecker implements MavenPluginPrerequisitesChecker {\n    private final VersionScheme versionScheme;\n\n    @Inject\n    public MavenPluginJavaPrerequisiteChecker(VersionScheme versionScheme) {\n        this.versionScheme = versionScheme;\n    }\n\n    @Override\n    public void accept(PluginDescriptor pluginDescriptor) {\n        String requiredJavaVersion = pluginDescriptor.getRequiredJavaVersion();\n        if (requiredJavaVersion != null && !requiredJavaVersion.isEmpty()) {\n            String currentJavaVersion = System.getProperty(\"java.version\");\n            if (!matchesVersion(requiredJavaVersion, currentJavaVersion)) {\n                throw new IllegalStateException(\"Required Java version \" + requiredJavaVersion\n                        + \" is not met by current version: \" + currentJavaVersion);\n            }\n        }\n    }\n\n    boolean matchesVersion(String requiredVersion, String currentVersion) {\n        VersionConstraint constraint;\n        try {\n            constraint = versionScheme.parseVersionConstraint(requiredVersion);\n        } catch (InvalidVersionSpecificationException e) {\n            throw new IllegalArgumentException(\"Invalid 'requiredJavaVersion' given in plugin descriptor\", e);\n        }\n        Version current;\n        try {\n            current = versionScheme.parseVersion(currentVersion);\n        } catch (InvalidVersionSpecificationException e) {\n            throw new IllegalStateException(\"Could not parse current Java version\", e);\n        }","sourceCodeStart":30,"sourceCodeEnd":66,"githubUrl":"https://github.com/apache/maven/blob/e4093d4e120eac99d6bdce5ba67cace2f3085c97/impl/maven-core/src/main/java/org/apache/maven/plugin/internal/MavenPluginJavaPrerequisiteChecker.java#L30-L66","documentation":"The plugin descriptor carries a non-empty requiredJavaVersion, and MavenPluginJavaPrerequisiteChecker compared it against the running JVM's java.version with a Maven VersionConstraint; the constraint does not match, so it throws IllegalStateException and plugin setup aborts before any mojo runs. Note the check applies to the JVM running Maven itself, not to toolchain-selected compilers.","triggerScenarios":"Plugin requires e.g. [17,) while Maven runs on JDK 8/11; range with an exclusive upper bound (e.g. [1.8,1.9) or (,17)) excluding the current newer JDK; CI matrices where one job still uses an older image; CI using a newer JDK than the range allows.","commonSituations":"Upgrading a plugin whose new major bumped the required JDK; legacy ranges written when Java 8/9 were current but now exclude modern JVMs; developers with mismatched JAVA_HOME; container images pinned to old JDKs.","solutions":["Run Maven itself with a JDK satisfying the constraint (set JAVA_HOME / update the CI image).","Pin an older plugin version whose requiredJavaVersion matches your JDK.","If the range excludes your newer JDK (upper-bound style), upgrade the plugin or choose a version with an open-ended range.","If you own the plugin, relax/correct requiredJavaVersion (prefer open-ended lower bounds like [17,)).","Remember toolchains do not help: the prerequisite is checked against the JVM Maven runs on."],"exampleFix":"# before: Maven runs on a JDK older than the plugin requires\nJAVA_HOME=/usr/lib/jvm/java-8-openjdk mvn verify\n# -> IllegalStateException: Required Java version 17 is not met by current version: 1.8.0_392\n\n# after: run Maven on a compliant JDK (or pin an older plugin version)\nJAVA_HOME=/usr/lib/jvm/java-17-openjdk mvn verify","handlingStrategy":"validation","validationCode":"# gate the build on the JDK requirement before Maven loads any plugin\nrequired=17\ncurrent=$(mvn -v | awk '/Java version/ {gsub(/,/, \"\", $3); print $3}')\nlowest=$(printf '%s\\n%s' \"$required\" \"$current\" | sort -V | head -1)\n[ \"$lowest\" = \"$required\" ] || { echo \"Maven needs JDK >= $required, running $current\"; exit 1; }\nmvn verify","typeGuard":null,"tryCatchPattern":"// embedder: check the prerequisite before the plugin manager does\nString required = pluginDescriptor.getRequiredJavaVersion();\nif (required != null && !required.isEmpty()\n        && !versionScheme.parseVersionConstraint(required)\n            .containsVersion(versionScheme.parseVersion(System.getProperty(\"java.version\")))) {\n    throw new IllegalStateException(\"select a JDK matching \" + required + \" before loading \"\n            + pluginDescriptor.getId());\n}","preventionTips":["Enforce the fleet's minimum JDK with maven-enforcer-plugin requireJavaVersion in the root POM.","Pin container/CI images to JDK versions that satisfy every plugin you use.","Note toolchains do not exempt you: the check runs against the JVM that runs Maven.","Track requiredJavaVersion bumps in plugin release notes before upgrading."],"tags":["maven","plugin","java-version","prerequisite","jdk"],"backgroundTag":"java-version-requirement-not-met","analyzedSha":"e4093d4e120eac99d6bdce5ba67cace2f3085c97","analyzedAt":"2026-08-21T22:58:24.034Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}