gpt4 book ai didi

java - 我如何获得一个完全解析的 pom 文件模型?

转载 作者:搜寻专家 更新时间:2023-10-30 19:40:19 27 4
gpt4 key购买 nike

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

这基本上是对 How can i programmaticaly build the effective model of a pom file? 的重新措辞

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

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

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;
}

它可以工作,但是模型对象只包含与 pom 文件相同的信息。

如何改进该方法以便获得“完全解析”的模型对象?我所说的完全解析是指:具有所有传递依赖项以及来自父 poms 的所有其他内容。

干杯!

最佳答案

我做到了:-)

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

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

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

方法如下:

1) 获取模型解析器

您将需要一个接口(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/11525318/

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