如何获取 Gradle 项目的运行时依赖项以及坐标和 JAR 文件?

How can I get a the runtime dependencies along with the coordinates and the JAR file of a Gradle project?

我正在编写一个自定义 Gradle 任务,它需要迭代所有运行时依赖项(包括所有可传递的依赖项)。我需要每个依赖项的组、名称和版本以及 JAR 的路径。

Gradle API 似乎有一个 ResolvedDependecy 但我不知道如何获得它们。 https://docs.gradle.org/current/javadoc/org/gradle/api/artifacts/ResolvedDependency.html

似乎还有一些与工件、模块和依赖项相关的棘手术语 https://docs.gradle.org/current/userguide/dependency_management_terminology.html 这让我很迷茫如何遍历它?我的假设是我需要使用 getProject().getConfigurations().getByName("rutime").

获取运行时配置

我编写了这段代码,它产生了一些结果,但我不确定这是否正确。这似乎是完成工作。

import java.util.Collection;
import java.util.function.Function;
import java.util.stream.Stream;

import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.ResolvedDependency;

public class Dependencies {

    private static <T> Stream<T> of(T node, Function<T, Collection<T>> childrenFn) {
        return Stream.concat(Stream.of(node), childrenFn.apply(node).stream()
                .flatMap(n -> of(n, childrenFn)));
    }

    private static Stream<ResolvedDependency> of(ResolvedDependency node) {
        return of(node, ResolvedDependency::getChildren);
    }

    @SuppressWarnings("CodeBlock2Expr")
    public static void doIt(Configuration configuration) {
        configuration.getResolvedConfiguration()
                .getFirstLevelModuleDependencies()
                .stream()
                .flatMap(Dependencies::of)
                .flatMap(dependency -> {
                    return dependency.getModuleArtifacts().stream();
                })
                .distinct()
                .forEach(artifact -> {
                    System.out.println(artifact.getFile());
                });
    }
}