2009-10-01 39 views
20

場景:的Maven - 激活基於子文件屬性

  1. 鑑於
    1. 父POM定義配置文件和一個孩子(如模塊)
    2. 兒童項目(s)表示將使用通過引用父POM的配置文件。
  2. 目的是跳過配置文件執行的父母在孩子執行它只是
  3. 檔案具有激活部分<activation><property><name>foo</name></property><activation>
  4. 由於父母沒有定義foo屬性 - 配置文件是無效的,並不會爲父母版本執行
  5. 現在,我在孩子中定義<properties><foo>true</foo></properties>,希望在執行子構建並激活配置文件時將獲取該屬性。沒有這樣的運氣。配置文件從未激活,這告訴我屬性從未設置。
  6. 只是要注意:mvn package -Dfoo=true兩個父母和孩子

上午我試圖做不可能的事或只是做錯了激活的個人資料?

P.S.嗯 - 即使我在父級定義屬性,配置文件也不會被觸發。是什麼賦予了?

回答

7

要擴展@ rich-seller的答案和@ Bostone的自我回答,似乎不可能有父母POM定義的設置一些配置文件作爲替代方案,並且子POM默認選擇這些配置文件中的一個,同時允許您臨時替代子選項(即在CLI上)。考慮該使用一些框架和相關的插件,包括其兩個版本,我們可以假設通過屬性定義項目父POM:

<profiles> 
    <profile> 
    <id>newest</id> 
    <activation> 
     <activeByDefault>true</activeByDefault> 
    </activation> 
    <properties> 
     <framework.version>2.0</framework.version> 
     <plugin.version>2.0</plugin.version> 
    </properties> 
    </profile> 
    <profile> 
    <id>older</id> 
    <activation> 
     <property> 
     <name>older.framework</name> 
     <value>true</value> 
     </property> 
    </activation> 
    <properties> 
     <framework.version>1.1</framework.version> 
     <plugin.version>1.1</plugin.version> 
    </properties> 
    </profile> 
</profiles> 

現在的孩子從默認這個父POM繼承會使用2.0,你會期望,-Polder-Dolder.framework=true將嘗試使用舊框架構建它(例如,測試兼容性)。然而,你不能在孩子POM

<properties> 
    <older.framework>true</older.framework> 
</properties> 

寫,有older配置文件被自動激活。如果newest默認情況下不是活動的,那麼您可以使用基於文件的激活來使該模塊與1.1版本構建,但是,對於2.0來說暫時運行它並不容易:據我所知,oldernewest配置文件在您通過-Pnewest,所以你需要明確禁用其他配置文件,如果你有十幾個是不合理的。所以除了簡介信息複製到子POM只是無解:

<properties> 
    <framework.version>1.1</framework.version> 
    <plugin.version>1.1</plugin.version> 
</properties> 

此時-Pnewest工作覆蓋這些屬性,所以你需要使用-Dframework.version=2.0 -Dplugin.version=2.0

換句話說,配置文件僅在所有子模塊默認使用相同配置文件(此處爲newest)時纔有用。如果它們中的一些通常用1.1構建而另一些用2.0構建,則配置文件是無用的。

看起來像這樣是Maven核心增強或者Maven 3構建擴展的用例。想到http://docs.codehaus.org/display/MAVEN/Custom+Profile+Activatorshttps://github.com/maoo/maven-tiles

+0

是的。我接受這個,因爲它建立在我的答案上,我通常不喜歡接受我自己的 – Bostone 2012-08-31 17:04:18

+0

非常有用的信息。並感謝關於基於文件的激活的提示;這非常乾淨地解決了我的問題。 – Allan 2012-11-30 17:27:08

5

該配置文件只能通過從命令行傳遞的屬性來激活。這是因爲POM中的屬性只能在POM解析後才能處理,此時解決配置文件激活已爲時過晚。

你用這種方法有點捉姦22,除非你能夠從命令行傳遞屬性,在settings.xml中指定配置文件激活(通常不是一個好主意),或者使用在我的previous answer中解決方法是使用標記文件。

如果你在Maven 2.1.0+上的最後一種選擇是通過去激活該配置文件僅通過父POM的命令行,這仍然顯然不理想。

您可以使用字符'!'取消激活配置文件或「 - 」是這樣的:

mvn install -P !profile-1,!profile-2 
+0

我很害怕。它實際上似乎配置文件的執行已設置,並且在構建開始後無法更改(即使使用標記文件)。取消激活這些-1和-2是指什麼?如果我有父母和孩子,並且個人資料「建立」,以下是否會取消父母個人資料? (在我的測試中不是) 'mvn install -P!buiild-1' – Bostone 2009-10-01 20:42:11

+0

我不明白。爲什麼''或''個人資料觸發器不適合你? – 2009-10-01 22:29:40

+0

這個例子是關閉兩個名爲'profile-1'和'profile-2'的配置文件,對'-1'或'-2'沒有特別的意義。在你的情況下,它只是'mvn install -P!build' – 2009-10-02 13:29:27

5

直接回答我的問題:在多模塊構建的所有屬性都設置構建運行之前,所以它是不可能激活/在一個模塊停用的個人資料期間建立基於設置在兒童POM propety。但是,如果您正在尋找通過其他方式進行操作的方式,請read this comment