apache/maven · warning

Skipping repository '{}' (url: '{}') containing an uninterpo

Error message

Skipping repository '{}' (url: '{}') containing an uninterpolated property expression

What it means

During conversion of POM <repositories> into ArtifactRepository objects, Maven found a repository whose id or url still contains a literal ${...} property expression after model interpolation. Because an uninterpolated URL would produce garbage download requests, the repository is skipped entirely and its artifacts are resolved only from the remaining repositories. This is logged once per offending repository. It almost always means the property that should define the URL is undefined in the context where the POM was interpolated.

Source

Thrown at impl/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java:96

            MavenRepositorySystem repositorySystem,
            MavenPluginManager pluginManager) {
        this.classRealmManager = classRealmManager;
        this.projectRealmCache = projectRealmCache;
        this.repositorySystem = repositorySystem;
        this.pluginManager = pluginManager;
    }

    @Override
    public List<ArtifactRepository> createArtifactRepositories(
            List<Repository> pomRepositories,
            List<ArtifactRepository> externalRepositories,
            ProjectBuildingRequest request)
            throws InvalidRepositoryException {
        List<ArtifactRepository> internalRepositories = new ArrayList<>();

        for (Repository repository : pomRepositories) {
            if (containsExpression(repository.getId()) || containsExpression(repository.getUrl())) {
                logger.warn(
                        "Skipping repository '{}' (url: '{}') containing an uninterpolated property expression",
                        repository.getId(),
                        repository.getUrl());
                continue;
            }
            internalRepositories.add(MavenRepositorySystem.buildArtifactRepository(repository));
        }

        repositorySystem.injectMirror(request.getRepositorySession(), internalRepositories);

        repositorySystem.injectProxy(request.getRepositorySession(), internalRepositories);

        repositorySystem.injectAuthentication(request.getRepositorySession(), internalRepositories);

        List<ArtifactRepository> dominantRepositories;
        List<ArtifactRepository> recessiveRepositories;

        if (ProjectBuildingRequest.RepositoryMerging.REQUEST_DOMINANT.equals(request.getRepositoryMerging())) {

View on GitHub (pinned to e4093d4e12)

Solutions

  1. Run mvn help:effective-pom -Doutput=effective.xml and inspect the <repositories> section for the leftover ${...} placeholder
  2. Define the property in the POM <properties>, or activate the profile that defines it (mvn -P<profileId>)
  3. If the property comes from settings.xml, verify the settings profile is active (mvn help:active-profiles)
  4. As a last resort hardcode the repository URL to unblock the build

Example fix

<!-- before: property only exists in a non-activated profile -->
<repositories>
  <repository>
    <id>internal</id>
    <url>${internal.repo.url}</url>
  </repository>
</repositories>

<!-- after: property always defined in the POM -->
<properties>
  <internal.repo.url>https://repo.example.com/maven</internal.repo.url>
</properties>
<repositories>
  <repository>
    <id>internal</id>
    <url>${internal.repo.url}</url>
  </repository>
</repositories>
Defensive patterns

Strategy: validation

Validate before calling

// Fail fast on uninterpolated repository coordinates before resolution starts
for (org.apache.maven.model.Repository repo : project.getModel().getRepositories()) {
    if (repo.getUrl() != null && repo.getUrl().contains("${")
            || repo.getId() != null && repo.getId().contains("${")) {
        throw new IllegalStateException(
            "Repository " + repo.getId() + " has uninterpolated url " + repo.getUrl()
            + " -> it will be skipped; define the property or activate its profile");
    }
}

Prevention

When it happens

Trigger: ProjectBuildingHelper.createArtifactRepositories() runs on every project whose effective model declares <repository> entries with ${...} in <id> or <url>, and the referenced property is not defined: the property lives in a <profile> that was not activated, in a parent that failed to build (see the swallowed-parent warning), or the property name is misspelled.

Common situations: Repository URL defined as ${repo.url} with the property only inside an environment-specific profile that CI does not activate; property defined in a profile activated by JDK presence that changed after a Java upgrade; typo in the property name; property supplied only via settings.xml profile while the POM assumes it.

Related errors


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