按需構建多模塊,玩轉Maven反應堆

在多模塊Maven項目中,反應堆(Reactor)是一個包含了全部須要構建模塊的抽象概念,對於Maven用戶來講,主要關心的是兩點:
 
  1. 哪些模塊會被包含到反應堆中?
  2. 反應堆中全部模塊的構建順序是什麼?
 
例若有這樣的一個多模塊項目:
 
 
plexus-security包含了8個子模塊,其中security-realms還包括了更進一層的兩個子模塊。
運行mvn clean install能夠看到這樣的輸出:
 
Java代碼 
  1. [INFO] Scanning for projects...  
  2. [INFO] ------------------------------------------------------------------------  
  3. [INFO] Reactor Build Order:  
  4. [INFO]   
  5. [INFO] Plexus Security Aggregator  
  6. [INFO] Security: Parent  
  7. [INFO] Security: Model  
  8. [INFO] Security: XML Model  
  9. [INFO] Security: Configuration  
  10. [INFO] Security: System  
  11. [INFO] Security: Realms Parent  
  12. [INFO] Plexus XML Realm  
  13. [INFO] Security: REST API  
  14. [INFO] Plexus URL Realm  
  15. [INFO] Security Legacy Adapter  
  16. [INFO]                                                                           
  17. [INFO] ------------------------------------------------------------------------  
 
在默認狀況下,Maven會根據多模塊配置構建全部的模塊,Maven還會根據模塊間的依賴關係自動計算構建順序,以確保被依賴的模塊會先得以構建。值得一提的是,在這種情形下,Maven會將父模塊當作是其子模塊的依賴,所以該例中Security Parent會較先得以構建。
 
通常來講,咱們要麼構建整個項目,要麼構建單個模塊,可是有些時候,咱們會想要僅僅構建這個完整的反應堆中的某些模塊,換句話說,咱們會須要裁剪反應堆。
例如說,我對模塊security-configuration作了一些更改,而我知道在完整反應堆順序中,security-model-xml和security-model在其以前,不會依賴它,所以就不必構建他們。咱們只須要構建security-configuration及其以後的項目。
 
Maven提供了不少命令行選項讓咱們自定義反應堆,輸入mvn -h能夠看到這樣一些選項:
 
Java代碼 
  1. Options:  
  2.  -am,--also-make                        If project list is specified, also  
  3.                                         build projects required by the  
  4.                                         list  
  5.  -amd,--also-make-dependents            If project list is specified, also  
  6.  -pl,--projects <arg>                   Build specified reactor projects  
  7.                                         instead of all projects. A project  
  8.                                         can be specified by  
  9.                                         [groupId]:artifactId or by its  
  10.                                         relative path.  
  11.  -rf,--resume-from <arg>                Resume reactor from specified  
  12.                                         project  
 
 
--resume-from 表示從該模塊恢復,也就是說選擇從哪裏開始構建,等於剪掉了完整反應堆的前面一部分。
例如我運行 mvn clean install -rf security-configuration/ ,就會獲得這樣的一個反應堆:
 
Java代碼 
  1. [INFO] ------------------------------------------------------------------------  
  2. [INFO] Reactor Build Order:  
  3. [INFO]   
  4. [INFO] Security: Configuration  
  5. [INFO] Security: System  
  6. [INFO] Security: Realms Parent  
  7. [INFO] Plexus XML Realm  
  8. [INFO] Security: REST API  
  9. [INFO] Plexus URL Realm  
  10. [INFO] Security Legacy Adapter  
  11. [INFO]                                                                           
  12. [INFO] ------------------------------------------------------------------------  
  
與完整反應堆相比,前面的四個模塊不見了,只保留了security-system及其以後的模塊。
 
--projects 表示手動選擇須要構建的項目,項目間以 逗號分隔
例如我運行  mvn clean install -pl security-configuration/,security-realms/security-xml-realm/,會獲得以下反應堆:
 
Java代碼 
  1. [INFO] ------------------------------------------------------------------------  
  2. [INFO] Reactor Build Order:  
  3. [INFO]   
  4. [INFO] Security: Configuration  
  5. [INFO] Plexus XML Realm  
  6. [INFO]                                                                           
  7. [INFO] ------------------------------------------------------------------------  
 
--also-make 的前提是--projects參數,表示同時構建所列模塊依賴的其餘模塊。
例如我運行  mvn clean install -pl security-model-xml/ -am,會獲得以下反應堆:
 
Java代碼 
  1. [INFO] ------------------------------------------------------------------------  
  2. [INFO] Reactor Build Order:  
  3. [INFO]   
  4. [INFO] Security: Parent  
  5. [INFO] Security: Model  
  6. [INFO] Security: XML Model  
  7. [INFO]                                                                           
  8. [INFO] ------------------------------------------------------------------------  
 
 
這裏security-model-xml依賴於security-model,而security-parent是security-model-xml的父項目,所以這兩個模塊都會得以構建。
 
--also-make-dependents 的前提是--projects參數,表示同時構建那些依賴於所列模塊的模塊。
例如我運行  mvn clean install -pl security-model-xml/ -amd,會獲得以下反應堆:
 
Java代碼 
  1. [INFO] ------------------------------------------------------------------------  
  2. [INFO] Reactor Build Order:  
  3. [INFO]   
  4. [INFO] Security: XML Model  
  5. [INFO] Plexus XML Realm  
  6. [INFO] Security: REST API  
  7. [INFO] Plexus URL Realm  
  8. [INFO] Security Legacy Adapter  
  9. [INFO]                                                                           
  10. [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/,即可以獲得以下的反應堆:
 
Java代碼 
  1. [INFO] ------------------------------------------------------------------------  
  2. [INFO] Reactor Build Order:  
  3. [INFO]   
  4. [INFO] Security: REST API  
  5. [INFO] Plexus URL Realm  
  6. [INFO] Security Legacy Adapter  
  7. [INFO]                                                                           
  8. [INFO] ------------------------------------------------------------------------  
 
 
這個反應堆表示:計算全部security-model-xml及依賴於它的模塊,在此基礎上,從security-rest-api模塊開始構建。
 
在開發過程當中,靈活應用上述4個參數,能夠幫助咱們跳過那些無須構建的項目模塊,從而加速構建,當項目龐大,模塊特別多的時候,這種效果就異常明顯。
 
最後提一下,Maven從2.1版本才加入了此功能。 :)
相關文章
相關標籤/搜索