我們?cè)陂_發(fā)項(xiàng)目的時(shí)候,不斷地在編譯、測(cè)試、打包、部署等過程,maven的生命周期就是對(duì)所有構(gòu)建過程抽象與統(tǒng)一,生命周期包含項(xiàng)目的清理、初始化、編譯、測(cè)試、打包、集成測(cè)試、驗(yàn)證、部署、站點(diǎn)生成等幾乎所有的過程。
Maven有三套相互獨(dú)立的生命周期,請(qǐng)注意這里說的是“三套”,而且“相互獨(dú)立”,初學(xué)者容易將Maven的生命周期看成一個(gè)整體,其實(shí)不然。這三套生命周期分別是:
-
CleanLifecycle在進(jìn)行真正的構(gòu)建之前進(jìn)行一些清理工作。 -
DefaultLifecycle構(gòu)建的核心部分,編譯,測(cè)試,打包,部署等等。 -
SiteLifecycle生成項(xiàng)目報(bào)告,站點(diǎn),發(fā)布站點(diǎn)。
再次強(qiáng)調(diào)一下它們是相互獨(dú)立的,可以僅僅調(diào)用clean來清理工作目錄,僅僅調(diào)用site來生成站點(diǎn)。當(dāng)然也可以直接運(yùn)行 mvn clean install site 運(yùn)行所有這三套生命周期。
每套生命周期都由一組階段(Phase)組成,我們平時(shí)在命令行輸入的命令總會(huì)對(duì)應(yīng)于一個(gè)特定的階段。maven中所有的執(zhí)行動(dòng)作(goal)都需要指明自己在這個(gè)過程中的執(zhí)行位置,然后maven執(zhí)行的時(shí)候,就依照過程的發(fā)展依次調(diào)用這些goal進(jìn)行各種處理。這個(gè)也是maven的一個(gè)基本調(diào)度機(jī)制。
每套生命周期還可以細(xì)分成多個(gè)階段。
cleanLifecycle
Clean生命周期一共包含了三個(gè)階段:
-
pre-clean執(zhí)行一些需要在clean之前完成的工作 -
clean移除所有上一次構(gòu)建生成的文件 -
post-clean執(zhí)行一些需要在clean之后立刻完成的工作
命令mvn clean中的就是代表執(zhí)行上面的clean階段,在一個(gè)生命周期中,運(yùn)行某個(gè)階段的時(shí)候,它之前的所有階段都會(huì)被運(yùn)行,也就是說,mvn clean 等同于 mvn pre-clean clean ,如果我們運(yùn)行mvn post-clean ,那么 pre-clean,clean 都會(huì)被運(yùn)行。這是Maven很重要的一個(gè)規(guī)則,可以大大簡(jiǎn)化命令行的輸入。
DefaultLifecycle
Maven最重要就是的Default生命周期,也稱構(gòu)建生命周期,絕大部分工作都發(fā)生在這個(gè)生命周期中,每個(gè)階段的名稱與功能如下:
-
validate驗(yàn)證項(xiàng)目是否正確,以及所有為了完整構(gòu)建必要的信息是否可用 -
initialize初始化構(gòu)建狀態(tài),比如設(shè)置屬性或者創(chuàng)建目錄 -
generate-sources生成所有需要包含在編譯過程中的源代碼 -
process-sources處理源代碼,比如過濾一些值 -
generate-resources生成所有需要包含在打包過程中的資源文件 -
process-resources復(fù)制并處理資源文件至目標(biāo)目錄,準(zhǔn)備打包 -
compile編譯項(xiàng)目的源代碼 -
process-classes后處理編譯生成的文件,例如對(duì)Java類進(jìn)行字節(jié)碼增強(qiáng)(bytecode enhancement) -
generate-test-sources生成所有包含在測(cè)試編譯過程中的測(cè)試源碼 -
process-test-sources處理測(cè)試源碼,比如過濾一些值 -
generate-test-resources生成測(cè)試需要的資源文件 -
process-test-resources復(fù)制并處理測(cè)試資源文件至測(cè)試目標(biāo)目錄 -
test-compile編譯測(cè)試源碼至測(cè)試目標(biāo)目錄 -
test使用合適的單元測(cè)試框架運(yùn)行測(cè)試。這些測(cè)試應(yīng)該不需要代碼被打包或發(fā)布 -
prepare-package在真正的打包之前,執(zhí)行一些準(zhǔn)備打包必要的操作 -
package將編譯好的代碼打包成可分發(fā)的格式,如JAR,WAR,或者EAR -
pre-integration-test執(zhí)行一些在集成測(cè)試運(yùn)行之前需要的動(dòng)作。如建立集成測(cè)試需要的環(huán)境 -
integration-test如果有必要的話,處理包并發(fā)布至集成測(cè)試可以運(yùn)行的環(huán)境 -
post-integration-test執(zhí)行一些在集成測(cè)試運(yùn)行之后需要的動(dòng)作。如清理集成測(cè)試環(huán)境。 -
verify執(zhí)行所有檢查,驗(yàn)證包是有效的,符合質(zhì)量規(guī)范 -
install安裝包至本地倉(cāng)庫(kù),以備本地的其它項(xiàng)目作為依賴使用 -
deploy復(fù)制最終的包至遠(yuǎn)程倉(cāng)庫(kù),共享給其它開發(fā)人員和項(xiàng)目(通常和一次正式的發(fā)布相關(guān))
可見,構(gòu)建生命周期被細(xì)分成了22個(gè)階段,但是我們沒必要對(duì)每個(gè)階段都了如指掌,經(jīng)常關(guān)聯(lián)使用的只有process-test-resources、test、package、install、deploy等幾個(gè)階段而已。
一般來說,位置稍后的過程都會(huì)依賴于之前的過程。這也就是為什么我們運(yùn)行mvn install 的時(shí)候,代碼會(huì)被編譯,測(cè)試,打包。當(dāng)然,maven同樣提供了配置文件,可以依照用戶要求,跳過某些階段。比如有時(shí)候希望跳過測(cè)試階段而直接install,因?yàn)閱卧獪y(cè)試如果有任何一條沒通過,maven就會(huì)終止后續(xù)的工作。
siteLifecycle
-
pre-site執(zhí)行一些需要在生成站點(diǎn)文檔之前完成的工作 -
site生成項(xiàng)目的站點(diǎn)文檔 -
post-site執(zhí)行一些需要在生成站點(diǎn)文檔之后完成的工作,并且為部署做準(zhǔn)備 -
site-deploy將生成的站點(diǎn)文檔部署到特定的服務(wù)器上
這里經(jīng)常用到的是site階段和site-deploy階段,用以生成和發(fā)布Maven站點(diǎn),這是Maven相當(dāng)強(qiáng)大的功能。