生命周期的概念與意義
在項(xiàng)目構(gòu)建時(shí)通常會(huì)包含清理、編譯、測試、打包、驗(yàn)證、部署,文檔生成等步驟,maven 統(tǒng)一對其進(jìn)行了整理抽像成三個(gè)生命周期 (lifecycle)及各自對應(yīng)的多個(gè)階段(phase)。這么做的意義是:
- 每個(gè)階段都成為了一個(gè)擴(kuò)展點(diǎn),可以采用不同的方式來實(shí)現(xiàn),提高了擴(kuò)展性與靈活性。
- 規(guī)范統(tǒng)一了maven 的執(zhí)行路徑。
在執(zhí)行項(xiàng)目構(gòu)建階段時(shí)可以采用jar方式構(gòu)建也可以采用war包方式構(gòu)建,提高了靈活性。我們可以通過命令 mvn ${phase name}直接觸發(fā)指定階段的執(zhí)行。
maven三大生命周期與其對應(yīng)的phase(階段)
maven 總共包含三大生生命周期
- clean Lifecycle :清理生命周期,用于于清理項(xiàng)目
- default Lifecycle:默認(rèn)生命周期,用于編譯、打包、測試、部署等
-
site Lifecycle 站點(diǎn)文檔生成,用于構(gòu)建站點(diǎn)文檔
default生命周期.png
上圖給出了默認(rèn)的生命周期的流程圖,我么可以看到,生命周期也是抽象的流程概念,具體的實(shí)現(xiàn),則是由相應(yīng)的jar實(shí)現(xiàn)。這就好比抽象類或者接口,僅僅定義標(biāo)準(zhǔn),也體現(xiàn)了具體場景中的靈活性。
| 生命周期(lifecycle) | 階段(phase) | 描述(describe) |
|---|---|---|
| clean Lifecycle | pre-clean | 預(yù)清理 |
| clean | 清理 | |
| post-clean | 清理之后 | |
| default Lifecycle | validate | 驗(yàn)證 |
| initialize | 初始化 | |
| generate-sources | ||
| process-sources | ||
| generate-resources | ||
| process-resources | ||
| compile | 編譯 | |
| process-classes | ||
| generate-test-sources | ||
| process-test-sources | ||
| generate-test-resources | ||
| process-test-resources | ||
| test-compile | 編譯測試類 | |
| process-test-classes | ||
| test | 執(zhí)行測試 | |
| prepare-package | 構(gòu)建前準(zhǔn)備 | |
| package | 打包構(gòu)建 | |
| pre-integration-test | ||
| integration-test | ||
| post-integration-test | ||
| verify | 驗(yàn)證 | |
| install | 上傳到本地倉庫 | |
| deploy | 上傳到遠(yuǎn)程倉庫 | |
| site Lifecycle | pre-site | 準(zhǔn)備構(gòu)建站點(diǎn) |
| site | 構(gòu)建站點(diǎn) | |
| post-site | 構(gòu)建站點(diǎn)之后 | |
| site-deploy | 站點(diǎn)部署 |
三大生命周期可以相互獨(dú)立執(zhí)行,也可以合在一起執(zhí)行。但lifecycle 中的phase 是有嚴(yán)格執(zhí)行的順序的,比如必須是先執(zhí)行完compile 才能執(zhí)行pakcage 動(dòng)作,此外phase 還有執(zhí)行邏輯存在,即當(dāng)你執(zhí)行一個(gè)phase 時(shí),其前面的phase 會(huì)自動(dòng)執(zhí)行。
生命周期的phase組成了項(xiàng)目過建的完整過程,但這些過程具體由誰來實(shí)現(xiàn)呢?這就是插件,maven 的核心部分代碼量其實(shí)很少,其大部分實(shí)現(xiàn)都是由插件來完成的。比如:test 階段就是由 maven-surefire-plugin 實(shí)現(xiàn)。在pom.xml 中我們可以設(shè)置指定插件目標(biāo)(gogal)與phase 綁定,當(dāng)項(xiàng)目構(gòu)建到達(dá)指定phase時(shí) 就會(huì)觸發(fā)些插件gogal 的執(zhí)行。 一個(gè)插件有時(shí)會(huì)實(shí)現(xiàn)多個(gè)phase,比如:maven-compiler-plugin插件分別實(shí)現(xiàn)了compile 和testCompile。
在我們的項(xiàng)目當(dāng)中并沒有配置 maven-compiler-plugin 插件,但當(dāng)我們執(zhí)行compile 階段時(shí)一樣能夠執(zhí)行編譯操作,原因是maven 默認(rèn)為指定階段綁定了插件實(shí)現(xiàn)。
下表列舉了各個(gè)階段的默認(rèn)綁定插件,數(shù)據(jù)來源于Maven官網(wǎng)。
Clean Lifecycle Bindings
| Phase | plugin:goal |
|---|---|
| clean | clean:clean |
Default Lifecycle Bindings - Packaging ear
| Phase | plugin:goal |
|---|---|
| generate-resources | ear:generate-application-xml |
| process-resources | resources:resources |
| package | ear:ear |
| install | install:install |
| deploy | deploy:deploy |
Default Lifecycle Bindings - Packaging jar
| Phase | plugin:goal |
|---|---|
process-resources |
resources:resources |
compile |
compiler:compile |
process-test-resources |
resources:testResources |
test-compile |
compiler:testCompile |
test |
surefire:test |
package |
jar:jar |
install |
install:install |
deploy |
deploy:deploy |
Default Lifecycle Bindings - Packaging maven-plugin
| Phase | plugin:goal |
|---|---|
| generate-resources | plugin:descriptor |
| process-resources | resources:resources |
| compile | compiler:compile |
| process-test-resources | resources:testResources |
| test-compile | compiler:testCompile |
| test | surefire:test |
Site Lifecycle Bindings
| Phase | plugin:goal |
|---|---|
| site | site:site |
| site-deploy | site:deploy |
從表格數(shù)據(jù)我們可以看出,package階段綁定插件非常靈活,生成不同的類型包,如jar,war或者ear,對應(yīng)的默認(rèn)插件是不同的。
