【问题标题】:Programatically getting an effective POM using Maven Resolver Provider使用 Maven Resolver Provider 以编程方式获取有效的 POM
【发布时间】:2019-08-26 21:53:32
【问题描述】:

我想做什么?

  • 给定本地文件系统上的 POM 文件。
  • 我想以编程方式获取该 POM 文件的有效 POM。具体来说,我想做以下事情:

    • 解决 POM 依赖项
    • 确保处理所有父 POM
    • 获取完全解析的 POM 的依赖项列表
    • 等等……
  • 我不需要获取传递依赖。

什么有效?

我正在使用Maven Resolver Provider 哪种有效。然而 我必须使用包私有类org.apache.maven.repository.internal.DefaultModelResolver

这里是一个指向您可以运行的示例 Maven 项目的 GitHub 链接:https://github.com/sahilm/maven-resolver-test

示例程序执行以下操作:

  • 从 Maven Central 下载最新的 Spring Boot POM。
  • 打印出它的直接依赖关系(包括父部门)

您可以通过以下方式运行该程序: mvn exec:java -Dexec.mainClass="com.sahilm.maven_resolver_test.Test"

我需要什么帮助?

  • 我需要帮助来理解为什么我必须使用包私有类来让东西正常工作。
  • 还有其他方法可以获取我需要的信息吗?

【问题讨论】:

  • 我不知道你的问题是什么,上面看起来更像是一系列陈述。
  • 你的意思是DefaultModelResolver是包吗?因为ModelResolver 接口是公开的?
  • @Ardesco 我同意。我正在改写这个问题。

标签: java maven aether


【解决方案1】:

您可以(在您的项目中)在包下创建一个公共类:org.apache.maven.repository.internal,它扩展了包可访问性类。只需使用供应商无法在未来使用的类名即可。

package org.apache.maven.repository.internal;
public class VisibleDefaultModelResolver extends DefaultModelResolver{

    public VisibleDefaultModelResolver(RepositorySystemSession session, RequestTrace trace, String context, ArtifactResolver resolver, VersionRangeResolver versionRangeResolver, RemoteRepositoryManager remoteRepositoryManager, List<RemoteRepository> repositories) {
        super(session, trace, context, resolver, versionRangeResolver, remoteRepositoryManager, repositories);
    }

}

那么你的代码就变成了:

ModelResolver modelResolver = new VisibleDefaultModelResolver(session, requestTrace, "context", artifactResolver, versionRangeResolver, remoteRepositoryManager, repos);

【讨论】:

  • 这很有趣。从来不知道你能做到这一点!我仍然有一种挥之不去的感觉,即我缺少一个公共 API,并且我必须将 maven 解析器提供程序与其他东西结合起来。不过这很有帮助,如果我找不到公共 API,我会接受你的回答。
【解决方案2】:

也许你可以使用ProjectModelResolver。这是一个代码sn-p,

    DefaultRepositorySystem repositorySystem =
            new DefaultRepositorySystem();
    repositorySystem.initService(locator);

    ModelResolver modelResolver =
            new ProjectModelResolver(session, requestTrace,
                    repositorySystem, remoteRepositoryManager, repos,
                    ProjectBuildingRequest.RepositoryMerging.POM_DOMINANT,
                    null);

我已经包含了一个工作代码here

【讨论】:

  • 太棒了。这行得通。我跳过了看这个,因为我不确定如何获得ReactorModelPool。原来我不需要。谢谢!
猜你喜欢
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 2012-05-19
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
相关资源
最近更新 更多