Maven 構建生命週期


構建生命週期是什麼?

構建生命週期階段的目標是執行順序是一個良好定義的序列。
這裡使用一個例子,一個典型的 Maven 構建生命週期是由下列順序的階段:

階段 處理 描述
準備資源 資源複製 資源複製可以進行客製化
編譯 執行編譯 原始碼編譯在此階段完成
包裝 打包 建立JAR/WAR包如在 pom.xml 中定義提及的包
安裝 安裝 這一階段在本地/遠端Maven倉庫安裝程式包

可用於註冊必須執行一個特定的階段之前或之後的目標,有之前處理和之後階段。
當 Maven 開始建立一個專案,它通過定義序列階段步驟和執行註冊的每個階段的目標。 Maven有以下三種標準的生命週期:

  • clean

  • default(或 build)

  • site

目標代表一個特定的任務,它有助於專案的建設和管理。可以被系結到零個或多個生成階段。一個沒有系結到任何構建階段的目標,它的構建生命週期可以直接呼叫執行
執行的順序取決於目標和構建階段折呼叫順序。例如,考慮下面的命令。清理和打包(mvn clean)引數的構建階段,而 dependency:copy-dependencies package 是一個目標。

mvn clean dependency:copy-dependencies package

在這裡,清潔的階段,將首先執行,然後是依賴關係:複製依賴性的目標將被執行,並終於將執行包階段。

清潔生命週期

當我們執行命令 mvn clean 命令後,Maven 呼叫清潔的生命周期由以下幾個階段組成:

  • pre-clean

  • clean

  • post-clean

Maven 清潔目標(clean:clean)被系結清潔乾淨的生命週期階段。clean:clean 目標刪除 build 目錄下的構建輸出。因此,當 mvn clean 命令執行時,Maven會刪除編譯目錄。

目標清潔生命週期在上述階段,我們可以自定義此行為。
在下面的範例中,我們將附加 maven-antrun-plugin:run 對目標進行預清潔,清潔和清潔後這三個階段。這將使我們能夠呼叫的資訊顯示清理生命週期的各個階段。
現在來建立了一個 pom.xml 檔案在 C:\MVN\ 專案檔案夾中,具體內容如下:

<project xmlns="http://maven.apache.org/POM/4.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.projectgroup</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<build>
<plugins>
   <plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-antrun-plugin</artifactId>
   <version>1.1</version>
   <executions>
      <execution>
         <id>id.pre-clean</id>
         <phase>pre-clean</phase>
         <goals>
            <goal>run</goal>
         </goals>
         <configuration>
            <tasks>
               <echo>pre-clean phase</echo>
            </tasks>
         </configuration>
      </execution>
      <execution>
         <id>id.clean</id>
         <phase>clean</phase>
         <goals>
          <goal>run</goal>
         </goals>
         <configuration>
            <tasks>
               <echo>clean phase</echo>
            </tasks>
         </configuration>
      </execution>
      <execution>
         <id>id.post-clean</id>
         <phase>post-clean</phase>
         <goals>
            <goal>run</goal>
         </goals>
         <configuration>
            <tasks>
               <echo>post-clean phase</echo>
            </tasks>
         </configuration>
      </execution>
   </executions>
   </plugin>
</plugins>
</build>
</project>

現在,開啟命令控制台,到該檔案夾包含  pom.xml 並執行以下 mvn 命令。

C:\MVN\project>mvn post-clean

Maven將開始處理並顯示清理生命週期的所有階段。

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------
[INFO] Building Unnamed - com.companyname.projectgroup:project:jar:1.0
[INFO]    task-segment: [post-clean]
[INFO] ------------------------------------------------------------------
[INFO] [antrun:run {execution: id.pre-clean}]
[INFO] Executing tasks
     [echo] pre-clean phase
[INFO] Executed tasks
[INFO] [clean:clean {execution: default-clean}]
[INFO] [antrun:run {execution: id.clean}]
[INFO] Executing tasks
     [echo] clean phase
