diff --git a/maven-core/src/main/java/org/apache/maven/RepositoryUtils.java b/maven-core/src/main/java/org/apache/maven/RepositoryUtils.java index 7befe8ec9a16..0d6ca9b807ea 100644 --- a/maven-core/src/main/java/org/apache/maven/RepositoryUtils.java +++ b/maven-core/src/main/java/org/apache/maven/RepositoryUtils.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -33,6 +34,7 @@ import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy; +import org.apache.maven.project.DependencyResolutionResult; import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.artifact.ArtifactProperties; @@ -106,6 +108,7 @@ public static org.apache.maven.artifact.Artifact toArtifact(Artifact artifact) { return result; } + @Deprecated public static void toArtifacts( Collection artifacts, Collection nodes, @@ -127,6 +130,39 @@ public static void toArtifacts( } } + public static void toArtifactChildrenOnly( + Collection artifacts, + DependencyResolutionResult result, + List trail) { + HashMap map = new HashMap<>(); + convertWithTrail(map, result.getDependencyGraph().getChildren(), trail); + + for (Dependency dependency : result.getResolvedDependencies()) { + org.apache.maven.artifact.Artifact artifact = map.get(dependency.toString()); + if (artifact != null) { + artifacts.add(artifact); + } + } + } + + private static void convertWithTrail( + Map map, + Collection nodes, + List trail) { + for (DependencyNode node : nodes) { + org.apache.maven.artifact.Artifact artifact = toArtifact(node.getDependency()); + + List nodeTrail = new ArrayList<>(trail.size() + 1); + nodeTrail.addAll(trail); + nodeTrail.add(artifact.getId()); + + artifact.setDependencyTrail(nodeTrail); + map.put(node.getDependency().toString(), artifact); + + convertWithTrail(map, node.getChildren(), nodeTrail); + } + } + public static Artifact toArtifact(org.apache.maven.artifact.Artifact artifact) { if (artifact == null) { return null; diff --git a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleDependencyResolver.java b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleDependencyResolver.java index 9e0dde112725..b1b757214688 100644 --- a/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleDependencyResolver.java +++ b/maven-core/src/main/java/org/apache/maven/lifecycle/internal/LifecycleDependencyResolver.java @@ -249,11 +249,11 @@ private Set getDependencies( Set artifacts = new LinkedHashSet<>(); if (result.getDependencyGraph() != null && !result.getDependencyGraph().getChildren().isEmpty()) { - RepositoryUtils.toArtifacts( + + RepositoryUtils.toArtifactChildrenOnly( artifacts, - result.getDependencyGraph().getChildren(), - Collections.singletonList(project.getArtifact().getId()), - collectionFilter); + result, + Collections.singletonList(project.getArtifact().getId())); } return artifacts; } diff --git a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java index e33197aa964e..4a4881954695 100644 --- a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java +++ b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java @@ -30,7 +30,6 @@ import java.util.Collection; import java.util.Collections; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Objects; @@ -103,10 +102,10 @@ import org.codehaus.plexus.util.xml.Xpp3Dom; import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.graph.DependencyFilter; -import org.eclipse.aether.graph.DependencyNode; import org.eclipse.aether.repository.RemoteRepository; +import org.eclipse.aether.resolution.ArtifactResult; +import org.eclipse.aether.resolution.DependencyResult; import org.eclipse.aether.util.filter.AndDependencyFilter; -import org.eclipse.aether.util.graph.visitor.PreorderNodeListGenerator; /** * Provides basic services to manage Maven plugins and their mojos. This component is kept general in its design such @@ -374,17 +373,14 @@ private void createPluginRealm( DependencyFilter dependencyFilter = project.getExtensionDependencyFilter(); dependencyFilter = AndDependencyFilter.newInstance(dependencyFilter, filter); - DependencyNode root = pluginDependenciesResolver.resolve( + DependencyResult root = pluginDependenciesResolver.resolve( plugin, RepositoryUtils.toArtifact(pluginArtifact), dependencyFilter, project.getRemotePluginRepositories(), repositorySession); - PreorderNodeListGenerator nlg = new PreorderNodeListGenerator(); - root.accept(nlg); - - pluginArtifacts = toMavenArtifacts(root, nlg); + pluginArtifacts = toMavenArtifacts(root); pluginRealm = classRealmManager.createPluginRealm( plugin, parent, null, foreignImports, toAetherArtifacts(pluginArtifacts)); @@ -422,15 +418,12 @@ private List toAetherArtifacts(final List< return new ArrayList<>(RepositoryUtils.toArtifacts(pluginArtifacts)); } - private List toMavenArtifacts(DependencyNode root, PreorderNodeListGenerator nlg) { - List artifacts = new ArrayList<>(nlg.getNodes().size()); - RepositoryUtils.toArtifacts(artifacts, Collections.singleton(root), Collections.emptyList(), null); - for (Iterator it = artifacts.iterator(); it.hasNext(); ) { - Artifact artifact = it.next(); - if (artifact.getFile() == null) { - it.remove(); - } - } + private List toMavenArtifacts(DependencyResult dependencyResult) { + List artifacts = + new ArrayList<>(dependencyResult.getArtifactResults().size()); + dependencyResult.getArtifactResults().stream() + .filter(ArtifactResult::isResolved) + .forEach(a -> artifacts.add(RepositoryUtils.toArtifact(a.getArtifact()))); return Collections.unmodifiableList(artifacts); } @@ -826,9 +819,7 @@ public ExtensionRealmCache.CacheRecord setupExtensionsRealm( private List resolveExtensionArtifacts( Plugin extensionPlugin, List repositories, RepositorySystemSession session) throws PluginResolutionException { - DependencyNode root = pluginDependenciesResolver.resolve(extensionPlugin, null, null, repositories, session); - PreorderNodeListGenerator nlg = new PreorderNodeListGenerator(); - root.accept(nlg); - return toMavenArtifacts(root, nlg); + DependencyResult root = pluginDependenciesResolver.resolve(extensionPlugin, null, null, repositories, session); + return toMavenArtifacts(root); } } diff --git a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java index 27b3e81ea1e2..973986583727 100644 --- a/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java +++ b/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java @@ -52,6 +52,7 @@ import org.eclipse.aether.resolution.ArtifactResolutionException; import org.eclipse.aether.resolution.DependencyRequest; import org.eclipse.aether.resolution.DependencyResolutionException; +import org.eclipse.aether.resolution.DependencyResult; import org.eclipse.aether.util.artifact.JavaScopes; import org.eclipse.aether.util.filter.AndDependencyFilter; import org.eclipse.aether.util.filter.ScopeDependencyFilter; @@ -146,7 +147,7 @@ public Artifact resolve(Plugin plugin, List repositories, Repo /** * @since 3.3.0 */ - public DependencyNode resolveCoreExtension( + public DependencyResult resolveCoreExtension( Plugin plugin, DependencyFilter dependencyFilter, List repositories, @@ -155,7 +156,7 @@ public DependencyNode resolveCoreExtension( return resolveInternal(plugin, null /* pluginArtifact */, dependencyFilter, repositories, session); } - public DependencyNode resolve( + public DependencyResult resolve( Plugin plugin, Artifact pluginArtifact, DependencyFilter dependencyFilter, @@ -165,7 +166,7 @@ public DependencyNode resolve( return resolveInternal(plugin, pluginArtifact, dependencyFilter, repositories, session); } - private DependencyNode resolveInternal( + private DependencyResult resolveInternal( Plugin plugin, Artifact pluginArtifact, DependencyFilter dependencyFilter, @@ -216,14 +217,12 @@ private DependencyNode resolveInternal( } depRequest.setRoot(node); - repoSystem.resolveDependencies(session, depRequest); + return repoSystem.resolveDependencies(session, depRequest); } catch (DependencyCollectionException e) { throw new PluginResolutionException(plugin, e); } catch (DependencyResolutionException e) { throw new PluginResolutionException(plugin, e.getCause()); } - - return node; } // Keep this class in sync with org.apache.maven.project.DefaultProjectDependenciesResolver.GraphLogger diff --git a/maven-core/src/main/java/org/apache/maven/plugin/internal/PluginDependenciesResolver.java b/maven-core/src/main/java/org/apache/maven/plugin/internal/PluginDependenciesResolver.java index 0f865df277d8..9ef2e95070d5 100644 --- a/maven-core/src/main/java/org/apache/maven/plugin/internal/PluginDependenciesResolver.java +++ b/maven-core/src/main/java/org/apache/maven/plugin/internal/PluginDependenciesResolver.java @@ -25,8 +25,8 @@ import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.graph.DependencyFilter; -import org.eclipse.aether.graph.DependencyNode; import org.eclipse.aether.repository.RemoteRepository; +import org.eclipse.aether.resolution.DependencyResult; /** * Assists in resolving the dependencies of a plugin. Warning: This is an internal utility interface @@ -62,7 +62,7 @@ Artifact resolve(Plugin plugin, List repositories, RepositoryS * @return The dependency tree denoting the resolved plugin class path, never {@code null}. * @throws PluginResolutionException If any dependency could not be resolved. */ - DependencyNode resolve( + DependencyResult resolve( Plugin plugin, Artifact pluginArtifact, DependencyFilter dependencyFilter, diff --git a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java index 9fa8f3c22baa..1726fac94708 100644 --- a/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java +++ b/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java @@ -228,11 +228,10 @@ private DependencyResolutionResult resolveDependencies(MavenProject project, Rep Set artifacts = new LinkedHashSet<>(); if (resolutionResult.getDependencyGraph() != null) { - RepositoryUtils.toArtifacts( + RepositoryUtils.toArtifactChildrenOnly( artifacts, - resolutionResult.getDependencyGraph().getChildren(), - Collections.singletonList(project.getArtifact().getId()), - null); + resolutionResult, + Collections.singletonList(project.getArtifact().getId())); // Maven 2.x quirk: an artifact always points at the local repo, regardless whether resolved or not LocalRepositoryManager lrm = session.getLocalRepositoryManager(); diff --git a/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java b/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java index c63558ea13a9..24ec1d4da4c6 100644 --- a/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java +++ b/maven-embedder/src/main/java/org/apache/maven/cli/internal/BootstrapCoreExtensionManager.java @@ -26,6 +26,7 @@ import java.util.Collections; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; import org.apache.maven.RepositoryUtils; import org.apache.maven.cli.internal.extension.model.CoreExtension; @@ -48,10 +49,10 @@ import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.artifact.Artifact; import org.eclipse.aether.graph.DependencyFilter; -import org.eclipse.aether.graph.DependencyNode; import org.eclipse.aether.repository.RemoteRepository; +import org.eclipse.aether.resolution.ArtifactResult; +import org.eclipse.aether.resolution.DependencyResult; import org.eclipse.aether.util.filter.ExclusionsDependencyFilter; -import org.eclipse.aether.util.graph.visitor.PreorderNodeListGenerator; /** * BootstrapCoreExtensionManager @@ -171,13 +172,12 @@ private List resolveExtension( plugin.setArtifactId(interpolator.interpolate(extension.getArtifactId())); plugin.setVersion(interpolator.interpolate(extension.getVersion())); - DependencyNode root = pluginDependenciesResolver.resolveCoreExtension( + DependencyResult root = pluginDependenciesResolver.resolveCoreExtension( plugin, dependencyFilter, repositories, repoSession); - PreorderNodeListGenerator nlg = new PreorderNodeListGenerator(); - root.accept(nlg); - List artifacts = nlg.getArtifacts(false); - - return artifacts; + return root.getArtifactResults().stream() + .filter(ArtifactResult::isResolved) + .map(ArtifactResult::getArtifact) + .collect(Collectors.toList()); } catch (PluginResolutionException e) { throw new ExtensionResolutionException(extension, e.getCause()); } catch (InterpolationException e) { diff --git a/pom.xml b/pom.xml index 8f7233af5095..4135c816300d 100644 --- a/pom.xml +++ b/pom.xml @@ -147,7 +147,7 @@ under the License. 2.0 2.0 1.3 - 1.9.14 + 1.9.15-SNAPSHOT 1.7.36 2.9.1 2.0.9