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

  1. Provide a ModelResolver on the request: request.setModelResolver(...) (stub in tests, repository-backed DefaultModelResolver in production)
  2. In tests, stub ModelResolver to return the BOM's ModelSource for its GAV (e.g. Mockito + FileModelSource)
  3. For reactor builds, supply a WorkspaceModelResolver so sibling BOMs resolve without repositories
  4. 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

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


AI-assisted analysis of apache/maven@e4093d4e12 (2026-08-21). Data as JSON: /api/errors/7e154b820f574932. Report an issue: GitHub.