private Set resolveTransitive()

in src/main/java/org/apache/maven/plugins/assembly/artifact/DefaultDependencyResolver.java [212:282]


    private Set<Artifact> resolveTransitive(
            RepositorySystemSession repositorySession, String scope, MavenProject project)
            throws org.eclipse.aether.resolution.DependencyResolutionException {

        // scope dependency filter
        DependencyFilter scoopeDependencyFilter = DependencyFilterUtils.classpathFilter(scope);

        // get project dependencies filtered by requested scope
        List<Dependency> dependencies = project.getDependencies().stream()
                .map(d -> RepositoryUtils.toDependency(d, repositorySession.getArtifactTypeRegistry()))
                .filter(d -> scoopeDependencyFilter.accept(new DefaultDependencyNode(d), null))
                .collect(Collectors.toList());

        List<Dependency> managedDependencies = Optional.ofNullable(project.getDependencyManagement())
                .map(DependencyManagement::getDependencies)
                .map(list -> list.stream()
                        .map(d -> RepositoryUtils.toDependency(d, repositorySession.getArtifactTypeRegistry()))
                        .collect(Collectors.toList()))
                .orElse(null);

        CollectRequest collectRequest = new CollectRequest();
        collectRequest.setManagedDependencies(managedDependencies);
        collectRequest.setRepositories(project.getRemoteProjectRepositories());
        collectRequest.setDependencies(dependencies);
        collectRequest.setRootArtifact(RepositoryUtils.toArtifact(project.getArtifact()));

        DependencyRequest request = new DependencyRequest(collectRequest, scoopeDependencyFilter);

        DependencyResult dependencyResult = repositorySystem.resolveDependencies(repositorySession, request);

        // cache for artifact mapping
        Map<org.eclipse.aether.artifact.Artifact, Artifact> aetherToMavenArtifacts = new HashMap<>();
        Deque<String> stack = new ArrayDeque<>();
        stack.push(project.getArtifact().getId());

        Set<Artifact> artifacts = new HashSet<>();

        // we need rebuild artifact dependencyTrail - it is used by useTransitiveFiltering
        dependencyResult.getRoot().accept(new DependencyVisitor() {
            @Override
            public boolean visitEnter(DependencyNode node) {
                if (node.getDependency() != null) {
                    stack.push(aetherToMavenArtifacts
                            .computeIfAbsent(node.getDependency().getArtifact(), RepositoryUtils::toArtifact)
                            .getId());
                }
                return true;
            }

            @Override
            public boolean visitLeave(DependencyNode node) {
                Dependency dependency = node.getDependency();
                if (dependency != null) {
                    Artifact artifact = aetherToMavenArtifacts.computeIfAbsent(
                            dependency.getArtifact(), RepositoryUtils::toArtifact);
                    if (artifact.isResolved() && artifact.getFile() != null) {
                        List<String> depTrail = new ArrayList<>();
                        stack.descendingIterator().forEachRemaining(depTrail::add);
                        artifact.setDependencyTrail(depTrail);
                        artifact.setOptional(dependency.isOptional());
                        artifact.setScope(dependency.getScope());
                        artifacts.add(artifact);
                    }
                    stack.pop();
                }
                return true;
            }
        });

        return artifacts;
    }