在多模塊Maven項目中,反應堆(Reactor)是一個包含了全部須要構建模塊的抽象概念,對於Maven用戶來講,主要關心的是兩點:
- 哪些模塊會被包含到反應堆中?
- 反應堆中全部模塊的構建順序是什麼?
例若有這樣的一個多模塊項目:
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版本才加入了此功能。 :)