使用Maven Resolver Provider以编程方式获取有效的POM

时间:2019-04-05 03:34:38

标签: java maven aether

我想做什么?

  • 给出本地文件系统上的POM文件。
  • 我想以编程方式获取该POM文件的有效POM。具体来说,我想执行以下操作:

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

什么有效?

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

以下是GitHub链接,您可以运行一个示例Maven项目:https://github.com/sahilm/maven-resolver-test

示例程序执行以下操作:

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

您可以使用以下命令运行程序: mvn exec:java -Dexec.mainClass="com.sahilm.maven_resolver_test.Test"

我需要什么帮助?

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

2 个答案:

答案 0 :(得分:4)

您可以(在您的项目中)在包下创建公共类: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);

答案 1 :(得分:1)

也许您可以使用ProjectModelResolver。这是一个代码段,

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

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

我已包含工作代码here