十七、Maven: Maven 生命周期

什么是生命周期?
在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生命周期的任何階段。

  1. clean生命周期
    clean生命周期的目的是清理項目,它包含三個階段:

pre-clean執行一些清理前需要完成的工作。
clean清理上一次構建生成的文件。
post-clean執行一些清理后需要完成的工作。

  1. 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項目使用。

  1. site生命周期
    site生命周期的目的是建立和發布項目站點,Maven能夠基于POM所包含的信息,自動生成一個友好的站點,方便團隊交流和發布項目信息。該生命周期包含如下階段:

pre-site執行一些在生成項目站點之前需要完成的工作。
site生成項目站點文檔。
post-site執行一些在生成項目站點之后需要完成的工作。
site-deploy將生成的項目站點發布到服務器上。
如何執行生命周期命令

  1. 通過命令行來執行生命周期
    從命令行執行Maven任務的最主要方式就是調用Maven的生命周期階段。需要注意的是,各個生命周期是相互獨立的,而一個生命周期的階段是有前后依賴關系的。下面以一些常見的Maven命令為例,解釋其執行的生命周期階段:

mvn clean:該命令調用clean生命周期的clean階段。實際執行的階段為clean生命周期的pre-clean和clean階段。mvn test:該命令調用default生命周期的test階段。實際執行的階段為default生命周期的validate、initialize等,直到test的所有階段。這也解釋了為什么在執行測試的時候,項目的代碼能夠自動得以編譯。
mvn clean install:該命令調用clean生命周期的clean階段和default生命周期的in-stall階段。實際執行的階段為clean生命周期的pre-clean、clean階段,以及default生命周期的從validate至install的所有階段。該命令結合了兩個生命周期,在執行真正的項目構建之前清理項目是一個很好的實踐。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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評論 6 546
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,814評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,980評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,779評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,109評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,287評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,799評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,515評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,750評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,933評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,492評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,703評論 2 380