建構生命週期


使用 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


有關建構生命週期,你可以再參考這篇文章: