{"record":{"id":"21aa0146b57c01eb","repo":"apache/maven","slug":"the-requested-parent-version-range-s-does-not-s","errorCode":null,"errorMessage":"The requested parent version range '%s' does not specify an upper bound","messagePattern":"The requested parent version range '(.+?)' does not specify an upper bound","errorType":"exception","errorClass":"UnresolvableModelException","httpStatus":null,"severity":"error","filePath":"compat/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultModelResolver.java","lineNumber":194,"sourceCode":"            versionRangeRequest.setTrace(trace);\n\n            final VersionRangeResult versionRangeResult =\n                    versionRangeResolver.resolveVersionRange(session, versionRangeRequest);\n\n            if (versionRangeResult.getHighestVersion() == null) {\n                throw new UnresolvableModelException(\n                        String.format(\n                                \"No versions matched the requested parent version range '%s'\", parent.getVersion()),\n                        parent.getGroupId(),\n                        parent.getArtifactId(),\n                        parent.getVersion());\n            }\n\n            if (versionRangeResult.getVersionConstraint() != null\n                    && versionRangeResult.getVersionConstraint().getRange() != null\n                    && versionRangeResult.getVersionConstraint().getRange().getUpperBound() == null) {\n                // Message below is checked for in the MNG-2199 core IT.\n                throw new UnresolvableModelException(\n                        String.format(\n                                \"The requested parent version range '%s' does not specify an upper bound\",\n                                parent.getVersion()),\n                        parent.getGroupId(),\n                        parent.getArtifactId(),\n                        parent.getVersion());\n            }\n\n            parent.setVersion(versionRangeResult.getHighestVersion().toString());\n\n            return resolveModel(parent.getGroupId(), parent.getArtifactId(), parent.getVersion());\n        } catch (final VersionRangeResolutionException e) {\n            throw new UnresolvableModelException(\n                    e.getMessage(), parent.getGroupId(), parent.getArtifactId(), parent.getVersion(), e);\n        }\n    }\n\n    @Override","sourceCodeStart":176,"sourceCodeEnd":212,"githubUrl":"https://github.com/apache/maven/blob/e4093d4e120eac99d6bdce5ba67cace2f3085c97/compat/maven-resolver-provider/src/main/java/org/apache/maven/repository/internal/DefaultModelResolver.java#L176-L212","documentation":"Maven deliberately forbids open-ended parent version ranges (MNG-2199): when the resolved range has no upper bound, e.g. [1.0,), DefaultModelResolver throws UnresolvableModelException even though matching versions exist, because an unbounded parent would make builds non-reproducible. The exact message is asserted by the MNG-2199 core integration test.","triggerScenarios":"<parent><version>[1.0,)</version></parent> or any range whose computed upper bound is null; the version-range resolver succeeded and matched versions, but the constraint check rejects the unbounded range.","commonSituations":"Developers attempting 'always latest parent' semantics; ranges copied from dependency management (where they are legal) into the parent element; CI suddenly failing after a previously concrete parent version was switched to a range.","solutions":["Give the range an upper bound, e.g. [1.0,2.0)","Prefer a concrete parent version: parent ranges are only partially supported and discouraged","Use versions-maven-plugin (display-parent-updates, set-parent) to manage parent version bumps instead of ranges","Add a lint check in CI rejecting open-ended ranges inside <parent>"],"exampleFix":"<!-- before: open-ended parent range (rejected even when versions match) -->\n<parent>\n  <groupId>com.example</groupId>\n  <artifactId>platform</artifactId>\n  <version>[2.0,)</version>\n</parent>\n\n<!-- after: bounded range or concrete version -->\n<parent>\n  <groupId>com.example</groupId>\n  <artifactId>platform</artifactId>\n  <version>[2.0,3.0)</version>\n</parent>","handlingStrategy":"validation","validationCode":"// Reject open-ended parent ranges before building\nVersionRange range = VersionRange.createFromVersionSpec(parent.getVersion()); // parse first\nif (!hasUpperBound(range)) {\n    throw new IllegalArgumentException(\n        \"Parent version range needs an upper bound: \" + parent.getVersion());\n}","typeGuard":"static boolean hasUpperBound(VersionRange r) {\n    return r.getRestrictions().stream().anyMatch(x -> x.getUpperBound() != null);\n}","tryCatchPattern":null,"preventionTips":["Always bound parent version ranges on both ends","Use versions-maven-plugin (set-parent, display-parent-updates) instead of ranges to track parent versions","Add a lint rule rejecting open-ended ranges inside <parent>"],"tags":["maven","parent-pom","version-range","reproducibility","mng-2199"],"backgroundTag":"version-range-resolution-failed","analyzedSha":"e4093d4e120eac99d6bdce5ba67cace2f3085c97","analyzedAt":"2026-08-21T22:58:24.034Z","schemaVersion":2},"datasetVersion":"2026-08-21T23:17:16.201Z"}