- Maven 教程
- Maven - 首頁
- Maven - 概述
- Maven - 環境設定
- Maven - POM
- Maven - 構建生命週期
- Maven - 構建配置檔案
- Maven - 倉庫
- Maven - 外掛
- Maven - 建立專案
- Maven - 構建 & 測試專案
- Maven - 外部依賴
- Maven - 專案文件
- Maven - 專案模板
- Maven - 快照
- Maven - 構建自動化
- Maven - 管理依賴
- Maven - 部署自動化
- Maven - Web 應用
- Maven - Eclipse IDE
- Maven - NetBeans
- Maven - IntelliJ IDEA
- Maven 有用資源
- Maven - 常見問題解答
- Maven - 快速指南
- Maven - 有用資源
- Maven - 討論
Maven - 構建生命週期
什麼是構建生命週期?
構建生命週期是一系列定義良好的階段,這些階段定義了目標執行的順序。此處階段代表生命週期中的一個階段。例如,一個典型的Maven 構建生命週期包含以下階段序列。
| 階段 | 處理 | 描述 |
|---|---|---|
| prepare-resources | 資源複製 | 在此階段可以自定義資源複製。 |
| validate | 驗證資訊 | 驗證專案是否正確以及是否提供了所有必要的資訊。 |
| compile | 編譯 | 在此階段完成原始碼編譯。 |
| Test | 測試 | 測試編譯後的原始碼,適用於測試框架。 |
| package | 打包 | 此階段建立 POM.xml 中指定的 JAR/WAR 包。 |
| install | 安裝 | 此階段將包安裝到本地/遠端 Maven 倉庫中。 |
| Deploy | 部署 | 將最終包複製到遠端倉庫中。 |
始終存在pre 和post 階段來註冊目標,這些目標必須在特定階段之前或之後執行。
當 Maven 開始構建專案時,它會依次遍歷定義的階段序列並執行與每個階段註冊的目標。
Maven 具有以下三個標準生命週期:
- clean
- default(或 build)
- site
目標代表有助於專案構建和管理的特定任務。它可能繫結到零個或多個構建階段。未繫結到任何構建階段的目標可以透過直接呼叫在構建生命週期之外執行。
執行順序取決於呼叫目標和構建階段的順序。例如,考慮以下命令。clean 和package 引數是構建階段,而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>