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
- Run mvn help:effective-pom -Doutput=effective.xml and inspect the <repositories> section for the leftover ${...} placeholder
- Define the property in the POM <properties>, or activate the profile that defines it (mvn -P<profileId>)
- If the property comes from settings.xml, verify the settings profile is active (mvn help:active-profiles)
- 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
- Define repository URL properties in unconditionally active <properties>, not only inside profiles
- Run mvn help:effective-pom in CI and grep the <repositories> block for '${' to catch placeholders
- Keep environment-specific repository configuration in settings.xml mirror entries rather than POM properties
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
- Repository list contains duplicate entries. Each repository
- {} could not be retrieved from repository: {} due to an erro
- Invalid remote repository {}
- Cannot serialize project model for interpolation.
- Cannot read project model from interpolating filter of seria
AI-assisted analysis of apache/maven@e4093d4e12 (2026-08-21).
Data as JSON: /api/errors/85e63b9df164fb2c.
Report an issue: GitHub.