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");
     }
 }