【问题标题】:Java Code to get Maven Dependency Graph获取 Maven 依赖关系图的 Java 代码
【发布时间】:2015-06-17 15:18:11
【问题描述】:

我正在开发的程序的一个要求是,我需要能够查看存储库中多个工件的 Maven 依赖关系,以便为它们创建依赖关系图。虽然很明显 Maven 和 Eclipse Aether 可以做到这一点(因为 Maven 的很大一部分正在获得依赖项),但我很难弄清楚如何在 Java 程序中做到这一点。

有什么建议吗?

【问题讨论】:

  • 目前的“蛮力”方法是自己打开 pom 并在 xml 文件中查找依赖项,但由于 Maven 已经可以为我做到这一点,似乎是在浪费时间.只是想不通如何让 Maven 在 java 代码中做到这一点。

标签: java eclipse maven dependencies aether


【解决方案1】:

根据documentation 的说法,Aether 似乎可以提供帮助。甚至还有an example that demonstrates how to use Aether to collect the transitive dependencies of an artifact。结合Maven API example here,我认为你可以到达你想要的地方。

【讨论】:

【解决方案2】:

有几种方法可以实现这一点,或者使用 Eclipse 之类的 IDE...或者您可以使用 maven-dependency-plugin 直接打印到控制台...

mvn dependency:tree

【讨论】:

  • 问题是我需要我的程序来获取几个不同的依赖项并处理返回的内容。我可以使用 java Runtime 的东西尝试控制台命令,但是我会在输出中搜索我想要的东西。不好玩。
【解决方案3】:

在查看了各种不同的示例和代码后,我拼凑起来,这似乎可行:

public List<Artifact> fetchArtifactDependencies(final RepositorySystemSession session,
                                                final Artifact artifact,
                                                final DependencyFilter dependencyFilter)
        throws RepositoryException {

    final CollectRequest collectRequest = new CollectRequest();
    collectRequest.setRoot(new Dependency(artifact, "compile"));
    collectRequest.addRepository([repository]);

    final DependencyNode node = repositorySystem.collectDependencies(session, collectRequest)
                                                .getRoot();

    final DependencyRequest dependencyRequest = new DependencyRequest();
    dependencyRequest.setRoot(node);
    dependencyRequest.setFilter(dependencyFilter);

    final DependencyResult dependencyResult = repositorySystem.resolveDependencies(session,
                                                                                   dependencyRequest);

    final List<ArtifactResult> artifactResults = dependencyResult.getArtifactResults();

    final List<Artifact> results = new ArrayList<>(artifactResults.size());

    CollectionUtils.collect(artifactResults, new Transformer<ArtifactResult, Artifact>() {
        @Override
        public Artifact transform(final ArtifactResult input) {
            return input.getArtifact();
        }
    }, results);

    return results;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-31
    • 2020-08-02
    • 2011-03-22
    • 2023-04-07
    • 2012-07-04
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多