Maven生命週期介紹

生命週期的概念與意義

在項目構建時通常會包含清理、編譯、測試、打包、驗證、部署,文檔生成等步驟,maven 統一對其進行了整理抽像成三個生命週期 (lifecycle)及各自對應的多個階段(phase)。這麼做的意義是:

  1. 每個階段都成爲了一個擴展點,可以採用不同的方式來實現,提高了擴展性與靈活性。
  2. 規範統一了maven 的執行路徑。

在執行項目構建階段時可以採用jar方式構建也可以採用war包方式構建,提高了靈活性。我們可以通過命令 mvn ${phase name}直接觸發指定階段的執行。

maven三大生命週期與其對應的phase(階段)

maven 總共包含三大生生命週期

  1. clean Lifecycle :清理生命週期,用於於清理項目
  2. default Lifecycle:默認生命週期,用於編譯、打包、測試、部署等
  3. site Lifecycle 站點文檔生成,用於構建站點文檔
    default生命週期.png

上圖給出了默認的生命週期的流程圖,我麼可以看到,生命週期也是抽象的流程概念,具體的實現,則是由相應的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,對應的默認插件是不同的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章