236
阿裏雲
技術社區[雲棲]
《Mavan官方文檔》構建生命周期介紹
構建生命周期基礎
Maven是以構建生命周期這個核心概念為基礎。構建生命周期是指為一個工程進行項目構建和分發的過程。
為了構建一個工程,有必要去學習一係列構建Maven項目的命令,並且POM文件會確保他們能夠得到想要的結果。
Maven中內置了三個構建生命周期:default,clean和site。default生命周期處理工程的部署,clean生命周期處理工程的清理,而site生命周期則負責創建工程的站點文檔。
構建生命周期是由階段組成的
三個構建生命周期都是由一係列不同的構建階段組成,每一個構建階段代表了生命周期的一個階段。
例如:default生命周期是由以下的階段組成(查看完整的生命周期階段列表,請參考生命周期參考):
- validate – 驗證該項目是否正確,所有必要的信息都是可用的
- compile – 編譯工程源碼
- test – 使用一個合適的單元測試框架測試編譯的源代碼。這些測試的代碼不會被打包或部署到項目中
- package – 將編譯的代碼打包成它發布的格式,例如JAR
- integration-test – 如果必要的話,該命令會將工程處理並部署在一個集成測試運行的環境中
- verify – 運行任何檢查以驗證該包是否有效,是否符合質量標準
- install – 將工程打包安裝到本地倉庫中,以便本地其他項目可以進行依賴
- deploy – 在集成或發布環境中,將最終工程打包複製到遠程倉庫中,用於與其他開發人員和項目共享
這些生命周期階段(包括那些這裏沒有展示的其他生命周期階段)會順序地執行來完成默認的生命周期。上述的生命周期階段,意味著當你使用默認的生命周期時,Maven將首先驗證項目,然後將編譯源代碼,運行那些單元測試,再打包二進製文件(例如:jar),然後再對包文件進行集成測試,再校驗包文件,並將已經校驗的包文件安裝到本地倉庫,然後在指定的環境中部署包。
要做到所有這些,你隻需要調用最後一個生命階段來執行,在這種情況下進行部署:
這是因為如果你調用了一個生命階段,它不僅執行指定的構建階段,而且會執行指定構建階段之前的每一個階段。因此,執行
將會先執行該階段之前的每一個階段(validate, compile, package等)。
生命周期中包含了許多命令,這些將要在接下來的部分進行討論。
需要指出的是同樣的命令可以用在多模塊的情況下(即包含一個或多個子項目的工程)。例如:
這個命令將會遍曆所有的子項目,並且運行clean命令,然後運行install命令(包含所有之前步驟的命令)
構建階段是由插件目標組成的
即便構建階段在生命周期中是一個特定的步驟,但是它實現這些功能的方式也可能會有所不同。這些功能是通過聲明插件目標並且綁定到具體的構建階段來實現的。
一個插件目標代表了一個特定的任務(比構建階段更加貼切),這個任務有助於項目的建立和管理。它可能被綁定到零個或多個構建階段。一個目標沒有被綁定到任何構建階段,可以通過直接調用來執行這個構建生命周期以外的目標。執行的順序取決於目標和構建階段的順序。例如以下的這個命令:clean和package的參數是構建階段,而dependency:copy-dependencies是一個插件目標。
1 |
mvn clean dependency:copy-dependencies package |
如果這個命令被執行,clean階段將首先執行(這意味著它將運行所有的clean生命周期前的階段,包括clean階段自身),然後在執行package階段之前(及其前建立默認的生命周期階段),將執行dependency:copy-dependencies目標。
如果一個目標被綁定到一個或多個構建階段,這個目標將會被這些階段所調用。
此外,構建階段也可以綁定零個或更多的目標。如果構建階段沒有綁定目標,則該構建階段將不執行。但如果它有一個或多個目標,它將執行所有這些綁定的目標(注:在Maven2.0.5及以上版本,多目標綁定到一個階段是按照POM文件中定義的順序進行執行,但是相同插件不支持多個實例。在Maven2.0.11及以上版本,相同插件的多個實例被劃分成一個組,統一並有序地執行)。
使用構建生命周期來設置項目
構建生命周期的使用足夠簡單,但是當你為一個項目進行Maven構建時,你如何分配每個構建階段的任務呢?
包
第一,也是最常見的方式,就是通過相同名稱的POM元素來為你的項目設置包。一些有效的包的值如下:jar,war, ear和pom。如果沒有指定包的值,它將默認為jar包。
每一次打包都包含一係列綁定了特殊階段的目標。例如,打jar包將綁定以下目標,來構建默認生命周期中的各個階段。
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 |
這是一個幾乎標準的綁定設置;然而,一些包的處理方式有所不同。例如,一個項目,是純粹的元數據(包的值是POM),它僅僅綁定了install和deploy階段(獲取一個完整的打包類型的目標構建清單,請參考生命周期參考)。
值得注意的是,一些包類型即便可用,您可能還需要在你的POM文件中的build部分引入一個特殊的插件並且為那個插件定義true。舉個例子,每個插件都需要引入Plexus這個插件,它提供了plexus-application和plexus-service包。
插件
向構建階段加入目標的第二種方式是在你的項目中配置插件。插件就是向Maven提供目標的構建。此外,一個插件可能會有一個至多個的目標,插件中的每一個目標都代表了插件的一個功能。例如:編譯插件擁有兩個目標:compile和testCompile目標。前者會編譯你的功能代碼,而後者則會編譯測試代碼。
正如你將要在後麵部分看到的那樣,插件會包含一些顯示目標具體綁定到哪個生命周期階段的信息。注意,隻添加一個插件自身的信息是不夠的,你必須同時定義你想要運行的目標來做為你插件的一部分。
已經配置的目標將會被添加到已經綁定了包的生命周期的目標上去。如果有超過一個目標綁定到一個特殊的階段,包中配置的目標將會被優先執行,然後再執行POM中配置的目標。注意,你可以使用元素來控製特殊目標的順序。
例如,Modello插件默認將它的目標modello:java綁定到了generate-sources階段(注:modello:java目標用於生成java源代碼)。所以當使用Modello插件並想讓它集成到一個構建階段中來生成一個模塊的代碼時,你需要將下列代碼添加到你POM文件元素下的中:
03 |
<groupId>org.codehaus.modello</groupId>
|
04 |
<artifactId>modello-maven-plugin</artifactId>
|
05 |
<version>1.8.1</version>
|
10 |
<model>src/main/mdo/maven.mdo</model>
|
12 |
<version>4.0.0</version>
|
13 |
</configuration>
|
15 |
<goal>java</goal>
|
你也許會疑惑為什麼元素會放在這。那是為了讓你能夠在需要時多次運行不同配置的同一目標。也可以通過設置一個ID來實現單獨運行,以便於不管是目標配置被分割還是進入一個額外的排除,你都能夠控製繼承或者應用程序的配置。
當設置的多個排除匹配同一個特殊階段時,他們按照POM文件中定義的順序執行,繼承的排除設置優先執行。
現在,在modello:java這種情況下,它僅僅在generate-sources階段起作用。但是許多目標能夠在多個階段中使用,而且他們沒有一個明確的默認值。對於這些,你可以自定義階段。比如說,你有一個目標display:time,它能夠將當前的時間回顯在命令行中,你想在開始測試時,讓它在process-test-resources階段運行,去顯示當前時間。這就應該像這樣配置:
03 |
<groupId>com.mycompany.example</groupId>
|
04 |
<artifactId>display-maven-plugin</artifactId>
|
05 |
<version>1.0</version>
|
08 |
<phase>process-test-resources</phase>
|
10 |
<goal>time</goal>
|
生命周期參考
下麵的列表就是default,clean和site生命周期中的所有構建階段,他們將會按照他們定義的順序去執行。
Clean生命周期
pre-clean |
執行一些清理前需要完成的工作 |
clean |
清理上一次構建生成的文件 |
post-clean |
執行一些清理後需要完成的工作 |
Default生命周期
validate |
校驗項目是否正確以及所有重要信息是否可用 |
initialize |
初始化構建狀態,例如:設置屬性或者創建目錄 |
generate-sources |
生成編譯中包含的源代碼 |
process-sources |
處理項目資源文件,例如過濾一些值 |
generate-resources |
生成包中包含的資源 |
process-resources |
複製並處理資源到目標目錄,準備打包 |
compile |
編譯項目中的源代碼 |
process-classes |
後處理編譯生成的文件,例如:對class文件進行字節碼增強 |
generate-test-sources |
生成編譯中包含的測試源碼 |
process-test-sources |
處理測試源代碼,例如:過濾一些值 |
generate-test-resources |
創建測試用的資源文件 |
process-test-resources |
複製並處理資源到目標測試目錄 |
test-compile |
編譯測試源碼放入測試目標文件夾中 |
process-test-classes |
後處理測試編譯生成的文件,例如:對class文件進行字節碼增強,對Maven 2.0.5及以上有效 |
test |
使用單元測試框架運行測試。測試代碼不會被打包或者部署。 |
prepare-package |
執行必要的操作,在真正打包前準備一個包。這通常會產生一個未打包、處理過版本。(Maven 2.1及以上) |
package |
接受編譯好的代碼,打包成可發布的格式,如:JAR |
pre-integration-test |
在集成測試執行前進行些必要的操作。這也許會涉及相關的東西,例如安裝必須的環境。 |
integration-test |
處理並將包文件部署到繼承測試運行的環境 |
post-integration-test |
繼承測試執行之後進行的必要操作。這可能包含了清理環境操作。 |
verify |
運行一些校驗去驗證包是否有效,是否符合質量標準。 |
install |
安裝包到本地倉庫,供本地其他項目依賴使用 |
deploy |
將最終的包複製到遠程倉庫,供其他開發人員和Maven項目使用 |
Site生命周期
pre-site |
執行一些在生成站點之前需要完成的工作 |
site |
生成項目的站點文檔 |
post-site |
執行一些在生成站點之後需要完成的工作 |
site-deploy |
將生成的站點文件發布到遠程服務器上 |
<h1>內置的生命周期綁定</h1>
許多階段都默認綁定了一些目標。對默認生命周期來說,這些綁定依賴包的值,一下就是一些目標和構建階段的綁定。
Clean生命周期綁定
Default生命周期綁定 – 包 ejb / ejb3 / jar / par / rar / war
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
generate-resources |
ear:generate-application-xml |
process-resources |
resources:resources |
package |
ear:ear |
install |
install:install |
deploy |
deploy:deploy |
Default生命周期綁定 – 包 maven-plugin
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
package |
site:attach-descriptor |
install |
install:install |
deploy |
deploy:deploy |
Site生命周期綁定
site |
site:site |
site-deploy |
site:deploy |
參考
全部的Maven生命周期是由maven-core模塊的components.xml文件定義的,可以參考associated documentation
在Maven 2.x中,默認生命周期綁定被包含在components.xml中,但在Maven 3.x中,他們被單獨定義在default-bindings.xml描述文件中。
您可以直接從源碼生成的最新文檔中查看生命周期參考 和 默認生命周期插件綁定參考。
轉載自 並發編程網 - ifeve.com
最後更新:2017-05-19 16:02:17