You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by gn...@apache.org on 2026/06/02 09:00:03 UTC
(maven) branch maven-4.0.x-test-fixes updated: Filter project repositories with uninterpolated property expressions (PR #12204)
This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a commit to branch maven-4.0.x-test-fixes
in repository https://gitbox.apache.org/repos/asf/maven.git
The following commit(s) were added to refs/heads/maven-4.0.x-test-fixes by this push:
new 9a6f7a5ffe Filter project repositories with uninterpolated property expressions (PR #12204)
9a6f7a5ffe is described below
commit 9a6f7a5ffe54eff8112046ff3f58f7f3a0dccc37
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Tue Jun 2 10:59:56 2026 +0200
Filter project repositories with uninterpolated property expressions (PR #12204)
Cherry-pick from fix/filter-unresolvable-project-repos branch.
Co-Authored-By: Claude Opus 4.6 <no...@anthropic.com>
---
.../project/DefaultProjectBuildingHelper.java | 11 +++++++++
.../maven/impl/model/DefaultModelValidator.java | 8 +++----
.../impl/model/DefaultModelValidatorTest.java | 26 ++++++++++++----------
.../it/MavenITgh11140RepoDmUnresolvedTest.java | 13 +++++------
.../it/MavenITgh11140RepoInterpolationTest.java | 11 ++++-----
5 files changed, 38 insertions(+), 31 deletions(-)
diff --git a/impl/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java b/impl/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java
index f8f77c7cea..6bde396a97 100644
--- a/impl/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java
+++ b/impl/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuildingHelper.java
@@ -92,6 +92,13 @@ public List<ArtifactRepository> createArtifactRepositories(
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));
}
@@ -267,6 +274,10 @@ public void selectProjectRealm(MavenProject project) {
Thread.currentThread().setContextClassLoader(projectRealm);
}
+ private static boolean containsExpression(String value) {
+ return value != null && value.contains("${");
+ }
+
private List<org.eclipse.aether.artifact.Artifact> toAetherArtifacts(final List<Artifact> pluginArtifacts) {
return new ArrayList<>(RepositoryUtils.toArtifacts(pluginArtifacts));
}
diff --git a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelValidator.java b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelValidator.java
index 44b3353336..f17504b7d0 100644
--- a/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelValidator.java
+++ b/impl/maven-impl/src/main/java/org/apache/maven/impl/model/DefaultModelValidator.java
@@ -1535,11 +1535,11 @@ private void validateRawRepository(
if (matcher.find()) {
addViolation(
problems,
- Severity.ERROR,
+ Severity.WARNING,
Version.V40,
prefix + prefix2 + "[" + repository.getId() + "].id",
null,
- "contains an uninterpolated expression.",
+ "contains an uninterpolated expression; the repository will be skipped.",
repository);
}
}
@@ -1561,11 +1561,11 @@ && validateStringNotEmpty(
if (matcher.find()) {
addViolation(
problems,
- Severity.ERROR,
+ Severity.WARNING,
Version.V40,
prefix + prefix2 + "[" + repository.getId() + "].url",
null,
- "contains an uninterpolated expression.",
+ "contains an uninterpolated expression; the repository will be skipped.",
repository);
}
}
diff --git a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelValidatorTest.java b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelValidatorTest.java
index 36ba2745a0..c65391872c 100644
--- a/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelValidatorTest.java
+++ b/impl/maven-impl/src/test/java/org/apache/maven/impl/model/DefaultModelValidatorTest.java
@@ -907,31 +907,33 @@ void repositoryWithBasedirExpression() throws Exception {
SimpleProblemCollector result = validateRaw("raw-model/repository-with-basedir-expression.xml");
// This test runs on raw model without interpolation, so all expressions appear uninterpolated
// In the real flow, supported expressions would be interpolated before validation
- assertViolations(result, 0, 3, 0);
+ assertViolations(result, 0, 0, 3);
}
@Test
void repositoryWithUnsupportedExpression() throws Exception {
SimpleProblemCollector result = validateRaw("raw-model/repository-with-unsupported-expression.xml");
- // Unsupported expressions should cause validation errors
- assertViolations(result, 0, 1, 0);
+ // Unsupported expressions should cause validation warnings (repos will be skipped at build time)
+ assertViolations(result, 0, 0, 1);
}
@Test
void repositoryWithUninterpolatedId() throws Exception {
SimpleProblemCollector result = validateRaw("raw-model/repository-with-uninterpolated-id.xml");
- // Uninterpolated expressions in repository IDs should cause validation errors
+ // Uninterpolated expressions in repository IDs should cause validation warnings
+ // (repos will be skipped at build time)
// distributionManagement repositories skip expression check since parent properties
// may not be available at file model validation stage
- assertViolations(result, 0, 2, 0);
+ assertViolations(result, 0, 0, 2);
- // Check that repository ID validation errors are present for repositories and pluginRepositories
- assertTrue(result.getErrors().stream()
- .anyMatch(error -> error.contains("repositories.repository.[${repository.id}].id")
- && error.contains("contains an uninterpolated expression")));
- assertTrue(result.getErrors().stream()
- .anyMatch(error -> error.contains("pluginRepositories.pluginRepository.[${plugin.repository.id}].id")
- && error.contains("contains an uninterpolated expression")));
+ // Check that repository ID validation warnings are present for repositories and pluginRepositories
+ assertTrue(result.getWarnings().stream()
+ .anyMatch(warning -> warning.contains("repositories.repository.[${repository.id}].id")
+ && warning.contains("contains an uninterpolated expression")));
+ assertTrue(result.getWarnings().stream()
+ .anyMatch(
+ warning -> warning.contains("pluginRepositories.pluginRepository.[${plugin.repository.id}].id")
+ && warning.contains("contains an uninterpolated expression")));
}
@Test
diff --git a/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITgh11140RepoDmUnresolvedTest.java b/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITgh11140RepoDmUnresolvedTest.java
index b3a2929239..6716658281 100644
--- a/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITgh11140RepoDmUnresolvedTest.java
+++ b/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITgh11140RepoDmUnresolvedTest.java
@@ -32,17 +32,14 @@ class MavenITgh11140RepoDmUnresolvedTest extends AbstractMavenIntegrationTestCas
}
@Test
- void testFailsOnUnresolvedPlaceholders() throws Exception {
+ void testWarnsOnUnresolvedPlaceholders() throws Exception {
File testDir = extractResources("/gh-11140-repo-dm-unresolved");
Verifier verifier = newVerifier(testDir.getAbsolutePath());
- try {
- verifier.addCliArgument("validate");
- verifier.execute();
- } catch (VerificationException expected) {
- // Expected to fail due to unresolved placeholders during model validation
- }
- // We expect error mentioning uninterpolated expression
+ verifier.addCliArgument("validate");
+ verifier.execute();
+ // Build should succeed, but warn about uninterpolated expressions (repos are skipped)
+ verifier.verifyErrorFreeLog();
verifier.verifyTextInLog("contains an uninterpolated expression");
}
}
diff --git a/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITgh11140RepoInterpolationTest.java b/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITgh11140RepoInterpolationTest.java
index d354b33f2e..30b34510a3 100644
--- a/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITgh11140RepoInterpolationTest.java
+++ b/its/core-it-suite/src/test/java/org/apache/maven/it/MavenITgh11140RepoInterpolationTest.java
@@ -73,18 +73,15 @@ private static String getBaseUri(Path base) {
}
@Test
- void testUnresolvedPlaceholderFailsResolution() throws Exception {
+ void testUnresolvedPlaceholderWarnsAndSkipsRepository() throws Exception {
File testDir = extractResources("/gh-11140-repo-interpolation");
Verifier verifier = newVerifier(testDir.getAbsolutePath());
// Do NOT set env vars, so placeholders stay
verifier.addCliArgument("validate");
- try {
- verifier.execute();
- } catch (VerificationException expected) {
- // Expected to fail due to unresolved placeholders during model validation
- }
- // We expect error mentioning uninterpolated expression
+ verifier.execute();
+ // Build should succeed, but warn about uninterpolated expressions
+ verifier.verifyErrorFreeLog();
verifier.verifyTextInLog("contains an uninterpolated expression");
}
}