This is an automated email from the ASF dual-hosted git repository. gnodet pushed a commit to branch backport-12084-to-4.0.x in repository https://gitbox.apache.org/repos/asf/maven.git
commit a2bbe833277b1dde0076216671688ede0f839a30 Author: Guillaume Nodet <[email protected]> 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 <[email protected]> --- .../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("${"); + } }
