From 240cc047da133bcb99fa72fab4e99c8b3cb22e10 Mon Sep 17 00:00:00 2001 From: XenoAmess Date: Tue, 11 Feb 2025 15:58:01 +0800 Subject: [PATCH] [MNG-8578]add exclusion scope to repo, allow exclude dependencies from build(including parent, dependencies, etc) --- .../aether/collection/CollectRequest.java | 43 ++++++++++++++++ .../collect/DependencyCollectorDelegate.java | 4 ++ .../collect/bf/BfDependencyCollector.java | 23 +++++++-- .../collect/df/DfDependencyCollector.java | 49 +++++++++++++++---- 4 files changed, 106 insertions(+), 13 deletions(-) diff --git a/maven-resolver-api/src/main/java/org/eclipse/aether/collection/CollectRequest.java b/maven-resolver-api/src/main/java/org/eclipse/aether/collection/CollectRequest.java index 1d8842e46..ac195fd6c 100644 --- a/maven-resolver-api/src/main/java/org/eclipse/aether/collection/CollectRequest.java +++ b/maven-resolver-api/src/main/java/org/eclipse/aether/collection/CollectRequest.java @@ -26,6 +26,7 @@ import org.eclipse.aether.RequestTrace; import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.graph.Dependency; +import org.eclipse.aether.graph.Exclusion; import org.eclipse.aether.repository.RemoteRepository; import org.eclipse.aether.scope.ResolutionScope; @@ -55,6 +56,8 @@ public final class CollectRequest { private RequestTrace trace; + private List exclusions = Collections.emptyList(); + /** * Creates an uninitialized request. */ @@ -331,6 +334,46 @@ public CollectRequest setTrace(RequestTrace trace) { return this; } + /** + * Gets the direct exclusions. + * + * @return The direct exclusions, never {@code null}. + */ + public List getExclusions() { + return exclusions; + } + + /** + * Sets the direct exclusions. + * + * @param exclusions The direct exclusions, may be {@code null}. + * @return This request for chaining, never {@code null}. + */ + public CollectRequest setExclusions(List exclusions) { + if (exclusions == null) { + this.exclusions = Collections.emptyList(); + } else { + this.exclusions = exclusions; + } + return this; + } + + /** + * Adds the specified exclusion. + * + * @param exclusion The exclusion to add, may be {@code null}. + * @return This request for chaining, never {@code null}. + */ + public CollectRequest addExclusion(Exclusion exclusion) { + if (exclusion != null) { + if (this.exclusions.isEmpty()) { + this.exclusions = new ArrayList<>(); + } + this.exclusions.add(exclusion); + } + return this; + } + @Override public String toString() { return getRoot() + " -> " + getDependencies() + " < " + getRepositories(); diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegate.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegate.java index 31a5dd919..0f5a620a3 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegate.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DependencyCollectorDelegate.java @@ -40,6 +40,7 @@ import org.eclipse.aether.graph.DefaultDependencyNode; import org.eclipse.aether.graph.Dependency; import org.eclipse.aether.graph.DependencyNode; +import org.eclipse.aether.graph.Exclusion; import org.eclipse.aether.impl.ArtifactDescriptorReader; import org.eclipse.aether.impl.DependencyCollector; import org.eclipse.aether.impl.RemoteRepositoryManager; @@ -140,6 +141,7 @@ public final CollectResult collectDependencies(RepositorySystemSession session, List repositories = request.getRepositories(); List dependencies = request.getDependencies(); List managedDependencies = request.getManagedDependencies(); + List exclusions = request.getExclusions(); Map stats = new LinkedHashMap<>(); long time1 = System.nanoTime(); @@ -230,6 +232,7 @@ public final CollectResult collectDependencies(RepositorySystemSession session, repositories, dependencies, managedDependencies, + exclusions, results); errorPath = results.getErrorPath(); @@ -301,6 +304,7 @@ protected abstract void doCollectDependencies( List repositories, List dependencies, List managedDependencies, + List exclusions, Results results) throws DependencyCollectionException; diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java index 34718c2c8..a984154f9 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/bf/BfDependencyCollector.java @@ -55,6 +55,7 @@ import org.eclipse.aether.graph.DefaultDependencyNode; import org.eclipse.aether.graph.Dependency; import org.eclipse.aether.graph.DependencyNode; +import org.eclipse.aether.graph.Exclusion; import org.eclipse.aether.impl.ArtifactDescriptorReader; import org.eclipse.aether.impl.RemoteRepositoryManager; import org.eclipse.aether.impl.VersionRangeResolver; @@ -74,6 +75,7 @@ import org.eclipse.aether.util.artifact.ArtifactIdUtils; import org.eclipse.aether.util.concurrency.ExecutorUtils; import org.eclipse.aether.util.graph.manager.DependencyManagerUtils; +import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector; import org.eclipse.aether.version.Version; import static org.eclipse.aether.internal.impl.collect.DefaultDependencyCycle.find; @@ -147,6 +149,7 @@ protected void doCollectDependencies( List repositories, List dependencies, List managedDependencies, + List exclusions, Results results) throws DependencyCollectionException { boolean useSkip = ConfigUtils.getBoolean(session, DEFAULT_SKIPPER, CONFIG_PROP_SKIPPER); @@ -162,6 +165,8 @@ protected void doCollectDependencies( : DependencyResolutionSkipper.neverSkipper(); ParallelDescriptorResolver parallelDescriptorResolver = new ParallelDescriptorResolver(nThreads)) { Args args = new Args(session, pool, context, versionContext, request, skipper, parallelDescriptorResolver); + ExclusionDependencySelector exclusionDependencySelector = + exclusions == null || exclusions.isEmpty() ? null : new ExclusionDependencySelector(exclusions); DependencySelector rootDepSelector = session.getDependencySelector() != null ? session.getDependencySelector().deriveChildSelector(context) @@ -200,7 +205,12 @@ protected void doCollectDependencies( while (!args.dependencyProcessingQueue.isEmpty()) { processDependency( - args, results, args.dependencyProcessingQueue.remove(), Collections.emptyList(), false); + args, + results, + args.dependencyProcessingQueue.remove(), + Collections.emptyList(), + false, + exclusionDependencySelector); } if (args.interruptedException.get() != null) { @@ -216,7 +226,8 @@ private void processDependency( Results results, DependencyProcessingContext context, List relocations, - boolean disableVersionManagement) { + boolean disableVersionManagement, + ExclusionDependencySelector exclusionDependencySelector) { if (Thread.interrupted()) { args.interruptedException.set(new InterruptedException()); } @@ -224,6 +235,11 @@ private void processDependency( return; } Dependency dependency = context.dependency; + if (exclusionDependencySelector != null) { + if (!exclusionDependencySelector.selectDependency(dependency)) { + return; + } + } PremanagedDependency preManaged = context.premanagedDependency; boolean noDescriptor = isLackingDescriptor(args.session, dependency.getArtifact()); @@ -291,7 +307,8 @@ private void processDependency( results, relocatedContext, descriptorResult.getRelocations(), - disableVersionManagementSubsequently); + disableVersionManagementSubsequently, + exclusionDependencySelector); } return; diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/df/DfDependencyCollector.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/df/DfDependencyCollector.java index 034d6691e..777e18196 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/df/DfDependencyCollector.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/df/DfDependencyCollector.java @@ -39,6 +39,7 @@ import org.eclipse.aether.graph.DefaultDependencyNode; import org.eclipse.aether.graph.Dependency; import org.eclipse.aether.graph.DependencyNode; +import org.eclipse.aether.graph.Exclusion; import org.eclipse.aether.impl.ArtifactDescriptorReader; import org.eclipse.aether.impl.RemoteRepositoryManager; import org.eclipse.aether.impl.VersionRangeResolver; @@ -57,6 +58,7 @@ import org.eclipse.aether.spi.artifact.decorator.ArtifactDecoratorFactory; import org.eclipse.aether.util.ConfigUtils; import org.eclipse.aether.util.graph.manager.DependencyManagerUtils; +import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector; import org.eclipse.aether.version.Version; /** @@ -92,12 +94,16 @@ protected void doCollectDependencies( List repositories, List dependencies, List managedDependencies, + List exclusions, Results results) throws DependencyCollectionException { + // TODO NodeStack nodes = new NodeStack(); nodes.push(node); Args args = new Args(session, pool, nodes, context, versionContext, request); + ExclusionDependencySelector exclusionDependencySelector = + exclusions == null || exclusions.isEmpty() ? null : new ExclusionDependencySelector(exclusions); process( args, @@ -114,7 +120,8 @@ protected void doCollectDependencies( session.getDependencyTraverser() != null ? session.getDependencyTraverser().deriveChildTraverser(context) : null, - session.getVersionFilter() != null ? session.getVersionFilter().deriveChildFilter(context) : null); + session.getVersionFilter() != null ? session.getVersionFilter().deriveChildFilter(context) : null, + exclusionDependencySelector); if (args.interruptedException.get() != null) { throw new DependencyCollectionException( @@ -132,7 +139,8 @@ private void process( DependencySelector depSelector, DependencyManager depManager, DependencyTraverser depTraverser, - VersionFilter verFilter) { + VersionFilter verFilter, + ExclusionDependencySelector exclusionDependencySelector) { if (Thread.interrupted()) { args.interruptedException.set(new InterruptedException()); } @@ -141,7 +149,16 @@ private void process( } for (Dependency dependency : dependencies) { processDependency( - args, trace, results, repositories, depSelector, depManager, depTraverser, verFilter, dependency); + args, + trace, + results, + repositories, + depSelector, + depManager, + depTraverser, + verFilter, + dependency, + exclusionDependencySelector); } } @@ -155,7 +172,8 @@ private void processDependency( DependencyManager depManager, DependencyTraverser depTraverser, VersionFilter verFilter, - Dependency dependency) { + Dependency dependency, + ExclusionDependencySelector exclusionDependencySelector) { List relocations = Collections.emptyList(); processDependency( @@ -169,7 +187,8 @@ private void processDependency( verFilter, dependency, relocations, - false); + false, + exclusionDependencySelector); } @SuppressWarnings("checkstyle:parameternumber") @@ -184,7 +203,13 @@ private void processDependency( VersionFilter verFilter, Dependency dependency, List relocations, - boolean disableVersionManagement) { + boolean disableVersionManagement, + ExclusionDependencySelector exclusionDependencySelector) { + if (exclusionDependencySelector != null) { + if (!exclusionDependencySelector.selectDependency(dependency)) { + return; + } + } if (depSelector != null && !depSelector.selectDependency(dependency)) { return; } @@ -256,7 +281,8 @@ private void processDependency( verFilter, d, descriptorResult.getRelocations(), - disableVersionManagementSubsequently); + disableVersionManagementSubsequently, + exclusionDependencySelector); return; } else { d = args.pool.intern(d.setArtifact(args.pool.intern(d.getArtifact()))); @@ -290,7 +316,8 @@ private void processDependency( verFilter, d, descriptorResult, - child); + child, + exclusionDependencySelector); } } } else { @@ -322,7 +349,8 @@ private void doRecurse( VersionFilter verFilter, Dependency d, ArtifactDescriptorResult descriptorResult, - DefaultDependencyNode child) { + DefaultDependencyNode child, + ExclusionDependencySelector exclusionDependencySelector) { DefaultDependencyCollectionContext context = args.collectionContext.get(); args.collectionContext.compareAndSet(context, context.set(d, descriptorResult.getManagedDependencies())); context = args.collectionContext.get(); @@ -355,7 +383,8 @@ private void doRecurse( childSelector, childManager, childTraverser, - childFilter); + childFilter, + exclusionDependencySelector); args.nodes.pop(); } else {