2011-06-28 38 views
3

我有一個maven項目 - 它是jenkins的插件。它的父母應該是:Maven:根據配置文件選擇父項目

<parent> 
    <groupId>org.jenkins-ci.plugins</groupId> 
    <artifactId>plugin</artifactId> 
    <version>1.414</version> 
</parent> 

但同時這個插件也可以用於哈德森,而不會改變任何代碼行。但對於它的父項目應該是:

<parent> 
    <groupId>org.jvnet.hudson.plugins</groupId> 
    <artifactId>hudson-plugin-parent</artifactId> 
    <version>2.0.1</version> 
</parent> 

我可以指定2個不同的配置文件爲,並使用它們來構建插件相應詹金斯或哈德森?所以,我呼籲類似的東西:

mvn package -P jenkins 

mvn package -P hudson 

我試圖在配置文件中指定的屬性,但這些不是由<parent>標籤內的值替換。那麼是否還有其他可能性爲兩者構建插件,但是儘可能使用通用代碼和文件?

添加:所以,如果我不能這樣做,那麼我該怎麼做呢?如何重構?新結構應該是什麼?

回答

0

目前我們決定堅持使用1個存儲庫和2個獨立的pom.xml文件,從而爲使用pom.xml構建項目提供了maven密鑰。

mvn package -f pom-jenkins.xml 
mvn package -f pom-hudson.xml 
0

不,你不能那樣做。你將不得不重構以避免必要性。

0

如前所述已不可能。我會建議爲jenkins插件和哈德森插件製作單獨的項目。我認爲在不遠的將來,這不會再起作用,因爲Hudons和Jenkins會分歧。

2

如前所述,這是不可能的。 此外,不可能爲父級的版本設置屬性,因爲插值會比處理配置文件早得多。

我會建議你創建一個masterbuild項目如下:

master 
|-plugin-jenkins 
|-plugin-hudson 
|-plugin-assembly 

主應該建立三個如常。但是,在彙編中,您可以將兩個插件中的每一個作爲依賴關係添加到單獨的配置文件中。而且......這些插件中的每一個都可以有你喜歡的父母。

這顯然有點偏離Maven約定,但我相信這是解決您的問題的方法。

+0

謝謝,我會試試看。但是這樣我必須得到我的代碼的兩個副本:在plugin-jenkins和plugin-hudson中。它能以某種方式做到這一點,我建立基於詹金斯代碼哈德森或反之亦然? –

+0

那麼,我真的會建議你有兩個單獨的項目來包裝這個(至少)。正如Karl-Heinz在下面指出的那樣,Hudson和Jenkins已經分道揚it,很可能現在(仍然)工作的東西在不久的將來將無法工作。 您可以將大部分代碼保留在覈心模塊中,然後在包裝模塊(取決於核心)中使用Hudson或Jenkins特定的東西。 沿着這些線應該解決你的問題。 – carlspring

0

在一般情況下,你應該能夠設置{組,神器}通過Java系統屬性或環境變量父POM的標識和版本,但它似乎有在Maven的一個錯誤,這將只固定4.x版: https://issues.apache.org/jira/browse/MNG-624

另一種解決方案是父POM列入委託給你在relativePath元素引用自己父母的POM,並改變目標如內容通過一個符號鏈接或cp命令。

所以在主POM你可以這樣寫:

<parent> 
    <groupId>org.mycompany.project</groupId> 
    <artifactId>foo-artifact</artifactId> 
    <version>1.0.0</version> 
    <relativePath>./my-parent.pom</relativePath> 
</parent> 

在我的父母 - 詹金斯你只想把:

<groupId>org.mycompany.project</groupId> 
<artifactId>foo-artifact</artifactId> 
<version>1.0.0</version> 

<parent> 
    <groupId>org.jenkins-ci.plugins</groupId> 
    <artifactId>plugin</artifactId> 
    <version>1.414</version> 
</parent> 

同樣的項目信息與塊你把哈德森在my-parent-hudson.pom中。

不,你既可以使用

ln -s my-parent-jenkins.pom my-parent.pom 

ln -s my-parent-hudson.pom my-parent.pom 

包括各自的父POM,而不需要維持兩個不同的主POM文件爲您的項目。

如果POM在relativePath中引用的位置不存在,Maven將在遠程倉庫[1]中查找POM,這也是在本地覆蓋父POM的簡單方法。

[1] http://maven.apache.org/components/ref/3.3.9/maven-model/maven.html#class_parent