2.構建生命周期
1)簡介與打包相關生命周期
一個構建生命周期是一組精心組織的有序的階段,它的存在能使所有注冊的目標變得有序運行。這些目標根據(jù)項目的打包類型被選擇并綁定。Maven中有三種標準的生命周期:清理(clean),默認(default)(有時候也稱為構建),和站點(site)
默認的整個過程,生命周期階段與描述如下:
validate 驗證項目是否正確,以及所有為了完整構建必要的信息是否可用
generate-sources 生成所有需要包含在編譯過程中的源代碼
process-sources 處理源代碼,比如過濾一些值
generate-resources 生成所有需要包含在打包過程中的資源文件
process-resources 復制并處理資源文件至目標目錄,準備打包
compile 編譯項目的源代碼
process-classes 后處理編譯生成的文件,例如對Java類進行字節(jié)碼增強(bytecode enhancement)
generate-test-sources 生成所有包含在測試編譯過程中的測試源碼
process-test-sources 處理測試源碼,比如過濾一些值
generate-test-resources 生成測試需要的資源文件
process-test-resources 復制并處理測試資源文件至測試目標目錄
test-compile 編譯測試源碼至測試目標目錄
test 使用合適的單元測試框架運行測試。這些測試應該不需要代碼被打包或發(fā)布
prepare-package 在真正的打包之前,執(zhí)行一些準備打包必要的操作。這通常會產生一個包的展開的處理過的版本
package 將編譯好的代碼打包成可分發(fā)的格式,如JAR,WAR,或者EAR
pre-integration-test 執(zhí)行一些在集成測試運行之前需要的動作。如建立集成測試需要的環(huán)境
integration-test 如果有必要的話,處理包并發(fā)布至集成測試可以運行的環(huán)境
post-integration-test 執(zhí)行一些在集成測試運行之后需要的動作。如清理集成測試環(huán)境。
verify 執(zhí)行所有檢查,驗證包是有效的,符合質量規(guī)范
install 安裝包至本地倉庫,以備本地的其它項目作為依賴使用
deploy 復制最終的包至遠程倉庫,共享給其它開發(fā)人員和項目(通常和一次正式的發(fā)布相關)
打包相關生命周期有所差異,在打包階段會根據(jù)packing走不同的插件目標。
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生命周期階段和目標
package? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?site:attach-descriptor
install? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?install:install
deploy? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? deploy:deploy
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, plugin:addPluginArtifactMetadata
install? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? install:install, plugin:updateRegistry
deploy? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?deploy:deploy
EJB生命周期階段和目標
process-resources? ? ? ? ? ? ? ? resources:resources
compile? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?compiler:compile
process-test-resources? ? ? ? ?resources:testResources
test-compile? ? ? ? ? ? ? ? ? ? ? ? ? compiler:testCompile
test? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? surefire:test
package? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?ejb:ejb
install? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?install:install
deploy? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? deploy:deploy
WAR生命周期階段和目標
process-resources? ? ? ? ? ? ? ? ?resources:resources
compile? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? compiler:compile
process-test-resources? ? ? ? ? resources:testResources
test-compile? ? ? ? ? ? ? ? ? ? ? ? ? ?compiler:testCompile
test? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?surefire:test
package? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?war:war
install? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?install:install
deploy? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? deploy:deploy
EAR生命周期階段和目標
generate-resources? ? ? ? ? ? ? ?ear:generate-application-xml
process-resources? ? ? ? ? ? ? ? resources:resources
package? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ear:ear
install? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? install:install
deploy? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?deploy:deploy
2)通用生命周期目標
[1] resources替換
替換屬性,有src/main/resources/service.xml,屬性值在src/main/filters/default.properties中定義,此屬性可以在不同的位置定義,并且可以針對不同環(huán)境替換不同的值。最終過濾資源替換屬性。將properties中的值替換到xml中。filter需要為true,以為你默認是不過濾的



資源列表默認的在src/main/resources,如果你有需求,則可以定義多個。

[2] compile
可以為插件設置source和target版本,源碼遵循版本和目標版本。同時也可以設置源碼位置和目標位置,但實際最好不要這么做,最好的方式是遵循大部分的約定。

[3]?Test Compile
test-compile階段基本上和compile階段一致。唯一的不同是會調用compile:testCompile編譯測試源代碼目錄至測試構建構建輸出目錄。如果你沒有在超級POM中自定義默認目錄,compile:testCompile將會編譯src/test/java中的源碼至target/test-classes目錄。類似源代碼目錄,如果你想要自定義測試源碼目錄和測試編譯輸出目錄的位置,你可以覆蓋testSourceDirectory和testOutputDirectory。
[4]?Test Compile
大部分生命周期綁定Surefire插件的test目標至test階段。Surefire插件是Maven的單元測試插件,Surefire默認的行為是尋找測試源碼目錄下所有以*Test結尾的類,以JUnit測試的形式運行它們。Surefire插件也可以配置成運行TestNG單元測試。
運行過mvn test之后,你應該注意到Surefire在target/surefire-reports目錄生成了許多報告。該目錄內每個Surefire插件運行過的測試都會有相關的兩個文件:一個是包含測試運行信息的XML文檔,另一個是包含單元測試輸出的文本文件。如果測試階段有問題,單元測試失敗了,你可以使用Maven的輸出以及該目錄下的內容來追查測試失敗的原因。在站點生成的時候,surefire-reports/目錄的內容會被用來創(chuàng)建報告,使項目所有單元測試的總體情況清晰明了。
如果你工作的項目有一些失敗的單元測試,同時你想讓項目生成輸出,你需要配置Surefire插件在遇到失敗的情況下繼續(xù)一個構建。當遇到單元測試失敗的時候,默認行為是停止構建。要覆蓋這種行為,你需要設置Surefire插件的testFailureIgnore配置屬性為true。

如果你想要整個的跳過測試,你可以運行如下的命令:$ mvn install -Dmaven.test.skip=true
maven.test.skip變量同時控制Compiler和Surefire插件,如果你傳入maven.test.skip,就等于告訴Maven整個的跳過測試。
[5]?Test Compile
Install插件的install目標基本上都是綁定到install生命周期階段。install:install目標只不過是將項目的主要構件安裝到本地倉庫。
[6]?Deploy
Deploy插件的deploy目標通常綁定到deploy生命周期階段。該階段用來將一個構件部署到遠程Maven倉庫,當你執(zhí)行一次發(fā)布的時候通常需要更新遠程倉庫。