{"record":{"id":"fcf10fdc04e57a49","repo":"apache/maven","slug":"invalid-requiredjavaversion-given-in-plugin-desc","errorCode":null,"errorMessage":"Invalid 'requiredJavaVersion' given in plugin descriptor","messagePattern":"Invalid 'requiredJavaVersion' given in plugin descriptor","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"impl/maven-core/src/main/java/org/apache/maven/plugin/internal/MavenPluginJavaPrerequisiteChecker.java","lineNumber":59,"sourceCode":"\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        }\n        if (constraint.getRange() == null) {\n            return constraint.getVersion().compareTo(current) <= 0;\n        }\n        return constraint.containsVersion(current);\n    }\n}\n","sourceCodeStart":41,"sourceCodeEnd":73,"githubUrl":"https://github.com/apache/maven/blob/e4093d4e120eac99d6bdce5ba67cace2f3085c97/impl/maven-core/src/main/java/org/apache/maven/plugin/internal/MavenPluginJavaPrerequisiteChecker.java#L41-L73","documentation":"MavenPluginJavaPrerequisiteChecker tried to parse the plugin descriptor's requiredJavaVersion as a Maven version constraint and versionScheme.parseVersionConstraint threw InvalidVersionSpecificationException, so it rethrows IllegalArgumentException naming the culprit field. The plugin itself ships malformed metadata — the string is not valid version or range syntax (e.g. '17+', '>=1.8', unbalanced brackets).","triggerScenarios":"Hand-edited plugin.xml or a descriptor generator writing non-Maven syntax; typo in the requiredJavaVersion property used to produce the descriptor; plugin built with a custom packaging that never validated the value.","commonSituations":"Developers assuming semver/npm-style operators ('>=17', '^17'); missing closing bracket in ranges ('[1.8'); copy-paste from README examples of other ecosystems.","solutions":["If you own the plugin, fix the descriptor to valid syntax: plain version ('17') or Maven range ('[17,)').","Regenerate the descriptor rather than hand-editing, so the value round-trips through the plugin plugin's validation.","If third-party, report the malformed requiredJavaVersion to the plugin project and use a fixed release.","As a temporary workaround, build an older plugin version without the metadata or remove the prerequisite locally and reinstall.","Add a unit test that parses requiredJavaVersion with GenericVersionScheme so CI catches it."],"exampleFix":"<!-- before: not valid Maven constraint syntax -->\n<requiredJavaVersion>17+</requiredJavaVersion>\n\n<!-- after: valid plain version or open-ended range -->\n<requiredJavaVersion>[17,)</requiredJavaVersion>","handlingStrategy":"validation","validationCode":"// plugin authors: validate the descriptor value in a unit test, exactly as Maven will parse it\nimport org.apache.maven.artifact.versioning.GenericVersionScheme;\n\n@Test\nvoid requiredJavaVersionIsParsable() throws Exception {\n    String v = new MojoDescriptorBuilder() /* your descriptor source */ .getRequiredJavaVersion();\n    if (v != null && !v.isEmpty()) {\n        new GenericVersionScheme().parseVersionConstraint(v); // throws InvalidVersionSpecificationException\n    }\n}","typeGuard":null,"tryCatchPattern":"// embedder: detect the malformed-metadata case and name the plugin at fault\ntry {\n    prerequisiteChecker.accept(pluginDescriptor);\n} catch (IllegalArgumentException e) {\n    if (e.getCause() instanceof InvalidVersionSpecificationException) {\n        log.error(\"plugin {} ships invalid requiredJavaVersion '{}'; use a version or range like [17,)\"\n                .formatted(pluginDescriptor.getId(), pluginDescriptor.getRequiredJavaVersion()));\n    }\n    throw e;\n}","preventionTips":["Never hand-edit plugin.xml metadata; regenerate the descriptor from the build.","Use Maven range syntax for prerequisites ([17,), [1.8,11)) — not >=, ^, or + operators.","Add a descriptor-validation unit test to every plugin build so CI rejects bad metadata.","For consumers: pin plugin versions you have already validated in a scratch build."],"tags":["maven","plugin","version-range","descriptor-validation","plugin-metadata"],"backgroundTag":"invalid-version-range-syntax","analyzedSha":"e4093d4e120eac99d6bdce5ba67cace2f3085c97","analyzedAt":"2026-08-21T22:58:24.034Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}