在 使用 Maven 中略為提到了建構生命週期(Build lifecycle)。在Ant中,你可以有自訂建構過程的彈性,哪個目標要相依在哪個目標上,該目標有相依於另一個目標,這些都可以自行定義。在Maven中,則明確定義了專案建構的過程。
在Maven中,有三個內建的建構生命週期:Default、Clean與Site。Default處理專案部署,Clean處理專案資源清除,Site處理專案文件。
每個建構生命週期中會再分為數個階段(Phase),階段就好似Ant中的目標(Target),代表著建構生命週期中的一個步驟,只不過在Maven中,階段與階段間的順序是明確定義的,以Default建構生命週期來說,當中有著以下的階段順序(完整順序可參考 Lifecycle Reference):
- validate:驗證專案正確性以及所有必要資訊已備妥。
- compil:編譯專案原始碼。
- test:進行單元測試。
- package:將相關檔案進行封裝,例如產生JAR檔案。
- integration-test:進行整合測試。
- verify:驗證檔案封裝是否正確。
- install:將封裝的檔案安裝至本地貯藏室(Local repository)。
- deploy:部署檔案。
每個階段可以使用mvn指令搭配階段名稱呼叫,這些階段必須按照順序進行,例如在 使用 Maven 你就看過,如果你執行了:
mvn package
那麼也會先進行validate、compile、test等階段,再執行package階段,所以如果想完成以上所有階段,就是執行:
mvn deploy
你可以指定執行多個階段,例如:
mvn clean package
在上面,會先執行clean(與先前必要的階段),而後再執行package(與先前必要的階段)。
實際上,比階段還細的是目的(Goal),階段是相關特定目的組合而成。例如Default週期中各階段可能的目的有:
- 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
你可以在階段與階段間指定目的,例如:
mvn clean dependency:copy-dependencies package
在上例中,clean與package兩個階段間指定了目的dependency:copy-dependencies,這會將相關的程式複製至target/dependency資料夾中。
先列出一些常用的階段與目的指令如下:
- mvn compile
編譯專案
- mvn clean
清除專案
- mvn dependency:copy-dependencies
將相依程式庫(JAR)複製至target/dependency目錄
- mvn package
包裝專案為JAR,放在target目錄
- mvn exec:java -Dexec.mainClass=packageName.className
指定主類別執行程式
- mvn dependency:purge-local-repository
刪除已下載的plugin並重新下載plugin
- mvn install
將專案產生的JAR檔,安裝至本地貯藏室。如果想將其它位置JAR檔安裝至本地貯藏室,可以如下:
mvn install:install-file
-Dfile=/exampleDir/lib/example.jar
-DgroupId=cc.openhome
-DartifactId=example
-Dversion=1.0.0
-Dpackaging=jar
mvn install:install-file
-Dfile=/exampleDir/lib/example.jar
-DgroupId=cc.openhome
-DartifactId=example
-Dversion=1.0.0
-Dpackaging=jar
有關建構生命週期,你可以再參考這篇文章: