轉載:按需構建多模組,玩轉Maven反應堆
在多模組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版本才加入了此功能。 :)