生命周期的概念與意義
在項(xiàng)目構(gòu)建時(shí)通常會(huì)包含清理俭嘁、編譯躺枕、測(cè)試、打包兄淫、驗(yàn)證屯远、部署蔓姚,文檔生成等步驟捕虽,maven 統(tǒng)一對(duì)其進(jìn)行了整理抽像成三個(gè)生命周期 (lifecycle)及各自對(duì)應(yīng)的多個(gè)階段(phase)。這么做的意義是:
- 每個(gè)階段都成為了一個(gè)擴(kuò)展點(diǎn)坡脐,可以采用不同的方式來(lái)實(shí)現(xiàn)泄私,提高了擴(kuò)展性與靈活性。
- 規(guī)范統(tǒng)一了maven 的執(zhí)行路徑。
在執(zhí)行項(xiàng)目構(gòu)建階段時(shí)可以采用jar方式構(gòu)建也可以采用war包方式構(gòu)建晌端,提高了靈活性捅暴。我們可以通過(guò)命令 mvn ${phase name}直接觸發(fā)指定階段的執(zhí)行。
maven三大生命周期與其對(duì)應(yīng)的phase(階段)
maven 總共包含三大生生命周期
- clean Lifecycle :清理生命周期咧纠,用于于清理項(xiàng)目
- default Lifecycle:默認(rèn)生命周期蓬痒,用于編譯、打包漆羔、測(cè)試梧奢、部署等
-
site Lifecycle 站點(diǎn)文檔生成,用于構(gòu)建站點(diǎn)文檔
上圖給出了默認(rèn)的生命周期的流程圖演痒,我么可以看到亲轨,生命周期也是抽象的流程概念,具體的實(shí)現(xiàn)鸟顺,則是由相應(yīng)的jar實(shí)現(xiàn)惦蚊。這就好比抽象類或者接口,僅僅定義標(biāo)準(zhǔn)讯嫂,也體現(xiàn)了具體場(chǎng)景中的靈活性蹦锋。
生命周期(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 | 編譯測(cè)試類 | |
process-test-classes | ||
test | 執(zhí)行測(cè)試 | |
prepare-package | 構(gòu)建前準(zhǔn)備 | |
package | 打包構(gòu)建 | |
pre-integration-test | ||
integration-test | ||
post-integration-test | ||
verify | 驗(yàn)證 | |
install | 上傳到本地倉(cāng)庫(kù) | |
deploy | 上傳到遠(yuǎn)程倉(cāng)庫(kù) | |
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)目過(guò)建的完整過(guò)程昏鹃,但這些過(guò)程具體由誰(shuí)來(lái)實(shí)現(xiàn)呢尚氛?這就是插件,maven 的核心部分代碼量其實(shí)很少洞渤,其大部分實(shí)現(xiàn)都是由插件來(lái)完成的阅嘶。比如: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)中并沒(méi)有配置 maven-compiler-plugin 插件,但當(dāng)我們執(zhí)行compile 階段時(shí)一樣能夠執(zhí)行編譯操作魂迄,原因是maven 默認(rèn)為指定階段綁定了插件實(shí)現(xiàn)。
下表列舉了各個(gè)階段的默認(rèn)綁定插件惋耙,數(shù)據(jù)來(lái)源于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,對(duì)應(yīng)的默認(rèn)插件是不同的推溃。