gpt4 book ai didi

java - 如何获取 pom 文件的完全解析模型?

转载 作者:行者123 更新时间:2023-12-02 01:34:15 26 4
gpt4 key购买 nike

如何获取 pom 文件的完全解析模型?

这基本上是 How can i programmaticaly build the effective model of a pom file? 的改写。

我正在构建一个 Maven 插件,它对一组模块执行一些验证规则。这些模块的 pom 文件可用,但在执行插件时它们不是 react 器的一部分。

我可以使用此方法读取 pom 文件并获取相应的 Model 对象(为了简单起见,删除了异常处理):

private Model pomToModel(String pathToPom) throws Exception {
BufferedReader in = new BufferedReader(new FileReader(pathToPom));
MavenXpp3Reader reader = new MavenXpp3Reader();
Model model = reader.read(in);
return model;
}

它可以工作,但 Model 对象仅具有与 pom 文件相同的信息。

如何改进该方法以获得“完全解析”的模型对象?通过完全解决,我的意思是:具有所有传递依赖项以及来自父 pom 的其他所有内容。

干杯!

最佳答案

我做到了:-)

help: effective-pom 和 dependency:tree 确实没有任何帮助。

我必须了解 maven 如何为注入(inject) mojo 的 MavenProject 构建模型。help:effect-pom 已经接收到解析后的 Model,而 dependency:tree 只构建了一个 DependencyGraph,但它不会将 pom 的整个模型加载到内存中。

通过使用下面的代码,我能够获取一个 Model 对象,其中包含来自父级的所有信息、已解析的 ${property} 表达式以及扩展的传递依赖项。

方法如下:

1) 获取 ModelResolver

您将需要一个接口(interface) org.apache.maven.model.resolution.ModelResolver 的实例。不幸的是,maven 无法通过依赖注入(inject)轻松提供一个(至少我找不到),所以我们必须构建一个。为了让事情变得更好,该接口(interface)仅有的两个实现是受包保护的,因此您需要使用一些反射魔法来实例化它。实现它的具体类是 DefaultModelResolverProjectModelResolver。我能够像这样构建一个 DefaultModelResolver

/**
* The Maven Project Object
*
* @parameter expression="${project}"
* @required2.0
* @readonly
*/
protected MavenProject project;

/**
* @component
*/
protected ArtifactResolver artifactResolver;

/**
* @component
*/
protected RemoteRepositoryManager remoteRepositoryManager;

private Object invoke( Object object, String method )
throws IllegalAccessException, InvocationTargetException, NoSuchMethodException {
return object.getClass().getMethod( method ).invoke( object );
}

private org.apache.maven.model.resolution.ModelResolver makeModelResolver() throws MojoExecutionException {
try {
ProjectBuildingRequest projectBuildingRequest =
(ProjectBuildingRequest) invoke( project, "getProjectBuildingRequest" );

Class c = Class.forName("org.apache.maven.repository.internal.DefaultModelResolver");
Constructor ct = c.getConstructor(new Class[]{RepositorySystemSession.class,
RequestTrace.class, String.class,
ArtifactResolver.class, RemoteRepositoryManager.class,
List.class});
ct.setAccessible(true);
return (org.apache.maven.model.resolution.ModelResolver) ct.newInstance(new Object[]{
projectBuildingRequest.getRepositorySession(),
null, null, artifactResolver, remoteRepositoryManager,
project.getRemoteProjectRepositories()});
} catch (Exception e) {
throw new MojoExecutionException("Error instantiating DefaultModelResolver", e);
}
}

2) 构建模型

当您拥有 modelResolver 时,您可以从 pom 文件构建模型,如下所示:

public Model resolveEffectiveModel(File pomfile) {
try {
return modelBuilder.build(makeModelBuildRequest(pomfile)).getEffectiveModel();
} catch (Exception e) {
throw new RuntimeException(e);
}
}

private ModelBuildingRequest makeModelBuildRequest(File artifactFile) {
DefaultModelBuildingRequest mbr = new DefaultModelBuildingRequest();
mbr.setPomFile(artifactFile);
mbr.setModelResolver(modelResolver); // <-- the hard-to-get modelResolver
return mbr;
}

看起来不漂亮,但它对我有用..:P

关于java - 如何获取 pom 文件的完全解析模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57531992/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com