This is an automated email from the ASF dual-hosted git repository.

gnodet pushed a commit to branch maven-4.0.x
in repository https://gitbox.apache.org/repos/asf/maven.git


The following commit(s) were added to refs/heads/maven-4.0.x by this push:
     new 2dd2693500 [maven-4.0.x] Filter transitive dependencies with 
uninterpolated expressions (#12097)
2dd2693500 is described below

commit 2dd269350074e85287cedd4be2c211a60a230f4c
Author: Guillaume Nodet <[email protected]>
AuthorDate: Wed May 20 16:30:53 2026 +0200

    [maven-4.0.x] Filter transitive dependencies with uninterpolated 
expressions (#12097)
    
    * Filter transitive dependencies with uninterpolated expressions
    
    When a transitive dependency POM contains dependencies with
    uninterpolated property expressions (e.g., ${osgi.version}), the
    MavenValidator.validateDependency() throws IllegalArgumentException
    during dependency collection.
    
    Filter out such dependencies in DefaultArtifactDescriptorReader after
    populateResult() runs, before they reach the resolver/validator,
    following the same pattern used for transitive repositories with
    uninterpolated IDs/URLs (commit 9332ad3d55).
    
    This is safe because invalid dependencies from build POMs have already
    been rejected during model validation. Uninterpolated expressions in
    transitive dependency POMs indicate undefined properties in those
    third-party POMs that cannot be resolved.
    
    Cherry-pick of #12084, adapted for the 4.0.x delegate pattern.
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
    
    * Fix #12086: filter transitive repos with uninterpolated expressions
    
    Extend the uninterpolated expression filtering to also cover
    repositories from transitive dependency POMs. This prevents
    build failures when a transitive dependency defines a repository
    with a property expression (e.g., ${eclipseP2RepoId}) as its ID
    that is only available in the original project context.
    
    Cherry-picked and adapted from PR #12088 for the 4.0.x branch.
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
    
    ---------
    
    Co-authored-by: Claude Opus 4.6 <[email protected]>
---
 .../resolver/DefaultArtifactDescriptorReader.java  | 35 ++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git 
a/impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/DefaultArtifactDescriptorReader.java
 
b/impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/DefaultArtifactDescriptorReader.java
index 0b2badca84..88d168cccf 100644
--- 
a/impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/DefaultArtifactDescriptorReader.java
+++ 
b/impl/maven-impl/src/main/java/org/apache/maven/impl/resolver/DefaultArtifactDescriptorReader.java
@@ -113,6 +113,7 @@ public ArtifactDescriptorResult readArtifactDescriptor(
             }
 
             delegate.populateResult(InternalSession.from(session), result, 
model);
+            filterUninterpolatedDependencies(result);
         }
 
         return result;
@@ -331,4 +332,38 @@ private int getPolicy(RepositorySystemSession session, 
Artifact a, ArtifactDescr
         }
         return policy.getPolicy(session, new 
ArtifactDescriptorPolicyRequest(a, request.getRequestContext()));
     }
+
+    private void filterUninterpolatedDependencies(ArtifactDescriptorResult 
result) {
+        result.getRepositories().removeIf(repo -> {
+            if (containsPlaceholder(repo.getId()) || 
containsPlaceholder(repo.getUrl())) {
+                logger.debug("Filtered repository with uninterpolated 
expression: {}", repo);
+                return true;
+            }
+            return false;
+        });
+        result.getDependencies().removeIf(dep -> {
+            if (hasUninterpolatedExpression(dep.getArtifact())) {
+                logger.debug("Filtered dependency with uninterpolated 
expression: {}", dep);
+                return true;
+            }
+            return false;
+        });
+        result.getManagedDependencies().removeIf(dep -> {
+            if (hasUninterpolatedExpression(dep.getArtifact())) {
+                logger.debug("Filtered managed dependency with uninterpolated 
expression: {}", dep);
+                return true;
+            }
+            return false;
+        });
+    }
+
+    private static boolean hasUninterpolatedExpression(Artifact artifact) {
+        return containsPlaceholder(artifact.getGroupId())
+                || containsPlaceholder(artifact.getArtifactId())
+                || containsPlaceholder(artifact.getVersion());
+    }
+
+    private static boolean containsPlaceholder(String value) {
+        return value != null && value.contains("${");
+    }
 }

Reply via email to