使用 Maven Resolver Provider 以编程方式获取有效的 POM
Programatically getting an effective POM using Maven Resolver Provider
我想做什么?
- 给定本地文件系统上的 POM 文件。
我想以编程方式获取该 POM 文件的有效 POM。具体来说,我想做以下事情:
- 解决 POM 依赖关系
- 确保处理所有父 POM
- 获取完全解析的POM的依赖列表
- 等等...
我不需要获取传递依赖。
什么有效?
我正在使用 Maven Resolver Provider 哪种类型的作品。然而
我必须使用私有包 class org.apache.maven.repository.internal.DefaultModelResolver
这里是一个 GitHub link 示例 Maven 项目,您可以 运行: https://github.com/sahilm/maven-resolver-test
示例程序执行以下操作:
- 从 Maven Central 下载最新的 spring 引导 POM。
- 打印出它的直接依赖关系(包括父 deps)
您可以 运行 使用以下程序:
mvn exec:java -Dexec.mainClass="com.sahilm.maven_resolver_test.Test"
我需要什么帮助?
- 我需要帮助来理解为什么我必须使用私有包 class 才能让东西正常工作。
- 是否有其他方式获取我需要的信息?
您可以(在您的项目中)在包下创建一个 public class:org.apache.maven.repository.internal
以扩展包可访问性 class。只需使用一个 class 供应商以后不可能使用的名称。
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);
也许你可以使用 ProjectModelResolver
。这是一个代码片段,
DefaultRepositorySystem repositorySystem =
new DefaultRepositorySystem();
repositorySystem.initService(locator);
ModelResolver modelResolver =
new ProjectModelResolver(session, requestTrace,
repositorySystem, remoteRepositoryManager, repos,
ProjectBuildingRequest.RepositoryMerging.POM_DOMINANT,
null);
我已经包含了一个工作代码 here。
我想做什么?
- 给定本地文件系统上的 POM 文件。
我想以编程方式获取该 POM 文件的有效 POM。具体来说,我想做以下事情:
- 解决 POM 依赖关系
- 确保处理所有父 POM
- 获取完全解析的POM的依赖列表
- 等等...
我不需要获取传递依赖。
什么有效?
我正在使用 Maven Resolver Provider 哪种类型的作品。然而
我必须使用私有包 class org.apache.maven.repository.internal.DefaultModelResolver
这里是一个 GitHub link 示例 Maven 项目,您可以 运行: https://github.com/sahilm/maven-resolver-test
示例程序执行以下操作:
- 从 Maven Central 下载最新的 spring 引导 POM。
- 打印出它的直接依赖关系(包括父 deps)
您可以 运行 使用以下程序:
mvn exec:java -Dexec.mainClass="com.sahilm.maven_resolver_test.Test"
我需要什么帮助?
- 我需要帮助来理解为什么我必须使用私有包 class 才能让东西正常工作。
- 是否有其他方式获取我需要的信息?
您可以(在您的项目中)在包下创建一个 public class:org.apache.maven.repository.internal
以扩展包可访问性 class。只需使用一个 class 供应商以后不可能使用的名称。
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);
也许你可以使用 ProjectModelResolver
。这是一个代码片段,
DefaultRepositorySystem repositorySystem =
new DefaultRepositorySystem();
repositorySystem.initService(locator);
ModelResolver modelResolver =
new ProjectModelResolver(session, requestTrace,
repositorySystem, remoteRepositoryManager, repos,
ProjectBuildingRequest.RepositoryMerging.POM_DOMINANT,
null);
我已经包含了一个工作代码 here。