2010-04-14 56 views
0

我目前正在写某种Maven的POM预处理器,对于从多个输入文件的项目组装一个POM(基本模板和模块特定的文件) 。这些文件按层次排序(模板=最常用,模块特定=最不常用)。现在的问题是将这些文件合并成一个POM文件。与配置规则(背景:Maven的POM中,爪哇)合并XML文件

长话短说,或者如果你不熟悉使用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>元素s大厅被另一个替换)。

文件A:

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

设定

与期望的输出的定义

更详细的例子科尔ection类型元素是已知的,应该是可配置的(最好通过一组XPath表达式)。

基于Java的解决方案受到赞赏。

什么看起来最有前途的,到目前为止是工具提到here但合并时,这不是我所需要的MERGE动作产生类似

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

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

回答

0

但是,并不是所有的父母POM的目的?为大多数使用过的元素提供默认值?

+0

我没有运行正常的Maven构建。相反,我正在运行一个预处理器,它只是构建POM(即它也构建了父POM,所以没有任何东西可以继承)。 这个背后的目的是预处理器是一个插件的一部分,该插件从各种模块中动态地组装项目,这些模块遍布在颠覆回购中。 – 2010-04-14 12:50:02

0

我认为这个目标有所帮助:effective-pom [1]像你想要的那样非常有效地工作。 即使没有,你可以看看他们如何做到这一点。

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

+0

如果我将运行一个普通的Maven构建,那么你会是对的。请参阅我给Riduidel关于这个问题目的的回答的评论。无论如何,我会查看帮助插件的来源。谢谢你的提示。 – 2010-04-14 12:52:11

+0

我刚看了帮助代码:effective-pom。他们可以与org.apache.maven.model.Model类交谈,因为帮助目标只能在现有项目上执行。这不是我的目的,因为我只有一堆java.io.File对象将被合并。这也是为什么我的问题更倾向于针对某些节点的可自定义行为的一般XML合并方法。 – 2010-04-14 13:21:15

0

我没有Java的解决方案,但如果你有兴趣在Windows工具,Project: Merge会那样做就好了。你必须告诉它它应该选择哪个值(因为它不会第二次猜测双向合并),但它会做到这一点。

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

+0

谢谢你的回答,詹姆斯。该工具看起来不错,但不幸的是,仅Windows的工具对我的目的没有用处。自从发布这个问题以来,我在Java中一起入侵了自己的东西,但我怀疑它是100%可靠的。 ;-) – 2010-08-28 06:58:58

+0

啊,这很公平。我不相信一个Windows工具对你有任何用处,但我想我会提到它的机会。你认为这个工具的Java版本值得我关注吗? – 2010-08-30 07:38:21