mvn clean -U -e -B -X的作用
在持續整合伺服器上使用怎樣的 mvn 命令整合專案,這個問題乍一看答案很顯然,不就是 mvn clean install 麼?事實上比較好的整合命令會稍微複雜些,下面是一些總結:
-
不要忘了clean: clean能夠保證上一次構建的輸出不會影響到本次構建。
-
使用deploy而不是install: 構建的SNAPSHOT輸出應當被自動部署到私有Maven倉庫供他人使用,這一點在前面已經詳細論述。
-
使用-U引數: 該引數能強制讓Maven檢查所有SNAPSHOT依賴更新,確保整合基於最新的狀態,如果沒有該引數,Maven預設以天為單位檢查更新,而持續整合的頻率應該比這高很多。
-
使用-e引數:如果構建出現異常,該引數能讓Maven列印完整的stack trace,以方便分析錯誤原因。
-
使用-Dmaven.repo.local引數:如果持續整合伺服器有很多工,每個任務都會使用本地倉庫,下載依賴至本地倉庫,為了避免這種多執行緒使用本地倉庫可能會引起的衝突,可以使用-Dmaven.repo.local=/home/juven/ci/foo-repo/這樣的引數為每個任務分配本地倉庫。
-
使用-B引數:該引數表示讓Maven使用批處理模式構建專案,能夠避免一些需要人工參與互動而造成的掛起狀態。
-
使用-X引數:開啟DEBUG模式。
綜上,持續整合伺服器上的整合命令應該為 mvn clean deploy -B -e -U -Dmaven.repo.local=xxx 。此外,定期清理持續整合伺服器的本地Maven倉庫也是個很好的習慣,這樣可以避免浪費磁碟資源,幾乎所有的持續整合伺服器軟體都支援本地的指令碼任務,你可以寫一行簡單的shell或bat指令碼,然後配置以天為單位自動清理倉庫。需要注意的是,這麼做的前提是你有私有Maven倉庫,否則每次都從Internet下載所有依賴會是一場噩夢。
mvn clean install
生命週期階段 描述
validate | 驗證專案是否正確,以及所有為了完整構建必要的資訊是否可用 |
generate-sources | 生成所有需要包含在編譯過程中的原始碼 |
process-sources | 處理原始碼,比如過濾一些值 |
generate-resources | 生成所有需要包含在打包過程中的資原始檔 |
process-resources | 複製並處理資原始檔至目標目錄,準備打包 |
compile | 編譯專案的原始碼 |
process-classes | 後處理編譯生成的檔案,例如對Java類進行位元組碼增強(bytecode enhancement) |
generate-test-sources | 生成所有包含在測試編譯過程中的測試原始碼 |
process-test-sources | 處理測試原始碼,比如過濾一些值 |
generate-test-resources | 生成測試需要的資原始檔 |
process-test-resources | 複製並處理測試資原始檔至測試目標目錄 |
test-compile | 編譯測試原始碼至測試目標目錄 |
test | 使用合適的單元測試框架執行測試。這些測試應該不需要程式碼被打包或釋出 |
prepare-package | 在真正的打包之前,執行一些準備打包必要的操作。這通常會產生一個包的展開的處理過的版本(將會在Maven 2.1+中實現) |
package | 將編譯好的程式碼打包成可分發的格式,如JAR,WAR,或者EAR |
pre-integration-test | 執行一些在整合測試執行之前需要的動作。如建立整合測試需要的環境 |
integration-test | 如果有必要的話,處理包併發布至整合測試可以執行的環境 |
post-integration-test | 執行一些在整合測試執行之後需要的動作。如清理整合測試環境。 |
verify | 執行所有檢查,驗證包是有效的,符合質量規範 |
install | 安裝包至本地倉庫,以備本地的其它專案作為依賴使用 |
deploy | 複製最終的包至遠端倉庫,共享給其它開發人員和專案(通常和一次正式的釋出相關) |
mvn jar: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打包預設的目標
生命週期階段 目標
package | site:attach-descriptor |
install | install:install |
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 |
Maven提供了對EJB 2和3的支援。必須配置EJB外掛來為EJB3指定打包型別,否則該外掛預設認為EJB為2.1,並尋找某些EJB配置檔案是否存在。
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 |
注意war:war
外掛需要一個web.xml
配置檔案在專案的src/main/webapp/WEB-INF
目錄中。
EAR打包預設的目標 生命週期階段 目標
generate-resources | ear:generate-application-xml |
process-resources | resources:resources |
package | ear:ear |
install | install:install |
deploy | deploy:deploy |