對於一個maven項目,若是有多個模塊,那麼它們的執行順序是什麼樣的呢?javascript
在執行mvn操做的時候,你能夠看到以下信息,這個即是maven的build順序java
那麼maven是如何決定順序的呢?以下:react
在多模塊Maven項目中,反應堆(Reactor)是一個包含了全部須要構建模塊的抽象概念,對於Maven用戶來講,主要關心的是兩點:api
在默認狀況下,Maven會根據多模塊配置構建全部的模塊,Maven還會根據模塊間的依賴關係自動計算構建順序,以確保被依賴的模塊會先得以構建。值得一提的是,在這種情形下,Maven會將父模塊當作是其子模塊的依賴。app
在多模塊Maven項目中,反應堆(Reactor)是一個包含了全部須要構建模塊的抽象概念,對於Maven用戶來講,主要關心的是兩點:maven
例若有這樣的一個多模塊項目:ui
plexus-security包含了8個子模塊,其中security-realms還包括了更進一層的兩個子模塊。spa
運行mvn clean install能夠看到這樣的輸出:命令行
Java代碼 rest
在默認狀況下,Maven會根據多模塊配置構建全部的模塊,Maven還會根據模塊間的依賴關係自動計算構建順序,以確保被依賴的模塊會先得以構建。值得一提的是,在這種情形下,Maven會將父模塊當作是其子模塊的依賴,所以該例中Security Parent會較先得以構建。
通常來講,咱們要麼構建整個項目,要麼構建單個模塊,可是有些時候,咱們會想要僅僅構建這個完整的反應堆中的某些模塊,換句話說,咱們會須要裁剪反應堆。
例如說,我對模塊security-configuration作了一些更改,而我知道在完整反應堆順序中,security-model-xml和security-model在其以前,不會依賴它,所以就不必構建他們。咱們只須要構建security-configuration及其以後的項目。
Maven提供了不少命令行選項讓咱們自定義反應堆,輸入mvn -h能夠看到這樣一些選項:
Java代碼
--resume-from 表示從該模塊恢復,也就是說選擇從哪裏開始構建,等於剪掉了完整反應堆的前面一部分。
例如我運行 mvn clean install -rf security-configuration/ ,就會獲得這樣的一個反應堆:
Java代碼
與完整反應堆相比,前面的四個模塊不見了,只保留了security-system及其以後的模塊。
--projects 表示手動選擇須要構建的項目,項目間以逗號分隔。
例如我運行 mvn clean install -pl security-configuration/,security-realms/security-xml-realm/,會獲得以下反應堆:
Java代碼
--also-make 的前提是--projects參數,表示同時構建所列模塊依賴的其餘模塊。
例如我運行 mvn clean install -pl security-model-xml/ -am,會獲得以下反應堆:
Java代碼
這裏security-model-xml依賴於security-model,而security-parent是security-model-xml的父項目,所以這兩個模塊都會得以構建。
--also-make-dependents 的前提是--projects參數,表示同時構建那些依賴於所列模塊的模塊。
例如我運行 mvn clean install -pl security-model-xml/ -amd,會獲得以下反應堆:
Java代碼
除了security-model-xml自己,全部其餘依賴於該模塊的模塊也會被加入到反應堆中。
除此以外,在-pl、-am或者-pl、-amd的基礎上,還能應用-rf參數,緊接着上面的例子,再加上參數-rf -rf security-rest-api/,
如:mvn clean install -pl security-model-xml/ -amd -rf security-rest-api/,即可以獲得以下的反應堆:
Java代碼
這個反應堆表示:計算全部security-model-xml及依賴於它的模塊,在次基礎上,從security-rest-api模塊開始構建。
在開發過程當中,靈活應用上述4個參數,能夠幫助咱們跳過那些無須構建的項目模塊,從而加速構建,當項目龐大,模塊特別多的時候,這種效果就異常明顯。
最後提一下,Maven從2.1版本才加入了此功能。 :)