什么是生命周期?
在Maven出現之前,項目構建的生命周期就已經存在,軟件開發人員每天都在對項目進行清理、編譯、測試及部署。雖然大家都在不停地做構建工作,但公司和公司間、項目和項目間,往往使用不同的方式做類似的工作。有的項目以手工的方式在執行編譯測試,有的項目寫了自動化腳本執行編譯測試。可以想象的是,雖然各種手工方式十分類似,但不可能完全一樣;同樣地,對于自動化腳本,大家也是各寫各的,能滿足自身需求即可,換個項目就需要重頭再來。
Maven的生命周期就是為了對所有的構建過程進行抽象和統一。 Maven從大量項目和構建工具中學習和反思,然后總結了一套高度完善的、易擴展的生命周期。這個生命周期包含了項目的清理、初始化、編譯、測試、打包、集成測試、驗證、部署和站點生成等幾乎所有構建步驟。也就是說,幾乎所有項目的構建,都能映射到這樣一個生命周期上。
Maven的生命周期是抽象的,這意味著生命周期本身不做任何實際的工作,在Maven的設計中,實際的任務(如編譯源代碼)都交由插件來完成。
生命周期和插件的關系
如上圖所示,每個構建步驟都可以綁定一個或者多個插件行為,而且Maven為大多數構建步驟編寫并綁定了默認插件。例如,針對編譯的插件有maven-compiler-plugin,針對測試的插件有maven-surefire-plugin等。雖然在大多數時間里,用戶幾乎都不會覺察到插件的存在,但實際上編譯是由maven-compiler-plugin完成的,而測試是由maven-surefire-plugin完成的。當用戶有特殊需要的時候,也可以配置插件定制構建行為,甚至自己編寫插件。
Maven的三套生命周期
初學者往往會以為Maven的生命周期是一個整體,其實不然,Maven擁有三套相互獨立的生命周期,它們分別為clean、default和site。clean生命周期的目的是清理項目,default生命周期的目的是構建項目,而site生命周期的目的是建立項目站點。
生命周期各個階段的執行順序:
每個生命周期包含一些階段(phase),這些階段是有順序的,并且后面的階段依賴于前面的階段,用戶和Maven最直接的交互方式就是調用這些生命周期階段。以clean生命周期為例,它包含的階段有pre-clean、clean和post-clean。當用戶調用pre-clean的時候,只有pre-clean階段得以執行;當用戶調用clean的時候,pre-clean和clean階段會得以順序執行;當用戶調用post-clean的時候,pre-clean、clean和post-clean會得以順序執行。
三套生命周期之間的關系:
較之于生命周期階段的前后依賴關系,三套生命周期本身是相互獨立的,用戶可以僅僅調用clean生命周期的某個階段,或者僅僅調用default生命周期的某個階段,而不會對其他生命周期產生任何影響。例如,當用戶調用clean生命周期的clean階段的時候,不會觸發default生命周期的任何階段,反之亦然,當用戶調用default生命周期的compile階段的時候,也不會觸發clean生命周期的任何階段。
- clean生命周期
clean生命周期的目的是清理項目,它包含三個階段:
pre-clean執行一些清理前需要完成的工作。
clean清理上一次構建生成的文件。
post-clean執行一些清理后需要完成的工作。
- default生命周期
default 生命周期定義了真正構建時所需要執行的所有步驟,它是所有生命周期中最核心的部分,其包含的階段如下,這里只對重要的階段進行解釋:
validate
initialize
generate-sources
process-sources處理項目主資源文件。一般來說,是對src/main/resources目錄的內容進行變量替換等工作后,復制到項目輸出的主classpath目錄中。
generate-resources
process-resources
compile編譯項目的主源碼。一般來說,是編譯src/main/java目錄下的Java文件至項目輸出的主classpath目錄中。
process-classes
generate-test-sources
process-test-sources處理項目測試資源文件。一般來說,是對src/test/resources目錄的內容進行變量替換等工作后,復制到項目輸出的測試classpath目錄中。
generate-test-resources
process-test-resources
test-compile編譯項目的測試代碼。一般來說,是編譯src/test/java目錄下的Java文件至項目輸出的測試classpath目錄中。
process-test-classes
test使用單元測試框架運行測試,測試代碼不會被打包或部署。
prepare-package
package接受編譯好的代碼,打包成可發布的格式,如JAR。
pre-integration-test
integration-test
post-integration-test
verify
install將包安裝到Maven本地倉庫,供本地其他Maven項目使用。
deploy將最終的包復制到遠程倉庫,供其他開發人員和Maven項目使用。
- site生命周期
site生命周期的目的是建立和發布項目站點,Maven能夠基于POM所包含的信息,自動生成一個友好的站點,方便團隊交流和發布項目信息。該生命周期包含如下階段:
pre-site執行一些在生成項目站點之前需要完成的工作。
site生成項目站點文檔。
post-site執行一些在生成項目站點之后需要完成的工作。
site-deploy將生成的項目站點發布到服務器上。
如何執行生命周期命令
- 通過命令行來執行生命周期
從命令行執行Maven任務的最主要方式就是調用Maven的生命周期階段。需要注意的是,各個生命周期是相互獨立的,而一個生命周期的階段是有前后依賴關系的。下面以一些常見的Maven命令為例,解釋其執行的生命周期階段:
mvn test:該命令調用default生命周期的test階段。實際執行的階段為default生命周期的validate、initialize等,直到test的所有階段。這也解釋了為什么在執行測試的時候,項目的代碼能夠自動得以編譯。
mvn clean deploy site-deploy:該命令調用clean生命周期的clean階段、default生命周期的deploy階段,以及site生命周期的site-deploy階段。實際執行的階段為clean生命周期的pre-clean、clean階段,default生命周期的所有階段,以及site生命周期的所有階段。該命令結合了Maven所有三個生命周期,且deploy為default生命周期的最后一個階段,site-deploy為site生命周期的最后一個階段。
原文鏈接:https://blog.csdn.net/wangdong5678999/article/details/72848044
、http://www.lxweimin.com/p/fd43b3d0fdb0