Maven - 構建生命週期



什麼是構建生命週期?

構建生命週期是一系列定義良好的階段,這些階段定義了目標執行的順序。此處階段代表生命週期中的一個階段。例如,一個典型的Maven 構建生命週期包含以下階段序列。

階段 處理 描述
prepare-resources 資源複製 在此階段可以自定義資源複製。
validate 驗證資訊 驗證專案是否正確以及是否提供了所有必要的資訊。
compile 編譯 在此階段完成原始碼編譯。
Test 測試 測試編譯後的原始碼,適用於測試框架。
package 打包 此階段建立 POM.xml 中指定的 JAR/WAR 包。
install 安裝 此階段將包安裝到本地/遠端 Maven 倉庫中。
Deploy 部署 將最終包複製到遠端倉庫中。

始終存在prepost 階段來註冊目標,這些目標必須在特定階段之前或之後執行。

當 Maven 開始構建專案時,它會依次遍歷定義的階段序列並執行與每個階段註冊的目標。

Maven 具有以下三個標準生命週期:

  • clean
  • default(或 build)
  • site

目標代表有助於專案構建和管理的特定任務。它可能繫結到零個或多個構建階段。未繫結到任何構建階段的目標可以透過直接呼叫在構建生命週期之外執行。

執行順序取決於呼叫目標和構建階段的順序。例如,考慮以下命令。cleanpackage 引數是構建階段,而dependency:copy-dependencies 是一個目標。

mvn clean dependency:copy-dependencies package

此處,將首先執行clean 階段,然後執行dependency:copy-dependencies 目標,最後執行package 階段。

Clean 生命週期

當我們執行mvn post-clean 命令時,Maven 會呼叫包含以下階段的 clean 生命週期。

  • pre-clean
  • clean
  • post-clean

Maven clean 目標 (clean:clean) 繫結到 clean 生命週期中的clean 階段。其clean:cleangoal 透過刪除構建目錄來刪除構建的輸出。因此,當mvn clean 命令執行時,Maven 會刪除構建目錄。

我們可以透過在 clean 生命週期上述任何階段中提及目標來自定義此行為。

在以下示例中,我們將 maven-antrun-plugin:run 目標附加到 pre-clean、clean 和 post-clean 階段。這將允許我們回顯顯示 clean 生命週期階段的文字訊息。

我們在 C:\MVN\project 資料夾中建立了一個 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.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 將開始處理並顯示 clean 生命週期所有階段。

C:\MVN>mvn post-clean
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------< com.companyname.projectgroup:project >----------------
[INFO] Building project 1.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-antrun-plugin:1.1:run (id.pre-clean) @ project ---
[INFO] Executing tasks
     [echo] pre-clean phase
[INFO] Executed tasks
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ project ---
[INFO]
[INFO] --- maven-antrun-plugin:1.1:run (id.clean) @ project ---
[INFO] Executing tasks
     [echo] clean phase
[INFO] Executed tasks
[INFO]
[INFO] --- maven-antrun-plugin:1.1:run (id.post-clean) @ project ---
[INFO] Executing tasks
     [echo] post-clean phase
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  0.740 s
[INFO] Finished at: 2021-12-10T20:03:53+05:30
[INFO] ------------------------------------------------------------------------

C:\MVN>

您可以嘗試調整mvn clean 命令,它將顯示pre-clean 和 clean。對於post-clean 階段,不會執行任何操作。

預設(或構建)生命週期

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

序號 生命週期階段 & 描述
1

validate

驗證專案是否正確以及是否提供了完成構建過程所需的所有必要資訊。

2

initialize

初始化構建狀態,例如設定屬性。

3

generate-sources

生成要在編譯階段包含的任何原始碼。

4

process-sources

處理原始碼,例如過濾任何值。

5

generate-resources

生成要包含在包中的資源。

6

process-resources

將資源複製並處理到目標目錄,準備打包階段。

7

compile

編譯專案的原始碼。

8

process-classes

後處理編譯生成的 檔案,例如對 Java 類執行位元組碼增強/最佳化。

9

