Maven 生命周期
我們今天帶來的是 Maven 的另一個重要概念–生命周期。在學習了 Maven 的生命周期之后,在使用 Maven 的過程中,就能夠夠好的理解每一步操作的意義。
1. 什么是生命周期
其實生命周期這個概念并不是 Maven 首創的,因為即使不用 Maven,這些事情也是需要我們去做的。想象一下在沒有 Maven 的時候,我們開發完一個項目之后,一般是直接使用 Java 的相關命令進行編譯,打包等等工作。
但是這些工作無聊而且繁瑣,基本上充斥在開發者每天日常的工作中,無論是開發新功能,還是修改一個 Bug,都需要重復以上操作。當然有聰明的開發者,也會將這些每天重復的事情做成腳本來執行。
那么問題又來了,不同公司的不同項目之間或多或少會存在些許差異,這種時候,可能就需要開發者針對這些差異來定制一些步驟,或者腳本。也就是說,每當我們開始開發一個新項目的時候,或者換到另一個項目組的時候,我們構建項目的步驟或者方式都可能會發生變化。
Maven 的出現,可以說是很大程度上緩解了這種問題的發生。通過吸取很多項目的經驗,Maven 定義了一套完整而且統一的生命周期模型。使用這個模型,我們將構建的細節交給 Maven,只需要理解對應生命周期的含義即可完成構建。就好像,人到了青少年的時候,就要去上學,到了青年的時候,就要出來工作類似,我們不需要知道上學或者工作中具體的事情,只需要知道,到了這個階段,能夠做這個事情就可以了。
2. 生命周期詳解
Maven 的生命周期并非只有一套,而是有三套,并且這三套生命周期之間是沒有關系的。一套生命周期包含很多個不同的階段,這些不同的階段是有順序的,有些階段必須要在某個階段完成之后,才能進行。Maven 的三套生命周期分別為:clean(清理),default(默認),site(站點)。接下來我們就一一介紹一下這三個生命周期。
2.1 clean 生命周期
clean 生命周期包括:
- pre-clean: 清理前的準備工作;
- clean:清理上一次構建的結果;
- post-clean: 清理結束后需要完成的工作。
一般情況下,Maven 的構建結果會生成在 target 目錄下,我們執行 mvn clean 命令后,這個目錄會被清空。
從上圖,我們可以看到,對應的 target 目錄被清理干凈了。
2.2 default生命周期
default 生命周期應該算是大多數開發者最為熟悉的生命周期,也是平時在開發過程中最常用的生命周期。
- validate:驗證階段。驗證項目構建過程中需要的信息的正確性;
- compil:編譯階段;
- test:測試階段。使用測試框架對項目進行測試,打包過程中,非必要階段,可以跳過執行。
- package:打包階段。將編譯好的文件打包成 jar 包,war 包或者 ear 包;
- verify:檢查階段。檢查打包結果的有效性;
- install:本地部署階段。將包部署到本地倉庫,可以提供給本地開發過程中其他項目使用;
- deploy:遠程倉庫部署階段。將最終的包復制到遠程倉庫,提供給使用該倉庫的其他開發者使用。
這里我們介紹的只是在 default 生命周期中最常用的,其實在這些階段執行的過程中,還會有其他的階段需要執行,但是并非很常用。另外,不出意外的情況下,在生命周期中,后執行的階段要等先執行的階段執行完再執行。
我們試著執行 Maven 的打包命令:mvn package -DskipTests
。執行完成之后,可以看到其所經過的生命周期。因此,當我們想要構建項目的時候,并不需要分別執行 package 階段之前的階段,而是 Maven 自動為我們執行。突然發現,原來構建項目是如此的簡單,方便。
2.3 site 生命周期
很多時候,我們不僅僅需要構建我們的項目,還需要生成項目文檔或者站點。site 生命周期則是來幫助我們做這件事情的,它能夠根據我們項目中 pom.xml 的信息,來生成一個友好的站點。
跟其他的生命周期一樣,site 生命周期也包含不止一個階段:
- pre-site:準備階段。在生成站點前所需要做的工作;
- site:生成站點階段;
- post-site:結束階段。生成站點結束后所需要做的工作;
- site-deploy:發布階段。我們可以將上面生成的站點發布到對應服務器中。
3.插件
3.1 插件目標
其實在 Maven 的世界中,生命周期只是一個抽象的模型,其本身并不會直接去做事情,真正幫我們完成事情的是 Maven 的插件。Maven 的插件也屬于構件的一種,也是可以放到 Maven 倉庫當中的。
通常情況下,一個插件可以做 A、B、C 等等不止一件事情,但是我們又沒有必要為每一個功能都做一個單獨的插件。這種時候,我們一般會給這個插件綁定不同的目標,而這些目標則是對應其不同的功能。
當我們使用一個插件的目標的時候,我們可以執行命令:mvn pluginName:goalName
。例如當我們執行dependency
插件的 list 目標的時候,我們可以執行命令:mvn dependency:list
。
使用該插件目標,我們可以看到目前我們項目中所有依賴的情況。
3.2 插件綁定
我們說 Maven 的生命周期只是抽象的概念,真正幫我們完成事情的是插件,其實更確切的說,應該是生命周期與插件對應的目標綁定,來完成具體的功能。
4. 小結
在本節中,我們詳細介紹了 Maven 的生命周期,常用的生命周期,以及其與插件的對應關系,簡單的工作原理。學完之后,能夠加深 Maven 的理解,減少使用過程中的誤解。