[INFO] Executed tasks
[INFO] [antrun:run {execution: id.post-clean}]
[INFO] Executing tasks
     [echo] post-clean phase
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------
[INFO] Total time: < 1 second
[INFO] Finished at: Sat Jul 07 13:38:59 IST 2012
[INFO] Final Memory: 4M/44M
[INFO] ------------------------------------------------------------------

你可以嘗試調整 mvn 清潔命令,該命令將顯示清潔什麼都不會被執行。

預設(或生成)生命週期

這是 Maven 主要的生命週期,用於構建應用程式。它有以下 23 個階段。

生命週期階段 描述
validate 驗證專案是否正確,並且所有必要的資訊可用於完成構建過程
initialize 建立初始化狀態,例如設定屬性
generate-sources 產生任何的原始碼包含在編譯階段
process-sources 處理原始碼,例如,過濾器值
generate-resources 包含在包中產生的資源
process-resources 複製和處理資源到目標目錄,準備打包階段
compile 編譯該專案的原始碼
process-classes 從編譯生成的檔案提交處理,例如:Java類的位元組碼增強/優化
generate-test-sources 生成任何測試的原始碼包含在編譯階段
process-test-sources 處理測試原始碼,例如,過濾器任何值
test-compile 編譯測試原始碼到測試目標目錄
process-test-classes 處理測試程式碼檔案編譯生成的檔案
test 執行測試使用合適的單元測試框架(JUnit)
prepare-package 執行必要的任何操作的實際打包之前準備一個包
package 提取編譯後的程式碼,並在其分發格式打包,如JAR,WAR或EAR檔案
pre-integration-test 完成執行整合測試之前所需操作。例如,設定所需的環境
integration-test 處理並在必要時部署軟體包到整合測試可以執行的環境
pre-integration-test 完成整合測試已全部執行後所需操作。例如,清理環境
verify 執行任何檢查,驗證包是有效的,符合品質稽核規定
install 將包安裝到本地儲存庫,它可以用作當地其他專案的依賴
deploy 複製最終的包到遠端倉庫與其他開發者和專案共用

有涉及到Maven 生命週期值得一提幾個重要概念:

  • 當一個階段是通過 Maven命令呼叫,例如:mvn compile,只有階段到達並包括這個階段才會被執行。

  • 不同的 Maven 目標系結到 Maven生命週期的不同階段這是這取決於包型別(JAR/WAR/EAR)。 

在下面的範例中,將附加 Maven 的 antrun 外掛:執行目標構建生命週期的幾個階段。這將使我們能夠回顯的資訊顯示生命週期的各個階段。
我們已經更新了在 C:\MVN\ 專案檔案夾中的 pom.xml 檔案

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.projectgroup</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.1</version>
<executions>
   <execution>
      <id>id.validate</id>
      <phase>validate</phase>
      <goals>
         <goal>run</goal>       </goals>
      <configuration>
         <tasks>
            <echo>validate phase</echo>
         </tasks>
      </configuration>
   </execution>
   <execution>
      <id>id.compile</id>
      <phase>compile</phase>
      <goals>
         <goal>run</goal>
      </goals>
      <configuration>
         <tasks>
            <echo>compile phase</echo>
         </tasks>
      </configuration>
   </execution>
   <execution>
      <id>id.test</id>
      <phase>test</phase>
      <goals>
         <goal>run</goal>
      </goals>
      <configuration>
         <tasks>
            <echo>test phase</echo>
         </tasks>
      </configuration>
   </execution>
   <execution>
         <id>id.package</id>
         <phase>package</phase>
         <goals>
            <goal>run</goal>
         </goals>
         <configuration>
         <tasks>
            <echo>package phase</echo>
         </tasks>
      </configuration>
   </execution>
   <execution>
      <id>id.deploy</id>
      <phase>deploy</phase>
      <goals>
         <goal>run</goal>
      </goals>
      <configuration>
      <tasks>
         <echo>deploy phase</echo>
      </tasks>
      </configuration>
   </execution>
