1. 程式人生 > >轉載:按需構建多模組,玩轉Maven反應堆

轉載:按需構建多模組,玩轉Maven反應堆

在多模組Maven專案中,反應堆(Reactor)是一個包含了所有需要構建模組的抽象概念,對於Maven使用者來說,主要關心的是兩點:

  1. 哪些模組會被包含到反應堆中?
  2. 反應堆中所有模組的構建順序是什麼?

例如有這樣的一個多模組專案:

plexus-security包含了8個子模組,其中security-realms還包括了更進一層的兩個子模組。

執行mvn clean install可以看到這樣的輸出:

[INFO] Scanning for projects...  
[INFO] ------------------------------------------------------------------------  
[INFO] Reactor Build Order:  
[INFO]   
[INFO] Plexus Security Aggregator  
[INFO] Security: Parent  
[INFO] Security: Model  
[INFO] Security: XML Model  
[INFO] Security: Configuration  
[INFO] Security: System  
[INFO] Security: Realms Parent  
[INFO] Plexus XML Realm  
[INFO] Security: REST API  
[INFO] Plexus URL Realm  
[INFO] Security Legacy Adapter  
[INFO]                                                                           
[INFO] ------------------------------------------------------------------------  

在預設情況下,Maven會根據多模組配置構建所有的模組,Maven還會根據模組間的依賴關係自動計算構建順序,以確保被依賴的模組會先得以構建。值得一提的是,在這種情形下,Maven會將父模組看成是其子模組的依賴,因此該例中Security Parent會較先得以構建。

一般來說,我們要麼構建整個專案,要麼構建單個模組,但是有些時候,我們會想要僅僅構建這個完整的反應堆中的某些模組,換句話說,我們會需要裁剪反應堆。

例如說,我對模組security-configuration做了一些更改,而我知道在完整反應堆順序中,security-model-xml和security-model在其之前,不會依賴它,因此就沒必要構建他們。我們只需要構建security-configuration及其之後的專案。

Maven提供了很多命令列選項讓我們自定義反應堆,輸入mvn -h可以看到這樣一些選項:

Options:  
 -am,--also-make                        If project list is specified, also  
                                        build projects required by the  
                                        list  
 -amd,--also-make-dependents            If project list is specified, also  
 -pl,--projects <arg>                   Build specified reactor projects  
                                        instead of all projects. A project  
                                        can be specified by  
                                        [groupId]:artifactId or by its  
                                        relative path.  
 -rf,--resume-from <arg>                Resume reactor from specified  
                                        project  

--resume-from 表示從該模組恢復,也就是說選擇從哪裡開始構建,等於剪掉了完整反應堆的前面一部分。

例如我執行 mvn clean install -rf security-configuration/ ,就會得到這樣的一個反應堆:

[INFO] ------------------------------------------------------------------------  
[INFO] Reactor Build Order:  
[INFO]   
[INFO] Security: Configuration  
[INFO] Security: System  
[INFO] Security: Realms Parent  
[INFO] Plexus XML Realm  
[INFO] Security: REST API  
[INFO] Plexus URL Realm  
[INFO] Security Legacy Adapter  
[INFO]                                                                           
[INFO] ------------------------------------------------------------------------  

與完整反應堆相比,前面的四個模組不見了,只保留了security-system及其之後的模組。

--projects 表示手動選擇需要構建的專案,專案間以逗號分隔。

例如我執行 mvn clean install -pl security-configuration/,security-realms/security-xml-realm/,會得到如下反應堆:

[INFO] ------------------------------------------------------------------------  
[INFO] Reactor Build Order:  
[INFO]   
[INFO] Security: Configuration  
[INFO] Plexus XML Realm  
[INFO]                                                                           
[INFO] ------------------------------------------------------------------------  

--also-make 的前提是--projects引數,表示同時構建所列模組依賴的其他模組。

例如我執行 mvn clean install -pl security-model-xml/ -am,會得到如下反應堆:

[INFO] ------------------------------------------------------------------------  
[INFO] Reactor Build Order:  
[INFO]   
[INFO] Security: Parent  
[INFO] Security: Model  
[INFO] Security: XML Model  
[INFO]                                                                           
[INFO] ------------------------------------------------------------------------  

這裡security-model-xml依賴於security-model,而security-parent是security-model-xml的父專案,因此這兩個模組都會得以構建。

--also-make-dependents 的前提是--projects引數,表示同時構建那些依賴於所列模組的模組。

例如我執行 mvn clean install -pl security-model-xml/ -amd,會得到如下反應堆:

[INFO] ------------------------------------------------------------------------  
[INFO] Reactor Build Order:  
[INFO]   
[INFO] Security: XML Model  
[INFO] Plexus XML Realm  
[INFO] Security: REST API  
[INFO] Plexus URL Realm  
[INFO] Security Legacy Adapter  
[INFO]                                                                           
[INFO] ------------------------------------------------------------------------  

除了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/,便可以得到如下的反應堆:

[INFO] ------------------------------------------------------------------------  
[INFO] Reactor Build Order:  
[INFO]   
[INFO] Security: REST API  
[INFO] Plexus URL Realm  
[INFO] Security Legacy Adapter  
[INFO]                                                                           
[INFO] ------------------------------------------------------------------------  

這個反應堆表示:計算所有security-model-xml及依賴於它的模組,在次基礎上,從security-rest-api模組開始構建。

在開發過程中,靈活應用上述4個引數,可以幫助我們跳過那些無須構建的專案模組,從而加速構建,當專案龐大,模組特別多的時候,這種效果就異常明顯。

最後提一下,Maven從2.1版本才加入了此功能。 :)