8

我想做什么?

  • 给定本地文件系统上的 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"

我需要什么帮助?

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

2 回答 2

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);
于 2019-04-10T10:31:24.363 回答
2

也许你可以使用ProjectModelResolver. 这是一个代码片段,

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

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

我在这里包含了一个工作代码。

于 2019-04-10T17:17:50.033 回答