有没有用于读取maven2/3 pom xml文件的库?

37

我想在Java代码中读取pom.xml文件。我想知道是否有相应的库,以便我可以为不同的部分(例如依赖项、插件等)获取迭代器。我希望避免手工构建解析器。

3个回答

40
你可以尝试使用 MavenXpp3Reader,它是 maven-model 的一部分。示例代码:
MavenXpp3Reader reader = new MavenXpp3Reader();
Model model = reader.read(new FileReader(mypom));

该网址已经失效,无法访问。 - Gilad Baruchian
它的运行非常顺畅,Maven依赖如下: <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-model</artifactId> <version>3.0.2</version> </dependency> - Pierluigi Vernetto

37

首先,我假设您当前不在Maven插件内运行,因为有更简单的方法可以使用可用API实现。

之前发布的MavenXpp3Reader解决方案将允许您轻松读取POM文件,但是它没有考虑到父级继承和表达式插值。

为此,您需要使用ModelBuilder类。

这个使用起来非常简单,例如从Archiva中的代码片段如下:

ModelBuildingRequest req = new DefaultModelBuildingRequest();
req.setProcessPlugins( false );
req.setPomFile( file );
req.setModelResolver( new RepositoryModelResolver( basedir, pathTranslator ) );
req.setValidationLevel( ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL );

Model model;
try
{
    model = builder.build( req ).getEffectiveModel();
}
catch ( ModelBuildingException e )
{
     ...
}

要运行它,您需要执行两个操作:

  1. 实例化并连接一个包括其私有字段的ModelBuilder实例
  2. 使用Maven的解析器之一来查找父POM,或编写自己的解析器(如上面的代码片段所示)

如何最好地完成这两个步骤取决于您已经使用的DI框架,或者您是否只想嵌入Maven的默认容器。


1
这些库是兼容的,因此我建议无论如何都使用Maven 3库进行嵌入。如果您真的需要使用Maven 2库,可以在此处找到示例:https://github.com/brettporter/centrepoint/blob/master/centrepoint/modules/maven-importer/src/main/java/com/effectivemaven/centrepoint/maven/repository/CentralRepositoryService.java - Brett Porter
1
@BrettPorter 我没有在 Maven 插件中运行,但我在 RepositoryModelResolver 上遇到了问题。我该如何在 Maven 插件之外使其工作? - Robert Reiz
@BrettPorter 现在我正在运行一个 Maven 插件,但仍然遇到问题。在 maven-core 3.0.5 中不存在 RepositoryModelResolver。而且我在设置 ModelResolver 时也遇到了问题。每次都会收到“无法从包外访问”的错误消息。有任何想法吗? - Robert Reiz
@BrettPorter 如果我正在运行一个Maven插件,为什么需要手动设置ModelResolver?难道不应该可以从系统中获取吗? - Robert Reiz
和Robert一样遇到了同样的问题:我找不到一个解析器来传递给setModelResolver()。我正在Mojo中运行,所以我有RepositorySystem和RepositorySystemSession。我的Mojo使用Aether很好地解决了依赖关系POM文件。现在我想解析这些POM文件。我似乎缺少的就是解析器。 - Max Spring
显示剩余4条评论

2
这取决于你想要实现什么。如果你只想将其视为带有嵌入式XML文件的XML,可以采用已经提供的建议。
如果你想在你的应用程序中实现某种形式的Maven功能,你可以尝试新的aether库。虽然我没有使用过它,但它看起来足够简单,可以轻松集成,并且应该在你的部分努力下提供Maven功能。
顺便说一句,这个库是一个Maven 3库,不是Maven 2(如你的标签中所指定的)。不知道这对你是否有很大的区别。

2
哇,僵尸话题。无论如何,正如我所说,这取决于你想做什么。如果只是在外部解析配置文件到Maven中,我会使用普通的XML解析器。如果你正在编写一个插件,我想你可以,但可能有更新的库可用(我已经离开Maven开发一段时间了)。你可以查看一些插件文档-http://maven.apache.org/plugin-developers/PS. 我注意到aether的链接不再有效,新链接是-http://www.eclipse.org/aether/ - GKelly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接