generate-test-sources

生成要在編譯階段包含的任何測試原始碼。

10

process-test-sources

處理測試原始碼,例如過濾任何值。

11

test-compile

將測試原始碼編譯到測試目標目錄中。

12

process-test-classes

處理測試程式碼檔案編譯生成的 檔案。

13

test

使用合適的單元測試框架執行測試(Junit 是其中之一)。

14

prepare-package

執行實際打包之前準備包所需的任何操作。

15

package

獲取編譯後的程式碼並將其打包成可分發的格式,例如 JAR、WAR 或 EAR 檔案。

16

pre-integration-test

執行在執行整合測試之前所需的操作。例如,設定所需的 環境。

17

integration-test

處理並部署包(如果需要)到可以執行整合測試的環境中。

18

post-integration-test

執行在執行整合測試後所需的操作。例如,清理環境。

19

verify

執行任何檢查以驗證包是否有效並滿足質量標準。

20

install

將包安裝到本地儲存庫中,該儲存庫可作為其他專案的本地依賴項使用。

21

deploy

將最終包複製到遠端儲存庫中,以便與其他開發人員和專案共享。

與 Maven 生命週期相關的一些重要概念值得一提:

  • 當透過 Maven 命令呼叫階段時,例如mvn compile,只會執行直到該階段(包括該階段)的所有階段。

  • 不同的 Maven 目標將繫結到 Maven 生命週期中的不同階段,具體取決於打包型別 (JAR / WAR / EAR)。

在以下示例中,我們將 maven-antrun-plugin:run 目標附加到構建生命週期的幾個階段。這將允許我們回顯顯示生命週期階段的文字訊息。

我們已更新了 C:\MVN\project 資料夾中的 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 將開始處理並顯示構建生命週期中直到 compile 階段的所有階段。

C:\MVN>mvn compile
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------< com.companyname.projectgroup:project >----------------
[INFO] Building project 1.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-antrun-plugin:1.1:run (id.validate) @ project ---
[INFO] Executing tasks
     [echo] validate phase
[INFO] Executed tasks
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ project ---
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\MVN\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ project ---
[INFO] No sources to compile
[INFO]
[INFO] --- maven-antrun-plugin:1.1:run (id.compile) @ project ---
[INFO] Executing tasks
     [echo] compile phase
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  3.033 s
[INFO] Finished at: 2021-12-10T20:05:46+05:30
[INFO] ------------------------------------------------------------------------

C:\MVN>

Site 生命週期

Maven Site 外掛通常用於建立新的文件,以建立報表、部署站點等。它包含以下階段:

  • pre-site
  • site
  • post-site
  • site-deploy

在以下示例中,我們將maven-antrun-plugin:run 目標附加到 Site 生命週期所有階段。這將允許我們回顯顯示生命週期階段的文字訊息。

我們已更新了 C:\MVN\project 資料夾中的 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-site-plugin</artifactId>
            <version>3.7</version>
         </plugin>
         <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-project-info-reports-plugin</artifactId>
            <version>2.9</version>
         </plugin>
         <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 將開始處理並顯示直到 site 階段的所有 site 生命週期階段。

C:\MVN>mvn site
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------< com.companyname.projectgroup:project >----------------
[INFO] Building project 1.0
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-antrun-plugin:3.0.0:run (id.pre-site) @ project ---
[INFO] Executing tasks
[WARNING]      [echo] pre-site phase
[INFO] Executed tasks
[INFO]
[INFO] --- maven-site-plugin:3.7:site (default-site) @ project ---
[WARNING] Input file encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent!
[WARNING] No project URL defined - decoration links will not be relativized!
[INFO] Rendering site with org.apache.maven.skins:maven-default-skin:jar:1.2 skin.
[INFO]
[INFO] --- maven-antrun-plugin:3.0.0:run (id.site) @ project ---
[INFO] Executing tasks
[WARNING]      [echo] site phase
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  4.323 s
[INFO] Finished at: 2021-12-10T20:22:31+05:30
[INFO] ------------------------------------------------------------------------

C:\MVN>
廣告