2009-10-01 80 views
18

我知道這是mauvais ton在一天問兩次,但這裏的另一個Maven的益智遊戲:的Maven - 跳過父項目建設

我有一個定義了5個模塊(5個子項目)父POM。由於每個模塊的執行方式與我將<profile><build>部分拉到父POM中的方式完全相同,所以可以擺脫重複的代碼。現在 - 如果我從每個模塊單獨執行構建,它會工作,但是如果我想一次構建所有模塊並移動到父目錄,則自從Maven嘗試執行的第一件事是父項目本身以來,出現錯誤:

mvn package -P release 
[INFO] Scanning for projects... 
[INFO] Reactor build order: 
[INFO] DWD Parent project 
[INFO] Projects 

之後,構建失敗,因爲exec插件試圖執行不存在的東西。看看輸出,很明顯的是反應器插件正在推動構建,但我如何配置反應器來跳過父項?

P.S.爲了防止混淆 - 我試圖禁止在父級上的配置文件執行,並在same構建構建

+0

底線:行家缺乏支持成分,不可能的,如果你只從父 – sibidiba 2014-10-18 12:07:26

回答

9

構建父項時出了什麼問題?

事實上,在Maven中,有兩個不同的概念(其通常用於在同一時間):

  • 父POM
  • 模塊聚集

第一個是所有孩子都常見的一切的定義。您將父項定義爲pom打包項目,並且可以將其安裝在存儲庫中。

當您構建此父級的子級時,Maven2將檢索此父級以將父級Pom與子級Pom合併。您可以通過運行命令mvn help:effective-pom來查看整個pom.xml。

在這種情況下,不會構建父pom,只會從存儲庫中檢索它。

第二種情況是一個包含modules子項目列表的項目。原則是你在這個項目上運行的每個命令也將在所有的子模塊上運行。模塊的順序將由Reactor定義,Reactor將查看模塊間依賴關係,以查找哪些模塊必須先於其他模塊構建。如果沒有依賴關係,那麼它將獲取父級pom.xml中定義的模塊列表。

在這種情況下,如果您在根項目上運行命令,Maven2將首先構建根項目,然後構建子模塊。你不能跳過創建根項目。


編輯,感謝RichSeller評論

的多模塊(聚合項目)和繼承(父項目)之間的差異的完整解釋可以在Maven的書中找到,here

+0

+1來指出這一點,請參閱Maven書籍瞭解更多詳情:http://www.sonatype.com/books/maven-book/reference/ pom-relationships-sect-multi-vs-inherit.html – 2009-10-01 08:27:24

+0

是的,我想指出一點,因爲一般人認爲聚合和父項目是相同的東西,不能單獨使用。 – romaintaz 2009-10-01 08:33:54

+2

構建父項時出現了什麼問題?簡單 - 配置文件中發生的情況適用於兒童,但對於父母無效。爲了您的觀點 - 我需要:聚合和能夠拉出可重複使用的代碼。配置文件激活 - 正如Rich Seller所評論的那樣是完美的解決方案 – Bostone 2009-10-01 15:44:52

14

在子級上啓用它。您不能跳過父構建,但您可以配置該配置文件不被激活一點點黑客。 This answer顯示瞭如何通過是否存在基於文件的元素來控制配置文件的激活。這樣,您可以在父項中定義配置文件,但由於父項中存在標記文件,因此可以在該項目中將其取消激活。子項目的源代碼中沒有標記文件,因此將爲這些項目激活配置文件。

更新說明:在我的測試項目中,此配置表示配置文件在父項目(具有src/main/resources中的文件)中處於停用狀態,但在其所有沒有文件的子項目中激活資源目錄。

<profile> 
    <id>test</id> 
    <activation> 
    <file> 
     <missing>src/main/resources/test.marker</missing> 
    </file> 
    </activation> 
    ... 
</profile> 
+1

富建 - 這就是我想要的答案!至於romanitaz的觀點 - 我希望:聚合和能夠將常用代碼拉到父代(執行代碼毫無意義)。 – Bostone 2009-10-01 15:42:09

+0

富有 - 如果我可以打擾你一點點。我試圖通過使用屬性而不是丟失的文件來達到相同的效果。它不起作用。即使將財產聲明粘貼到我孩子的POM中,我的個人資料也不會被激活。這是爲什麼?屬性是否聲明爲「預建」並且不會重置?也許我應該問另一個問題,以便我可以把代碼示例? – Bostone 2009-10-01 15:48:11

+0

不,它應該基於財產存在激活(http://maven.apache.org/guides/introduction/introduction-to-profiles.html上有一個示例),如果您無法獲得,請隨時提出另一個問題它工作 – 2009-10-01 15:58:58

4

我想證明我的情況存在部分妥協(感謝maven用戶郵件列表中的建議)。基本上你需要切成兩塊的形狀。可重複使用的configuration部分插件轉到父POM,並且executions停留在子POM中。然後,該子項中的配置文件插件被標記爲inherited,瞧 - 在運行時父配置文件不會被執行,因爲它缺少executions部分。這遠非理想,但確實奏效。例如to this link

+0

有趣的是,感謝您在此發佈此信息。但是,鏈接是否起作用,還是僅僅是我? – 2009-10-02 22:46:29

+0

適用於我,但你可以嘗試完整版 http://mail-archives.apache.org/mod_mbox/maven-users/200812.mbox/%[email protected]%3E – Bostone 2009-10-03 00:21:14

+0

完整版的作品,不是縮短的。謝謝。 – 2009-10-03 01:00:30

2

我無法實現上面Rick Seller提供的「缺少」文件解決方案。似乎一旦設置配置文件的活動/非活動狀態將不會改變,即使模塊中缺少標記文件。但是,這是我的問題的確切解決方案。警告:這是隻可與Maven 2.1+

開始。如果我有2個模塊父POM定義:foo和常規情況下再噓執行順序將是:

  1. FOO

所有我需要做的,跳過父生成是添加此命令行開關

mvn install –rf foo

或者,您可以使用--resume-from它將做的是跳過父母並從foo模塊繼續。現在 - 我們正在調查這是否可以通過配置Reactor插件實現(PS - 不,不可能的)但即使有開關,上面的場景中工作正常,我

1

這是由@ romaintaz的回答暗示到相同的問題,Maven - skip parent project build

但只是爲了明確這一點,在父pom中,您必須指定包裝元素爲pom(而不是jar或war)。
例子:

<packaging>pom</packaging>