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

如何获得pom文件的完全解析模型?,第1张

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

我做的 :-)

help:有效pom和依赖关系:tree根本 没有 帮助。

我必须看一下maven如何为注入到mojo中的MavenProject构建模型。help:effective-
pom已经收到了解析的模型,并且dependency:tree仅构建了一个DependencyGraph,但没有将整个pom模型加载到内存中。

通过使用下面的代码,我可以从父级获取所有Model的Model对象,并带有已解析的$ {property}表达式和扩展的传递依赖项。

这是如何做:

1)获取一个ModelResolver

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

protected MavenProject project;protected ArtifactResolver artifactResolver;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



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5489591.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存