2010-04-14 63 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