0

我目前正在编写某种 Maven POM 预处理器,它为来自多个输入文件(基本上是模板和模块特定文件)的项目组装 POM。文件按层次排序(模板 = 最通用,特定模块 = 最不通用)。现在的问题是将这些文件合并到一个 POM 文件中。

长话短说,或者如果您不熟悉 Maven:POM 看起来像这样(缩短):

<project>
  <modelVersion>4.0.0</modelVersion>
  <dependencies>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-core</artifactId>
    </dependency>
  </dependencies>
</project>

基本上,合并应将更一般文件的所有值替换<modelVersion>为更具体文件的值(即单例,例如上述),但在某些元素中,合并应将更确定的元素添加到父级(即集合,例如<dependency>元素应始终添加到<dependencies>元素中,并且任何<dependency>元素不得被另一个元素替换)。

一个更详细的示例,其中包含所需输出的定义:

档案一:

<project>
  <modelVersion>A</modelVersion>
  <dependencies>
    <dependency>
      <groupId>groupIdA</groupId>
      <artifactId>artifactIdA</artifactId>
    </dependency>
  </dependencies>
</project>

文件 B:

<project>
  <modelVersion>B</modelVersion>
  <dependencies>
    <dependency>
      <groupId>groupIdB</groupId>
      <artifactId>artifactIdB</artifactId>
    </dependency>
  </dependencies>
</project>

期望的输出:

<project>
  <modelVersion>B</modelVersion>
  <dependencies>
    <dependency>
      <groupId>groupIdA</groupId>
      <artifactId>artifactIdA</artifactId>
    </dependency>
    <dependency>
      <groupId>groupIdB</groupId>
      <artifactId>artifactIdB</artifactId>
    </dependency>
  </dependencies>
</project>

集合类型元素的集合是已知的并且应该是可配置的(最好通过一组 XPath 表达式)。

赞赏基于 Java 的解决方案。

到目前为止看起来最有希望的是这里提到的工具,但该MERGE操作会产生类似

<dependency>
  <groupId>groupIdAgroupIdB</groupId>
  <artifactId>artifactIdAartifactIdB</artifactId>
</dependency>

合并时,这不是我需要的。

有任何想法吗?谢谢你的帮助!

4

3 回答 3

0

但这不是父 POM 的全部目的吗?为大多数使用的元素提供默认值?

于 2010-04-14T12:44:27.127 回答
0

我认为目标 help:effective-pom [1] 完全符合您的要求。即使没有,您也可以查看他们如何做到这一点的来源。

[1] http://maven.apache.org/plugins/maven-help-plugin/effective-pom-mojo.html

于 2010-04-14T12:45:43.950 回答
0

我没有 Java 解决方案,但如果您对 Windows 工具感兴趣,Project: Merge就可以了。您必须告诉它应该选择哪些值(因为它不会对双向合并进行第二次猜测),但它会这样做。

您可以设置元素标识的格式规范,以便它知道使用 <groupId> 中的字符数据来标识 <dependency> 元素。一旦完成,它应该可以正常工作。

于 2010-08-27T11:03:39.153 回答