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/05/18 20:11:13 UTC

(maven) branch maven-4.0.x-test-fixes updated: Filter transitive dependencies with uninterpolated expressions

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 633b8ff862 Filter transitive dependencies with uninterpolated expressions
633b8ff862 is described below

commit 633b8ff862a9ff5edf537bf946eb0466c26e4db0
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Mon May 18 22:11:02 2026 +0200

    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 <no...@anthropic.com>
---
 .../resolver/DefaultArtifactDescriptorReader.java  | 28 ++++++++++++++++++++++
 1 file changed, 28 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..fece86dc64 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,31 @@ private int getPolicy(RepositorySystemSession session, Artifact a, ArtifactDescr
         }
         return policy.getPolicy(session, new ArtifactDescriptorPolicyRequest(a, request.getRequestContext()));
     }
+
+    private void filterUninterpolatedDependencies(ArtifactDescriptorResult result) {
+        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("${");
+    }
 }