生命週期的概念與意義
在項目構建時通常會包含清理、編譯、測試、打包、驗證、部署,文檔生成等步驟,maven 統一對其進行了整理抽像成三個生命週期 (lifecycle)及各自對應的多個階段(phase)。這麼做的意義是:
- 每個階段都成爲了一個擴展點,可以採用不同的方式來實現,提高了擴展性與靈活性。
- 規範統一了maven 的執行路徑。
在執行項目構建階段時可以採用jar方式構建也可以採用war包方式構建,提高了靈活性。我們可以通過命令 mvn ${phase name}直接觸發指定階段的執行。
maven三大生命週期與其對應的phase(階段)
maven 總共包含三大生生命週期
- clean Lifecycle :清理生命週期,用於於清理項目
- default Lifecycle:默認生命週期,用於編譯、打包、測試、部署等
- site Lifecycle 站點文檔生成,用於構建站點文檔
上圖給出了默認的生命週期的流程圖,我麼可以看到,生命週期也是抽象的流程概念,具體的實現,則是由相應的jar實現。這就好比抽象類或者接口,僅僅定義標準,也體現了具體場景中的靈活性。
生命週期(lifecycle) | 階段(phase) | 描述(describe) |
---|---|---|
clean Lifecycle | pre-clean | 預清理 |
clean | 清理 | |
post-clean | 清理之後 | |
default Lifecycle | validate | 驗證 |
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 | 執行測試 | |
prepare-package | 構建前準備 | |
package | 打包構建 | |
pre-integration-test | ||
integration-test | ||
post-integration-test | ||
verify | 驗證 | |
install | 上傳到本地倉庫 | |
deploy | 上傳到遠程倉庫 | |
site Lifecycle | pre-site | 準備構建站點 |
site | 構建站點 | |
post-site | 構建站點之後 | |
site-deploy | 站點部署 |
三大生命週期可以相互獨立執行,也可以合在一起執行。但lifecycle 中的phase 是有嚴格執行的順序的,比如必須是先執行完compile 才能執行pakcage 動作,此外phase 還有執行邏輯存在,即當你執行一個phase 時,其前面的phase 會自動執行。
生命週期的phase組成了項目過建的完整過程,但這些過程具體由誰來實現呢?這就是插件,maven 的核心部分代碼量其實很少,其大部分實現都是由插件來完成的。比如:test 階段就是由 maven-surefire-plugin 實現。在pom.xml 中我們可以設置指定插件目標(gogal)與phase 綁定,當項目構建到達指定phase時 就會觸發些插件gogal 的執行。 一個插件有時會實現多個phase,比如:maven-compiler-plugin插件分別實現了compile 和testCompile。
在我們的項目當中並沒有配置 maven-compiler-plugin 插件,但當我們執行compile 階段時一樣能夠執行編譯操作,原因是maven 默認爲指定階段綁定了插件實現。
下表列舉了各個階段的默認綁定插件,數據來源於Maven官網。
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 |
從表格數據我們可以看出,package階段綁定插件非常靈活,生成不同的類型包,如jar,war或者ear,對應的默認插件是不同的。