apache/maven · error · NullPointerException
request.workspaceModelResolver and request.modelResolver can
Error message
request.workspaceModelResolver and request.modelResolver cannot be null (parent POM %s and POM %s)
What it means
While importing a BOM (a <dependencyManagement> dependency with <scope>import</scope> and <type>pom</type>), DefaultModelBuilder must resolve the imported POM either from the workspace (workspaceModelResolver) or from repositories (modelResolver). If the ModelBuildingRequest carries neither, resolution is impossible and it throws NullPointerException naming both resolvers plus the importing and imported POM coordinates.
Source
Thrown at compat/maven-model-builder/src/main/java/org/apache/maven/model/building/DefaultModelBuilder.java:1188
StringBuilder message =
new StringBuilder("The dependencies of type=pom and with scope=import form a cycle: ");
for (String modelId : importIds) {
message.append(modelId);
message.append(" -> ");
}
message.append(imported);
problems.add(
new ModelProblemCollectorRequest(Severity.ERROR, Version.BASE).setMessage(message.toString()));
continue;
}
DependencyManagement importMgmt =
getCache(request.getModelCache(), groupId, artifactId, version, ModelCacheTag.IMPORT);
if (importMgmt == null) {
if (workspaceResolver == null && modelResolver == null) {
throw new NullPointerException(String.format(
"request.workspaceModelResolver and request.modelResolver cannot be null"
+ " (parent POM %s and POM %s)",
ModelProblemUtils.toId(groupId, artifactId, version),
ModelProblemUtils.toSourceHint(model)));
}
Model importModel = null;
if (workspaceResolver != null) {
try {
importModel = workspaceResolver.resolveEffectiveModel(groupId, artifactId, version);
} catch (UnresolvableModelException e) {
problems.add(new ModelProblemCollectorRequest(Severity.FATAL, Version.BASE)
.setMessage(e.getMessage())
.setException(e));
continue;
}
}
View on GitHub (pinned to e4093d4e12)
Solutions
- Provide a ModelResolver on the request: request.setModelResolver(...) (stub in tests, repository-backed DefaultModelResolver in production)
- In tests, stub ModelResolver to return the BOM's ModelSource for its GAV (e.g. Mockito + FileModelSource)
- For reactor builds, supply a WorkspaceModelResolver so sibling BOMs resolve without repositories
- Only leave both resolvers null when you are certain no built pom imports a BOM
Example fix
// before: pom imports a BOM but the request has no resolvers -> NPE
// <dependencyManagement><dependencies><dependency>
// <groupId>com.example</groupId><artifactId>bom</artifactId>
// <version>1.0</version><scope>import</scope><type>pom</type>
// </dependency></dependencies></dependencyManagement>
request.setPomFile(pom);
// after: supply a ModelResolver (stub in tests)
ModelResolver resolver = mock(ModelResolver.class);
when(resolver.resolveModel("com.example", "bom", "1.0"))
.thenReturn(new FileModelSource(new File("repos/com/example/bom/1.0/bom-1.0.pom")));
request.setModelResolver(resolver); Defensive patterns
Strategy: validation
Validate before calling
// Any pom that imports a BOM needs at least one resolver
if (request.getModelResolver() == null && request.getWorkspaceModelResolver() == null) {
ModelResolver resolver = mock(ModelResolver.class);
when(resolver.resolveModel("com.example", "bom", "1.0"))
.thenReturn(new FileModelSource(bomPom));
request.setModelResolver(resolver); // or wire a real resolver
} Prevention
- In tests, always install a stub ModelResolver serving parent and BOM poms from src/test/resources
- For embedded use, wire a WorkspaceModelResolver for reactor siblings plus a repository-backed ModelResolver
- Add a smoke test that builds a pom containing a <scope>import</scope> BOM
When it happens
Trigger: Building a POM that imports a BOM with a ModelBuildingRequest whose modelResolver and workspaceModelResolver are both null, standard in unit tests that build models without repository infrastructure.
Common situations: Unit tests using DefaultModelBuilder directly on poms with BOM imports; embedded Maven usage that forgot to install a ModelResolver; tooling that only reads raw models but consumes poms importing BOMs.
Related errors
- Unable to get a selected Version for {}
- lifecycle bindings injector is missing
- neither pomFile nor modelSource can be null
- Unable to build project
- Not a regular file: ${path}
AI-assisted analysis of apache/maven@e4093d4e12 (2026-08-21).
Data as JSON: /api/errors/7e154b820f574932.
Report an issue: GitHub.