当前位置: 首页 > 面试题库 >

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

卫昊东
2023-03-14
问题内容

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

这基本上是对我如何以编程方式构建有效的pom文件模型的重新描述?

我正在构建一个对一组模块执行一些验证规则的Maven插件。这些模块的pom文件可用,但执行插件时它们不属于反应堆。

我可以使用此方法读取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文件相同的信息。

如何改进该方法,以便可以获得“完全解析”的Model对象?通过完全解决,我的意思是:具有所有传递依赖项以及父poms的所有其他项。

干杯!


问题答案:

我做的 :-)

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

/**
 * 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



 类似资料:
  • 问题内容: 如何获得pom文件的完全解析模型? 这基本上是对我如何以编程方式构建有效的pom文件模型的重新描述? 我正在构建一个对一组模块执行一些验证规则的Maven插件。这些模块的pom文件可用,但执行插件时它们不属于反应堆。 我可以使用此方法读取pom文件并获取相应的Model对象(为简单起见,删除了异常处理): 它可以工作,但是Model对象仅具有与pom文件相同的信息。 如何改进该方法,以

  • 本文向大家介绍Android Scroller完全解析,包括了Android Scroller完全解析的使用技巧和注意事项,需要的朋友参考一下 在Android中,任何一个控件都是可以滚动的,因为在View类当中有scrollTo()和scrollBy()这两个方法,如下图所示: 这两个方法的主要作用是将View/ViewGroup移至指定的坐标中,并且将偏移量保存起来。另外: mScrollX

  • JSON 格式 使用  JSON schema 模式来记录和验证格式,你也可以在 https://getcomposer.org/schema.json 中来参照。 根项目 根项目是由当前项目目录下的 composer.json 定义的项目,composer.json 中定义了您当前项目的依赖项。 某些字段仅在根项目中的上下文中应用,举个例子, config 字段,只有根项目才能定义和配置,依赖项

  • 问题内容: 到目前为止,我的目标是在Rust中解析此JSON数据: 并且是 我下一步应该解析什么?我的主要目标是获取这样的JSON数据,并从其中解析密钥(例如Age)。 问题答案: Serde是首选的JSON序列化提供程序。您可以通过多种方式从文件中读取JSON文本。将其作为字符串使用后,请使用: Cargo.toml: 您甚至可以使用类似的方法直接从已打开的读取。 Serde可以用于JSON以外

  • 问题内容: 是否可以仅从pom.xml文件获取POM 的实例或其他对象形式? 提前致谢。 问题答案: 是的你可以 。这是代码。您需要maven-model-3.0.4.jar和plexus-utils-2.0.6.jar和maven- core-3.0.4.jar

  • 我有一个txt文件,里面有数据,我需要解析这些数据: 我想把它解析成一个模型: 我尝试使用下一段代码将txt文件转换成我需要的数据: 但我得到的下一个数据是重复的: 我做错了什么?我怎样才能得到我想要的?