翻譯自http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
目錄生成生命周期基礎(chǔ)生成生命周期由階段組成通用命令行調(diào)用一個(gè)生成階段是由插件目標(biāo)組成某些階段通常不從命令行調(diào)用設(shè)置項(xiàng)目以使用生成生命周期封包插件生命周期參考內(nèi)置生命周期綁定
Maven是基于生成生命周期這一核心概念的。這意味著生成和分配特定組件(項(xiàng)目)的過程是有明確定義的。 對(duì)于項(xiàng)目生成者而言,這意味著為了能夠生成Maven項(xiàng)目,學(xué)習(xí)一系列命令是必要的,項(xiàng)目目標(biāo)模型(POM)可以確保他們獲得他們想要的結(jié)果。 有三個(gè)內(nèi)置的生成生命周期:默認(rèn)(default),清空(clean),站點(diǎn)(site)。default生命周期處理項(xiàng)目部署,clean生命周期處理項(xiàng)目清空,site生命周期處理項(xiàng)目站點(diǎn)文檔的創(chuàng)建。
每一個(gè)組件的生命周期是依據(jù)不同生成階段的清單所定義,清單中的每一個(gè)生成階段是生命周期的一部分。 例如,默認(rèn)生命周期包括以下階段(對(duì)于生命周期階段的完整列表,請(qǐng)參照生命周期參考):
validate - 驗(yàn)證項(xiàng)目是正確的,所有必要的信息是可用的compile - 編譯項(xiàng)目的源代碼test - 使用合適的單元測(cè)試框架測(cè)試編譯后的源代碼。這些測(cè)試不需要打包或部署源碼package - 將已編譯的代碼封裝成可發(fā)布的格式,如JAR包verify - 運(yùn)行任何對(duì)集成測(cè)試結(jié)果的檢查,以確保達(dá)到質(zhì)量標(biāo)準(zhǔn)install - 將包安裝到本地儲(chǔ)存庫中,以便在其他項(xiàng)目中用作本地的依賴項(xiàng)deploy - 在生成環(huán)境中完成部署,將最終包復(fù)制到遠(yuǎn)程存儲(chǔ)庫,以便與其他開發(fā)人員及項(xiàng)目共享。這些生命周期階段(加上其他生命周期階段沒有顯示在這里)順序執(zhí)行,以完成default生命周期。上述所給出的周期階段意味著當(dāng)默認(rèn)生命周期運(yùn)行時(shí),Maven將首先驗(yàn)證項(xiàng)目,然后將嘗試編譯源代碼,運(yùn)行針對(duì)包和二進(jìn)制文件(如JAR)的測(cè)試,針對(duì)整個(gè)包運(yùn)行集成測(cè)試,驗(yàn)證集成測(cè)試,安裝已驗(yàn)證的包到本地儲(chǔ)存庫,然后將安裝包部署至遠(yuǎn)程存儲(chǔ)庫。
在開發(fā)環(huán)境中,使用下面的調(diào)用在本地存儲(chǔ)庫中生成和安裝構(gòu)件。
mvn install在執(zhí)行此命令前,即在執(zhí)行install前,每個(gè)默認(rèn)生命周期階段(validate,complile,package等)都將被依次執(zhí)行。您只需要調(diào)用最后一個(gè)生成階段來執(zhí)行,在這種情況下即為,install; 在生成環(huán)境中,使用下面的調(diào)用可以清空已有生成并部署構(gòu)件至共享存儲(chǔ)庫中。
同樣的命令可以用在多模塊的情況下(即一個(gè)項(xiàng)目包含一個(gè)或一個(gè)以上子項(xiàng)目)。Maven將進(jìn)入每個(gè)子項(xiàng)目執(zhí)行clean,然后執(zhí)行deploy(包括所有現(xiàn)有的生成階段的步驟)。
然而,即使是由生成階段負(fù)責(zé)生成生命周期中的特定步驟,但執(zhí)行這些職能的方式可能會(huì)有所不同。這是通過聲明綁定到這些生成階段的插件目標(biāo)來實(shí)現(xiàn)的。 插件目標(biāo)代表一個(gè)特定的任務(wù)(比生成階段更精細(xì)),它有助于項(xiàng)目的建立和管理。它可以綁定到零或更多的生成階段。未綁定到任何生成階段的目標(biāo)可以通過直接調(diào)用使其在生成生命周期之外執(zhí)行。執(zhí)行順序取決于目標(biāo)和生成階段的調(diào)用順序。例如,考慮下面的命令。clean和package參數(shù)屬于生成階段一級(jí),而dependency:copy-dependency是目標(biāo)(插件目標(biāo))級(jí)。
在執(zhí)行時(shí),clean階段將首先執(zhí)行(這意味著它將運(yùn)行clean之前的所有的階段,加上clean階段自身),然后執(zhí)行dependency:copy-dependencies目標(biāo),最后執(zhí)行package階段(和在其之前默認(rèn)生命周期的生成階段)。 此外,如果一個(gè)目標(biāo)被綁定到一個(gè)或多個(gè)生成階段,這個(gè)目標(biāo)將在所有這些階段都將被調(diào)用。 此外,一個(gè)生成階段也可以有零個(gè)或多個(gè)目標(biāo)綁定到它。如果生成階段沒有與它綁定的目標(biāo),則生成階段不會(huì)執(zhí)行。但如果它有一個(gè)或多個(gè)目標(biāo),它將執(zhí)行所有這些目標(biāo) (注:在Maven 2.0.5以上,多目標(biāo)綁定到一個(gè)階段都是以他們?cè)赑OM聲明的順序執(zhí)行,但不支持相同插件的多個(gè)實(shí)例。但是,相同插件的多個(gè)實(shí)例在Maven 2.0.11以上可以被分組排序后共同執(zhí)行)
以前綴詞命名的階段(PRe-*,post-*,或process-*)通常不是從命令行直接調(diào)用。這些階段安排生成順序,生成不被生成過程外所用的中間結(jié)果。如在調(diào)用integration-test的情況下,環(huán)境可能以掛起狀態(tài)終止。 代碼覆蓋工具如Jacoco和執(zhí)行容器插件如Tomcat,Cargo,Docker綁定目標(biāo)至pre-integration-test階段以準(zhǔn)備集成測(cè)試容器環(huán)境。這些插件也綁定目標(biāo)至post-integration-test以收集覆蓋統(tǒng)計(jì)結(jié)果或使用完畢的集成測(cè)試容器。 故障和代碼覆蓋插件綁定目標(biāo)在integration-test和verify階段。最終結(jié)果測(cè)試和覆蓋報(bào)告在verify階段后可用。如果從命令行調(diào)用integration-test,則不生成報(bào)告。更糟糕的是,集成測(cè)試容器的環(huán)境會(huì)以掛起狀態(tài)終止;Tomcat網(wǎng)絡(luò)服務(wù)器或Docker實(shí)例會(huì)終止運(yùn)行,而Maven可能不會(huì)自行終止。
生成生命周期的使用較為簡單,但是當(dāng)制作一個(gè)Maven生成項(xiàng)目時(shí),該如何分配任務(wù)的各個(gè)生成階段?
最常見的方式,是通過有同樣命名的POM元素<packaging>來設(shè)置封包。一些有效的封包方式有jar,war,ear和pom。如果沒有指定封包格式,它將默認(rèn)為JAR。 每個(gè)封包包含著一系列目標(biāo)以綁定一個(gè)階段。如,jar封包將綁定如下目標(biāo)至默認(rèn)生命周期中的生成階段
| 生成階段 | 目標(biāo) |
|---|---|
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 |
這是一個(gè)近乎標(biāo)準(zhǔn)的綁定設(shè)置;然而,一些封包采用不同方式處理。例如,一個(gè)項(xiàng)目,是純粹的元數(shù)據(jù)(封包方式是POM)只綁定目標(biāo)至install和deploy階段(因?yàn)橐粋€(gè)完整的目標(biāo)-生成階段清單已經(jīng)綁定了一些封包類型、參見生命周期參考)。 值得注意的是為了使一些封包類型可用,您可能還需要在POM中的<build>模塊包含特定插件,并且為該插件制定<extensions>true</extensions>。需求這個(gè)的一個(gè)插件例子是Plexus插件,它提供了一個(gè)plexus-application和plexus-service封包。
第二種將目標(biāo)添加到階段的方法是在項(xiàng)目中配置插件。插件是為Maven提供目標(biāo)的元件。此外,插件可能有一個(gè)或多個(gè)目標(biāo),其中每個(gè)目標(biāo)代表插件的一個(gè)功能。例如,編譯器插件有兩個(gè)目標(biāo):compile和testcompile。前者編譯主要代碼的源碼,而后者編譯測(cè)試代碼的源碼。 正如您將在后面的部分看到的,插件可以包含可綁定目標(biāo)的生命周期階段的指示信息。請(qǐng)注意,僅添加插件本身是信息不足的-您還必須指定作為你的生成中想運(yùn)行的目標(biāo)。 被配置的目標(biāo)將被添加到從在封包選擇時(shí)已綁定至生命周期的目標(biāo)中。如果有多個(gè)目標(biāo)綁定到一個(gè)特定的階段,執(zhí)行的順序是首先是封包中的目標(biāo),其次是配置在POM中的目標(biāo)。請(qǐng)注意,您可以使用<executions>元素以獲得對(duì)特定目標(biāo)順序的更多控制權(quán)。 例如,Modello插件默認(rèn)綁定目標(biāo)modello:java至generate-sources階段(注:modello:java目標(biāo)生成Java源碼)。所以為使用Modello插件和用它從模型生成源碼并將其包含入生成之中,你需要將以下部分添加至POM里<build>中的<plugins>階段:
你也許困惑為何<execution>元素在那里。這是因?yàn)橥ㄟ^這樣才能用不同配置運(yùn)行多次相同目標(biāo)。拆分的執(zhí)行也可以被給予一個(gè)ID,以便在繼承或應(yīng)用概況中,您可以控制目標(biāo)設(shè)置是否合并或產(chǎn)生額外的執(zhí)行。 當(dāng)有多個(gè)屬于同一階段的執(zhí)行時(shí),他們將按POM中指定的順序執(zhí)行,被繼承的執(zhí)行優(yōu)先運(yùn)行。 以modello:java為例,它只在generate-sources階段有效。但是一些目標(biāo)可以在多個(gè)階段使用,并且可能沒有一個(gè)明確的默認(rèn)設(shè)置。對(duì)于這些目標(biāo),你可以自行指定階段。例如,假設(shè)你有一個(gè)目標(biāo)display:time,它會(huì)將當(dāng)前時(shí)間反饋到命令行,如果你想要它運(yùn)行在process-test-resources階段以表明當(dāng)測(cè)試開始的時(shí)間。這將配置如下:
以下列出了default、clean和site生命周期的所有生成階段,他們按照給定的點(diǎn)順序執(zhí)行。 Clean生命周期
| 階段 | 說明 |
|---|---|
pre-clean | 在實(shí)際項(xiàng)目清理之前執(zhí)行所需的過程 |
clean | 刪除之前生成的所有文件 |
post-clean | 執(zhí)行完成項(xiàng)目清理所需的過程 |
Default生命周期
| 階段 | 說明 |
|---|---|
validate | 驗(yàn)證項(xiàng)目是否正確,所有必要的信息是否可用 |
initialize | 初始化生成狀態(tài),例如設(shè)置屬性或創(chuàng)建目錄 |
generate-sources | 為編譯引用生成所有源代碼 |
process-sources | 處理源代碼,例如過濾某些值 |
generate-resources | 為包中的引用生成資源 |
process-resources | 將資源復(fù)制至目標(biāo)地址并處理,以備打包 |
compile | 編譯工程源代碼 |
process-classes | 編譯過程后處理生成文件,例如對(duì)Java類做字節(jié)碼增強(qiáng) |
generate-test-sources | 為編譯引用生成測(cè)試源代碼 |
process-test-sources | 處理測(cè)試源代碼,例如過濾某些值 |
generate-test-resources | 為測(cè)試生成資源 |
process-test-resources | 復(fù)制資源至測(cè)試目標(biāo)目錄并處理 |
test-compile | 編譯測(cè)試源代碼至測(cè)試目標(biāo)目錄 |
process-test-classes | 測(cè)試編譯過程后處理生成文件,例如對(duì)Java類做字節(jié)碼增強(qiáng)。需要Maven 2.0.5以上 |
test | 使用合適的單元測(cè)試框架運(yùn)行測(cè)試,這些測(cè)試不應(yīng)當(dāng)要求代碼已打包或已部署 |
prepare-package | 在實(shí)際封包前執(zhí)行所有必要的準(zhǔn)備工作,這經(jīng)常產(chǎn)生原包的未打包、已加工版本(需要Maven 2.1及以上) |
pre-integration-test | 在集成測(cè)試前執(zhí)行所需操作,這也許會(huì)涉及設(shè)置需求環(huán)境等操作 |
integration-test | 處理并且部署(如果需要)包至集成測(cè)試可運(yùn)行的環(huán)境 |
post-integration-test | 在集成測(cè)試后執(zhí)行所需操作,這可能包括清理環(huán)境 |
verify | 運(yùn)行檢查以確保包可用并且達(dá)到質(zhì)量標(biāo)準(zhǔn) |
install | 將包安裝至本地資源庫中,使得其他工程可將其作為本地依賴項(xiàng)使用 |
deploy | 在集成或發(fā)布環(huán)境中完成,將最終包復(fù)制到遠(yuǎn)程存儲(chǔ)庫,以便與其他開發(fā)人員和項(xiàng)目共享 |
Site生命周期
| 階段 | 說明 |
|---|---|
pre-site | 在實(shí)際項(xiàng)目站點(diǎn)生成之前執(zhí)行所需的過程 |
site | 生成項(xiàng)目的站點(diǎn)文件 |
post-site | 執(zhí)行完成網(wǎng)站生成所需的流程,并為網(wǎng)站部署做準(zhǔn)備 |
site-deploy | 將生成的站點(diǎn)文檔部署到指定的web服務(wù)器 |
有些階段有默認(rèn)與其綁定的目標(biāo)。對(duì)于默認(rèn)生命周期,這些綁定取決于封包值。以下是指向生成階段目標(biāo)的綁定情況。 clean生命周期綁定
| 生命周期 | 目標(biāo) |
|---|---|
clean | clean:clean |
default生命周期綁定 - 封包格式ejb / ejb3 / jar / par / rar / war
| 生命周期 | 目標(biāo) |
|---|---|
process-resources | resources:resources |
compile | compiler:compile |
process-test-resources | resources:testResources |
test-compile | compiler:testCompile |
test | surefire:test |
package | ejb:ejb or ejb3:ejb3 or jar:jar or par:par or rar:rar or war:war |
install | install:install |
deploy | deploy:deploy |
default生命周期綁定 - 封包格式ear
| 生命周期 | 目標(biāo) |
|---|---|
generate-resources | ear:generate-application-xml |
process-resources | resources:resources |
package | ear:ear |
install | install:install |
deploy | deploy:deploy |
default生命周期綁定 - 封包格式maven-plugin
| 生命周期 | 目標(biāo) |
|---|---|
generate-resources | plugin:descriptor |
process-resources | resources:resources |
compile | compiler:compile |
process-test-resources | resources:testResources |
test-compile | compiler:testCompile |
test | surefire:test |
package | jar:jar and plugin:addPluginArtifactMetadata |
install | install:install |
deploy | deploy:deploy |
default生命周期綁定 - 封包格式pom
| 生命周期 | 目標(biāo) |
|---|---|
package | site:attach-descriptor |
install | install:install |
deploy | deploy:deploy |
site生命周期綁定
| 生命周期 | 目標(biāo) |
|---|---|
site | site:site |
site-deploy | site:deploy |
參考 所有Maven生命周期是定義在maven-core模塊的components.xml文件中,參考相關(guān)文件。 在Maven 2.x版本,默認(rèn)生命周期的綁定被列入components.xml但在Maven 3.x版本中,他們是在一個(gè)單獨(dú)的default-bindings.xml中所定義。 查看生命周期參考和默認(rèn)生命周期下的插件綁定以直接從源代碼中獲得最新的文檔。
新聞熱點(diǎn)
疑難解答
圖片精選