</executions>
</plugin>
</plugins>
</build>
</project>

現在,開啟命令控制台,進入包含 pom.xml 並執行以下 mvn 命令。

C:\MVN\project>mvn compile

編譯階段,Maven 將開始構建生命週期的階段處理並顯示。

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------
[INFO] Building Unnamed - com.companyname.projectgroup:project:jar:1.0
[INFO]    task-segment: [compile]
[INFO] ------------------------------------------------------------------
[INFO] [antrun:run {execution: id.validate}]
[INFO] Executing tasks
     [echo] validate phase
[INFO] Executed tasks
[INFO] [resources:resources {execution: default-resources}]
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\MVN\project\src\main\resources
[INFO] [compiler:compile {execution: default-compile}]
[INFO] Nothing to compile - all classes are up to date
[INFO] [antrun:run {execution: id.compile}]
[INFO] Executing tasks
     [echo] compile phase
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------
[INFO] Total time: 2 seconds
[INFO] Finished at: Sat Jul 07 20:18:25 IST 2012
[INFO] Final Memory: 7M/64M
[INFO] ------------------------------------------------------------------

網站的生命週期

Maven的網站外掛通常用於建立新的文件,建立報告,部署網站等。
階段

  • pre-site

  • site

  • post-site

  • site-deploy

在下面的範例中,我們將附加 maven-antrun-plugin:run 目標網站的生命週期的所有階段。這將使我們能夠呼叫簡訊顯示的生命週期的各個階段。
現在更新 pom.xml 檔案在 C:\MVN\ 專案檔案夾中。

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.projectgroup</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.1</version>
   <executions>
      <execution>
         <id>id.pre-site</id>
         <phase>pre-site</phase>
         <goals>
            <goal>run</goal>
         </goals>
         <configuration>
            <tasks>
               <echo>pre-site phase</echo>
            </tasks>
         </configuration>
      </execution>
      <execution>
         <id>id.site</id>
         <phase>site</phase>
         <goals>
         <goal>run</goal>
         </goals>
         <configuration><tasks>
               <echo>site phase</echo>
            </tasks>
         </configuration>
      </execution>
      <execution>
         <id>id.post-site</id>
         <phase>post-site</phase>
         <goals>
            <goal>run</goal>
         </goals>
         <configuration>
            <tasks>
               <echo>post-site phase</echo>
            </tasks>
         </configuration>
      </execution>
      <execution>
         <id>id.site-deploy</id>
         <phase>site-deploy</phase>
         <goals>
            <goal>run</goal>
         </goals>
         <configuration>
            <tasks>
               <echo>site-deploy phase</echo>
            </tasks>
         </configuration>
      </execution>
   </executions>
</plugin>
</plugins>
</build>
</project>

開啟命令控制台,進入該檔案夾包含 pom.xml 並執行以下 mvn 命令。

C:\MVN\project>mvn site

Maven將開始處理並顯示網站的生命週期階段的各個階段。

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------
[INFO] Building Unnamed - com.companyname.projectgroup:project:jar:1.0
[INFO]    task-segment: [site]
[INFO] ------------------------------------------------------------------
[INFO] [antrun:run {execution: id.pre-site}]
[INFO] Executing tasks
     [echo] pre-site phase
[INFO] Executed tasks
[INFO] [site:site {execution: default-site}]
[INFO] Generating "About" report.
[INFO] Generating "Issue Tracking" report.
[INFO] Generating "Project Team" report.
[INFO] Generating "Dependencies" report.
[INFO] Generating "Project Plugins" report.
[INFO] Generating "Continuous Integration" report.
[INFO] Generating "Source Repository" report.
[INFO] Generating "Project License" report.
[INFO] Generating "Mailing Lists" report.
[INFO] Generating "Plugin Management" report.
[INFO] Generating "Project Summary" report.
[INFO] [antrun:run {execution: id.site}]
[INFO] Executing tasks
     [echo] site phase
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Sat Jul 07 15:25:10 IST 2012
[INFO] Final Memory: 24M/149M
[INFO] -