
- 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 - 概述
什麼是 Maven?
Maven 是一種專案管理和理解工具,它為開發人員提供了一個完整的構建生命週期框架。開發團隊幾乎可以立即自動化專案的構建基礎設施,因為 Maven 使用標準的目錄佈局和預設的構建生命週期。
在多個開發團隊的環境中,Maven 可以非常快速地設定團隊按照標準的方式工作。由於大多數專案設定都很簡單且可重用,因此 Maven 在建立報告、檢查、構建和測試自動化設定時,使開發人員的工作變得輕鬆。
Maven 為開發人員提供了管理以下方面的方法:
- 構建
- 文件
- 報告
- 依賴
- SCM
- 釋出
- 分發
- 郵件列表
概括來說,Maven 簡化並標準化了專案構建過程。它可以無縫地處理編譯、分發、文件、團隊協作和其他任務。Maven 提高了可重用性,並處理了大多數與構建相關的任務。
Maven 的演變
Maven 最初是為了簡化 Jakarta Turbine 專案中的構建過程而設計的。當時有幾個專案,每個專案都包含略微不同的 ANT 構建檔案。JAR 檔案被檢入 CVS。
Apache 集團隨後開發了 **Maven**,它可以一起構建多個專案,釋出專案資訊,部署專案,在多個專案之間共享 JAR 檔案,並幫助團隊協作。
目標
Maven 的主要目標是為開發人員提供以下功能:
一個全面且可重用、可維護且易於理解的專案模型。
與該宣告式模型互動的外掛或工具。
Maven 專案結構和內容在名為 pom.xml 的 xml 檔案中宣告,稱為專案物件模型 (POM),它是整個 Maven 系統的基本單元。在後面的章節中,我們將詳細解釋 POM。
約定優於配置
Maven 使用 **約定** 優於 **配置**,這意味著開發人員不需要自己建立構建過程。
開發人員不必提及每個配置細節。Maven 為專案提供了合理的預設行為。當建立 Maven 專案時,Maven 會建立預設的專案結構。開發人員只需要相應地放置檔案,而無需在 pom.xml 中定義任何配置。
例如,下表顯示了專案原始碼檔案、資原始檔和其他配置的預設值。假設 **${basedir}** 表示專案位置:
專案 | 預設值 |
---|---|
原始碼 | ${basedir}/src/main/java |
資源 | ${basedir}/src/main/resources |
測試 | ${basedir}/src/test |
編譯後的位元組碼 | ${basedir}/target |
可分發 JAR | ${basedir}/target/classes |
為了構建專案,Maven 為開發人員提供了提及生命週期目標和專案依賴項(依賴於 Maven 外掛功能及其預設約定)的選項。Maven 外掛維護了大部分專案管理和構建相關任務。
開發人員可以構建任何給定的 Maven 專案,而無需瞭解各個外掛的工作原理。我們將在後面的章節中詳細討論 Maven 外掛。
Maven 的特性
遵循最佳實踐的簡單專案設定。
在所有專案中保持一致的使用。
依賴管理,包括自動更新。
一個龐大且不斷增長的庫儲存庫。
可擴充套件,能夠輕鬆地用 Java 或指令碼語言編寫外掛。
無需額外配置即可立即訪問新功能。
**基於模型的構建** - Maven 能夠將任意數量的專案構建成預定義的輸出型別,例如 jar、war、元資料。
**專案資訊的連貫站點** - 使用與構建過程相同的元資料,maven 能夠生成一個網站和一個 PDF,其中包含完整的文件。
**釋出管理和分發釋出** - 無需額外配置,maven 就會與您的原始碼控制系統(如 CVS)整合,並管理專案的釋出。
**向後相容性** - 您可以輕鬆地將專案的多個模組從舊版本的 Maven 移植到 Maven 3。它也可以支援舊版本。
**自動父版本控制** - 無需在子模組中指定父模組進行維護。
**並行構建** - 它分析專案依賴關係圖,並允許您並行構建計劃模組。使用此功能,您可以實現 20-50% 的效能改進。
**更好的錯誤和完整性報告** - Maven 改進了錯誤報告,併為您提供了一個指向 Maven wiki 頁面的連結,您可以在其中獲得錯誤的完整描述。
Maven - 環境設定
步驟 1:驗證您的機器上是否安裝了 Java
首先,開啟控制檯並根據您正在使用的作業系統執行 java 命令。
作業系統 | 任務 | 命令 |
---|---|---|
Windows | 開啟命令控制檯 | c:\> java -version |
Linux | 開啟命令終端 | $ java -version |
Mac | 開啟終端 | machine:< joseph$ java -version |
讓我們驗證所有作業系統的輸出:
作業系統 | 輸出 |
---|---|
Windows | java 11.0.11 2021-04-20 LTS Java(TM) SE Runtime Environment 18.9 (build 11.0.11+9-LTS-194) Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.11+9-LTS-194, mixed mode) |
Linux | java 11.0.11 2021-04-20 LTS Java(TM) SE Runtime Environment 18.9 (build 11.0.11+9-LTS-194) Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.11+9-LTS-194, mixed mode) |
Mac | java 11.0.11 2021-04-20 LTS Java(TM) SE Runtime Environment 18.9 (build 11.0.11+9-LTS-194) Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.11+9-LTS-194, mixed mode) |
如果您的系統上未安裝 Java,請從以下連結下載 Java 軟體開發工具包 (SDK) http://www.oracle.com。在本教程中,我們假設 Java 11.0.11 為已安裝版本。
步驟 2:設定 JAVA 環境
將 **JAVA_HOME** 環境變數設定為指向 Java 在您的機器上安裝的基本目錄位置。例如。
作業系統 | 輸出 |
---|---|
Windows | 將環境變數 JAVA_HOME 設定為 C:\Program Files\Java\jdk11.0.11 |
Linux | export JAVA_HOME = /usr/local/java-current |
Mac | export JAVA_HOME = /Library/Java/Home |
將 Java 編譯器位置附加到系統路徑。
作業系統 | 輸出 |
---|---|
Windows | 在系統變數 **Path** 的末尾附加字串 **C:\Program Files\Java\jdk11.0.11\bin**。 |
Linux | export PATH = $PATH:$JAVA_HOME/bin/ |
Mac | 不需要 |
如上所述,使用命令 **java -version** 驗證 Java 安裝。
步驟 3 - 下載 Maven 歸檔檔案
從 https://maven.apache.org/download.cgi 下載 Maven 3.8.4。
作業系統 | 歸檔檔名 |
---|---|
Windows | apache-maven-3.8.4-bin.zip |
Linux | apache-maven-3.8.4-bin.tar.gz |
Mac | apache-maven-3.8.4-bin.tar.gz |
步驟 4 - 解壓縮 Maven 歸檔檔案
將歸檔檔案解壓縮到您希望安裝 Maven 3.8.4 的目錄中。從歸檔檔案中將建立子目錄 apache-maven-3.8.4。
作業系統 | 位置(根據您的安裝情況可能有所不同) |
---|---|
Windows | C:\Program Files\Apache Software Foundation\apache-maven-3.8.4 |
Linux | /usr/local/apache-maven |
Mac | /usr/local/apache-maven |
步驟 5 - 設定 Maven 環境變數
將 M2_HOME、M2、MAVEN_OPTS 新增到環境變數中。
作業系統 | 輸出 |
---|---|
Windows | 使用系統屬性設定環境變數。 M2_HOME=C:\Program Files\Apache Software Foundation\apache-maven-3.8.4 M2=%M2_HOME%\bin MAVEN_OPTS=-Xms256m -Xmx512m |
Linux | 開啟命令終端並設定環境變數。 export M2_HOME=/usr/local/apache-maven/apache-maven-3.8.4 export M2=$M2_HOME/bin export MAVEN_OPTS=-Xms256m -Xmx512m |
Mac | 開啟命令終端並設定環境變數。 export M2_HOME=/usr/local/apache-maven/apache-maven-3.8.4 export M2=$M2_HOME/bin export MAVEN_OPTS=-Xms256m -Xmx512m |
步驟 6 - 將 Maven bin 目錄位置新增到系統路徑
現在將 M2 變數附加到系統路徑。
作業系統 | 輸出 |
---|---|
Windows | 在系統變數 Path 的末尾附加字串 ;%M2% 。 |
Linux | export PATH=$M2:$PATH |
Mac | export PATH=$M2:$PATH |
步驟 7 - 驗證 Maven 安裝
現在開啟控制檯並執行以下 **mvn** 命令。
作業系統 | 任務 | 命令 |
---|---|---|
Windows | 開啟命令控制檯 | c:\> mvn --version |
Linux | 開啟命令終端 | $ mvn --version |
Mac | 開啟終端 | machine:~ joseph$ mvn --version |
最後,驗證上述命令的輸出,它應如下所示:
作業系統 | 輸出 |
---|---|
Windows | Apache Maven 3.8.4 (9b656c72d54e5bacbed989b64718c159fe39b537) Maven home: C:\Program Files\Apache Software Foundation\apache-maven-3.8.4 Java version: 11.0.11, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk11.0.11\ Default locale: en_IN, platform encoding: Cp1252 OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows" |
Linux | Apache Maven 3.8.4 (9b656c72d54e5bacbed989b64718c159fe39b537) Java version: 11.0.11 Java home: /usr/local/java-current/jre |
Mac | Apache Maven 3.8.4 (9b656c72d54e5bacbed989b64718c159fe39b537) Java version: 11.0.11 Java home: /Library/Java/Home/jre |
Maven - POM
POM 代表專案物件模型。它是 Maven 中工作的基本單元。它是一個 XML 檔案,位於專案的根目錄中,名為 pom.xml。
POM 包含有關專案的資訊以及 Maven 用於構建專案使用的各種配置細節。
POM 還包含目標和外掛。在執行任務或目標時,Maven 會在當前目錄中查詢 POM。它讀取 POM,獲取所需的配置資訊,然後執行目標。可以在 POM 中指定的某些配置如下:
- 專案依賴
- 外掛
- 目標
- 構建配置檔案
- 專案版本
- 開發者
- 郵件列表
在建立 POM 之前,我們應該首先確定專案的 **組** (groupId)、其 **名稱** (artifactId) 及其版本,因為這些屬性有助於在儲存庫中唯一標識專案。
POM 示例
<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.project-group</groupId> <artifactId>project</artifactId> <version>1.0</version> </project>
需要注意的是,每個專案都應該只有一個 POM 檔案。
所有 POM 檔案都需要 **project** 元素和三個必填欄位:**groupId、artifactId、version**。
儲存庫中的專案表示法為 **groupId:artifactId:version**。
POM 的最低要求:
序號 | 節點和描述 |
---|---|
1 | 專案根節點 這是專案根標籤。您需要指定基本架構設定,例如 apache 架構和 w3.org 規範。 |
2 | 模型版本 模型版本應為 4.0.0。 |
3 | groupId 這是專案組的 ID。它通常在組織或專案中是唯一的。例如,一個銀行集團 com.company.bank 包含所有與銀行相關的專案。 |
4 | artifactId 這是專案的 ID。通常是專案的名稱。例如,consumer-banking。連同 groupId 一起,artifactId 定義了工件在儲存庫中的位置。 |
5 | 版本 這是專案的版本。連同 groupId 一起,它用於工件的儲存庫中,將不同版本彼此區分開來。例如 - com.company.bank:consumer-banking:1.0 com.company.bank:consumer-banking:1.1。 |
超級 POM
超級 POM 是 Maven 的預設 POM。所有 POM 都繼承自父 POM 或預設 POM(無論是否顯式定義)。這個基礎 POM 稱為超級 POM,包含預設繼承的值。
Maven 使用有效的 POM(來自超級 POM 的配置加上專案配置)來執行相關目標。它幫助開發者在他們的 pom.xml 中指定最少的配置細節。儘管配置可以輕鬆覆蓋。
檢視超級 POM 的預設配置的一個簡單方法是執行以下命令:mvn help:effective-pom
在計算機上的任何目錄中建立一個 pom.xml。使用上面提到的示例 pom 的內容。
在下面的示例中,我們在 C:\MVN\project 資料夾中建立了一個 pom.xml。
現在開啟命令控制檯,轉到包含 pom.xml 的資料夾並執行以下mvn命令。
C:\MVN\project>mvn help:effective-pom
Maven 將開始處理並顯示有效的 pom。
C:\MVN>mvn help:effective-pom [INFO] Scanning for projects... [INFO] [INFO] ---------------< com.companyname.project-group:project >---------------- [INFO] Building project 1.0 [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-help-plugin:3.2.0:effective-pom (default-cli) @ project --- [INFO] Effective POMs, after inheritance, interpolation, and profiles are applied: [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.261 s [INFO] Finished at: 2021-12-10T19:54:53+05:30 [INFO] ------------------------------------------------------------------------ C:\MVN>
應用繼承、插值和配置檔案後,有效的 POM 作為控制檯的結果顯示。
<?xml version="1.0" encoding="Cp1252"?> <!-- ====================================================================== --> <!-- --> <!-- Generated by Maven Help Plugin on 2021-12-10T19:54:52+05:30 --> <!-- See: http://maven.apache.org/plugins/maven-help-plugin/ --> <!-- --> <!-- ====================================================================== --> <!-- ====================================================================== --> <!-- --> <!-- Effective POM for project --> <!-- 'com.companyname.project-group:project:jar:1.0' --> <!-- --> <!-- ====================================================================== --> <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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.companyname.project-group</groupId> <artifactId>project</artifactId> <version>1.0</version> <repositories> <repository> <snapshots> <enabled>false</enabled> </snapshots> <id>central</id> <name>Central Repository</name> <url>https://repo.maven.apache.org/maven2</url> </repository> </repositories> <pluginRepositories> <pluginRepository> <releases> <updatePolicy>never</updatePolicy> </releases> <snapshots> <enabled>false</enabled> </snapshots> <id>central</id> <name>Central Repository</name> <url>https://repo.maven.apache.org/maven2</url> </pluginRepository> </pluginRepositories> <build> <sourceDirectory>C:\MVN\src\main\java</sourceDirectory> <scriptSourceDirectory>C:\MVN\src\main\scripts</scriptSourceDirectory> <testSourceDirectory>C:\MVN\src\test\java</testSourceDirectory> <outputDirectory>C:\MVN\target\classes</outputDirectory> <testOutputDirectory>C:\MVN\target\test-classes</testOutputDirectory> <resources> <resource> <directory>C:\MVN\src\main\resources</directory> </resource> </resources> <testResources> <testResource> <directory>C:\MVN\src\test\resources</directory> </testResource> </testResources> <directory>C:\MVN\target</directory> <finalName>project-1.0</finalName> <pluginManagement> <plugins> <plugin> <artifactId>maven-antrun-plugin</artifactId> <version>1.3</version> </plugin> <plugin> <artifactId>maven-assembly-plugin</artifactId> <version>2.2-beta-5</version> </plugin> <plugin> <artifactId>maven-dependency-plugin</artifactId> <version>2.8</version> </plugin> <plugin> <artifactId>maven-release-plugin</artifactId> <version>2.5.3</version> </plugin> </plugins> </pluginManagement> <plugins> <plugin> <artifactId>maven-clean-plugin</artifactId> <version>2.5</version> <executions> <execution> <id>default-clean</id> <phase>clean</phase> <goals> <goal>clean</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-resources-plugin</artifactId> <version>2.6</version> <executions> <execution> <id>default-testResources</id> <phase>process-test-resources</phase> <goals> <goal>testResources</goal> </goals> </execution> <execution> <id>default-resources</id> <phase>process-resources</phase> <goals> <goal>resources</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <executions> <execution> <id>default-jar</id> <phase>package</phase> <goals> <goal>jar</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <executions> <execution> <id>default-compile</id> <phase>compile</phase> <goals> <goal>compile</goal> </goals> </execution> <execution> <id>default-testCompile</id> <phase>test-compile</phase> <goals> <goal>testCompile</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <version>2.12.4</version> <executions> <execution> <id>default-test</id> <phase>test</phase> <goals> <goal>test</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-install-plugin</artifactId> <version>2.4</version> <executions> <execution> <id>default-install</id> <phase>install</phase> <goals> <goal>install</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-deploy-plugin</artifactId> <version>2.7</version> <executions> <execution> <id>default-deploy</id> <phase>deploy</phase> <goals> <goal>deploy</goal> </goals> </execution> </executions> </plugin> <plugin> <artifactId>maven-site-plugin</artifactId> <version>3.3</version> <executions> <execution> <id>default-site</id> <phase>site</phase> <goals> <goal>site</goal> </goals> <configuration> <outputDirectory>C:\MVN\target\site</outputDirectory> <reportPlugins> <reportPlugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-project-info-reports-plugin</artifactId> </reportPlugin> </reportPlugins> </configuration> </execution> <execution> <id>default-deploy</id> <phase>site-deploy</phase> <goals> <goal>deploy</goal> </goals> <configuration> <outputDirectory>C:\MVN\target\site</outputDirectory> <reportPlugins> <reportPlugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-project-info-reports-plugin</artifactId> </reportPlugin> </reportPlugins> </configuration> </execution> </executions> <configuration> <outputDirectory>C:\MVN\target\site</outputDirectory> <reportPlugins> <reportPlugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-project-info-reports-plugin</artifactId> </reportPlugin> </reportPlugins> </configuration> </plugin> </plugins> </build> <reporting> <outputDirectory>C:\MVN\target\site</outputDirectory> </reporting> </project>
在上面的 pom.xml 中,您可以看到預設的專案原始檔夾結構、輸出目錄、所需的外掛、儲存庫、報告目錄,Maven 在執行所需目標時將使用這些目錄。
Maven pom.xml 也不需要手動編寫。Maven 提供了許多原型外掛來建立專案,這些外掛依次建立專案結構和 pom.xml
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 將開始處理並顯示構建生命週期直至編譯階段的階段。
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 階段的站點生命週期階段。
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>
Maven - 構建配置檔案
什麼是構建配置檔案?
構建配置檔案是一組配置值,可用於設定或覆蓋 Maven 構建的預設值。使用構建配置檔案,您可以為不同的環境(例如生產環境與開發環境)自定義構建。
配置檔案在 pom.xml 檔案中使用其 activeProfiles/profiles 元素指定,並以多種方式觸發。配置檔案在構建時修改 POM,並用於為不同的目標環境提供引數(例如,開發、測試和生產環境中資料庫伺服器的路徑)。
構建配置檔案型別
構建配置檔案主要有三種類型。
型別 | 定義位置 |
---|---|
每個專案 | 在專案 POM 檔案 pom.xml 中定義 |
每個使用者 | 在 Maven settings xml 檔案中定義(%USER_HOME%/.m2/settings.xml) |
全域性 | 在 Maven 全域性 settings xml 檔案中定義(%M2_HOME%/conf/settings.xml) |
配置檔案啟用
Maven 構建配置檔案可以透過多種方式啟用。
- 顯式使用命令控制檯輸入。
- 透過 Maven 設定。
- 基於環境變數(使用者/系統變數)。
- 作業系統設定(例如,Windows 系列)。
- 檔案存在/不存在。
配置檔案啟用示例
假設您的專案的目錄結構如下 -

現在,在src/main/resources目錄下,有三個環境相關的檔案:
序號 | 檔名及描述 |
---|---|
1 | env.properties 如果未指定配置檔案,則使用預設配置。 |
2 | env.test.properties 使用test配置檔案時的測試配置。 |
3 | env.prod.properties 使用prod配置檔案時的生產環境配置。 |
顯式啟用配置檔案
在以下示例中,我們將附加maven-antrun-plugin:run目標到測試階段。這將允許我們為不同的配置檔案回顯文字訊息。我們將使用pom.xml定義不同的配置檔案,並使用maven命令在命令控制檯中啟用配置檔案。
假設,我們在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> <profiles> <profile> <id>test</id> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.1</version> <executions> <execution> <phase>test</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <echo>Using env.test.properties</echo> <copy file="src/main/resources/env.test.properties" tofile="${project.build.outputDirectory}/env.properties"/> </tasks> </configuration> </execution> </executions> </plugin> </plugins> </build> </profile> </profiles> </project>
現在開啟命令控制檯,轉到包含pom.xml的資料夾並執行以下mvn命令。使用-P選項將配置檔名作為引數傳遞。
C:\MVN\project>mvn test -Ptest
Maven將開始處理並顯示測試構建配置檔案的結果。
C:\MVN>mvn test -Ptest [INFO] Scanning for projects... [INFO] [INFO] ----------------< com.companyname.projectgroup:project >---------------- [INFO] Building project 1.0 [INFO] --------------------------------[ jar ]--------------------------------- [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] Copying 3 resources [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ project --- [INFO] No sources to compile [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ 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\test\resources [INFO] [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ project --- [INFO] No sources to compile [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ project --- [INFO] No tests to run. [INFO] [INFO] --- maven-antrun-plugin:1.1:run (default) @ project --- [INFO] Executing tasks [echo] Using env.test.properties [INFO] Executed tasks [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.011 s [INFO] Finished at: 2021-12-10T20:29:39+05:30 [INFO] ------------------------------------------------------------------------ C:\MVN>
現在作為練習,您可以執行以下步驟:
將另一個profile元素新增到pom.xml的profiles元素中(複製現有的profile元素並將其貼上到profile元素結束的位置)。
將此profile元素的id從test更新為normal。
更新task部分以回顯env.properties並將env.properties複製到目標目錄。
再次重複上述三個步驟,將id更新為prod,並將task部分更新為env.prod.properties。
就是這樣。現在您已經準備好了三個構建配置檔案(normal/test/prod)。
現在開啟命令控制檯,轉到包含pom.xml的資料夾並執行以下mvn命令。使用-P選項將配置檔名作為引數傳遞。
C:\MVN\project>mvn test -Pnormal C:\MVN\project>mvn test -Pprod
檢查構建輸出以檢視差異。
透過Maven設定啟用配置檔案
開啟位於%USER_HOME%/.m2目錄下的Mavensettings.xml檔案,其中%USER_HOME%表示使用者主目錄。如果settings.xml檔案不存在,則建立一個新檔案。
使用active Profiles節點將test配置檔案新增為活動配置檔案,如下例所示。
<settings 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/settings-1.0.0.xsd"> <mirrors> <mirror> <id>maven.dev.snaponglobal.com</id> <name>Internal Artifactory Maven repository</name> <url>http://repo1.maven.org/maven2/</url> <mirrorOf>*</mirrorOf> </mirror> </mirrors> <activeProfiles> <activeProfile>test</activeProfile> </activeProfiles> </settings>
現在開啟命令控制檯,轉到包含pom.xml的資料夾並執行以下mvn命令。不要使用-P選項傳遞配置檔名。Maven將顯示test配置檔案作為活動配置檔案的結果。
C:\MVN\project>mvn test
透過環境變數啟用配置檔案
現在從maven settings.xml中刪除活動配置檔案並更新pom.xml中提到的test配置檔案。將activation元素新增到profile元素中,如下所示。
當系統屬性“env”指定為值“test”時,將觸發test配置檔案。建立一個環境變數“env”並將其值設定為“test”。
<profile> <id>test</id> <activation> <property> <name>env</name> <value>test</value> </property> </activation> </profile>
讓我們開啟命令控制檯,轉到包含pom.xml的資料夾並執行以下mvn命令。
C:\MVN\project>mvn test
透過作業系統啟用配置檔案
activation元素包含作業系統詳細資訊,如下所示。當系統為Windows XP時,將觸發此test配置檔案。
<profile> <id>test</id> <activation> <os> <name>Windows XP</name> <family>Windows</family> <arch>x86</arch> <version>5.1.2600</version> </os> </activation> </profile>
現在開啟命令控制檯,轉到包含pom.xml的資料夾並執行以下mvn命令。不要使用-P選項傳遞配置檔名。Maven將顯示test配置檔案作為活動配置檔案的結果。
C:\MVN\project>mvn test
透過存在/缺少檔案啟用配置檔案
現在activation元素包含作業系統詳細資訊,如下所示。當target/generated-sources/axistools/wsdl2java/com/companyname/group不存在時,將觸發test配置檔案。
<profile> <id>test</id> <activation> <file> <missing>target/generated-sources/axistools/wsdl2java/ com/companyname/group</missing> </file> </activation> </profile>
現在開啟命令控制檯,轉到包含pom.xml的資料夾並執行以下mvn命令。不要使用-P選項傳遞配置檔名。Maven將顯示test配置檔案作為活動配置檔案的結果。
C:\MVN\project>mvn test
Maven - 倉庫
什麼是Maven倉庫?
在Maven術語中,倉庫是一個目錄,其中儲存了所有專案jar、庫jar、外掛或任何其他專案特定的工件,Maven可以輕鬆地使用它們。
Maven倉庫有三種類型。以下插圖將提供關於這三種類型的想法。
- 本地倉庫
- 中央倉庫
- 遠端倉庫

本地倉庫
Maven本地倉庫是您機器上的一個資料夾位置。當您第一次執行任何maven命令時,它就會被建立。
Maven本地倉庫儲存您專案的所有依賴項(庫jar、外掛jar等)。當您執行Maven構建時,Maven會自動將所有依賴項jar下載到本地倉庫。這有助於避免每次構建專案時都引用儲存在遠端機器上的依賴項。
Maven本地倉庫預設由Maven在%USER_HOME%目錄中建立。要覆蓋預設位置,請在位於%M2_HOME%\conf目錄下的Maven settings.xml檔案中指定另一個路徑。
<settings xmlns = "http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> <localRepository>C:/MyLocalRepository</localRepository> </settings>
當您執行Maven命令時,Maven會將依賴項下載到您的自定義路徑。
中央倉庫
Maven中央倉庫是由Maven社群提供的倉庫。它包含大量常用的庫。
當Maven在本地倉庫中找不到任何依賴項時,它會使用以下URL在中央倉庫中開始搜尋:https://repo1.maven.org/maven2/
中央倉庫的關鍵概念如下:
- 此倉庫由Maven社群管理。
- 不需要配置。
- 需要網際網路訪問才能搜尋。
為了瀏覽中央Maven倉庫的內容,Maven社群提供了一個URL:https://search.maven.org/#browse。使用此庫,開發人員可以在中央倉庫中搜索所有可用的庫。
遠端倉庫
有時,Maven也無法在中央倉庫中找到提到的依賴項。然後它會停止構建過程並將錯誤訊息輸出到控制檯。為了防止這種情況,Maven提供了遠端倉庫的概念,它是開發人員自己的自定義倉庫,包含所需的庫或其他專案jar。
例如,使用下面提到的POM.xml,Maven將從同一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> <dependencies> <dependency> <groupId>com.companyname.common-lib</groupId> <artifactId>common-lib</artifactId> <version>1.0.0</version> </dependency> <dependencies> <repositories> <repository> <id>companyname.lib1</id> <url>http://download.companyname.org/maven2/lib1</url> </repository> <repository> <id>companyname.lib2</id> <url>http://download.companyname.org/maven2/lib2</url> </repository> </repositories> </project>
Maven依賴項搜尋順序
當我們執行Maven構建命令時,Maven會按照以下順序開始查詢依賴項庫:
步驟1 - 在本地倉庫中搜索依賴項,如果未找到,則轉到步驟2,否則執行進一步的處理。
步驟2 - 在中央倉庫中搜索依賴項,如果未找到並且已提及遠端倉庫/倉庫,則轉到步驟4。否則,將其下載到本地倉庫以供將來參考。
步驟3 - 如果未提及遠端倉庫,Maven只會停止處理並丟擲錯誤(無法找到依賴項)。
步驟4 - 在遠端倉庫或倉庫中搜索依賴項,如果找到,則將其下載到本地倉庫以供將來參考。否則,Maven會停止處理並丟擲錯誤(無法找到依賴項)。
Maven - 外掛
什麼是Maven外掛?
Maven實際上是一個外掛執行框架,其中每個任務實際上都是由外掛完成的。Maven外掛通常用於:
- 建立jar檔案
- 建立war檔案
- 編譯程式碼檔案
- 程式碼單元測試
- 建立專案文件
- 建立專案報告
外掛通常提供一組目標,可以使用以下語法執行:
mvn [plugin-name]:[goal-name]
例如,可以使用maven-compiler-plugin的compile-goal編譯Java專案,方法是執行以下命令。
mvn compiler:compile
外掛型別
Maven提供了以下兩種型別的外掛:
序號 | 型別及描述 |
---|---|
1 | 構建外掛 它們在構建過程中執行,應在pom.xml的<build/>元素中配置。 |
2 | 報告外掛 它們在站點生成過程中執行,應在pom.xml的<reporting/>元素中配置。 |
以下是幾個常用外掛的列表:
序號 | 外掛及描述 |
---|---|
1 | clean 清理構建後的目標。刪除target目錄。 |
2 | 編譯器 編譯Java原始檔。 |
3 | surefire 執行JUnit單元測試。建立測試報告。 |
4 | jar 從當前專案構建JAR檔案。 |
5 | war 從當前專案構建WAR檔案。 |
6 | javadoc 生成專案的Javadoc。 |
7 | antrun 從構建提到的任何階段執行一組ant任務。 |
示例
在我們的示例中,我們廣泛使用了maven-antrun-plugin來在控制檯上列印資料。請參考構建配置檔案章節。讓我們以更好的方式理解它並在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.clean</id> <phase>clean</phase> <goals> <goal>run</goal> </goals> <configuration> <tasks> <echo>clean phase</echo> </tasks> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
接下來,開啟命令控制檯並轉到包含pom.xml的資料夾並執行以下mvn命令。
C:\MVN\project>mvn clean
Maven將開始處理並顯示clean生命週期的clean階段。
C:\MVN>mvn clean [INFO] Scanning for projects... [INFO] [INFO] ----------------< com.companyname.projectgroup:project >---------------- [INFO] Building project 1.0 [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ project --- [INFO] Deleting C:\MVN\target [INFO] [INFO] --- maven-antrun-plugin:1.1:run (id.clean) @ project --- [INFO] Executing tasks [echo] clean phase [INFO] Executed tasks [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.266 s [INFO] Finished at: 2021-12-13T13:58:10+05:30 [INFO] ------------------------------------------------------------------------ C:\MVN>
以上示例說明了以下關鍵概念:
外掛使用pom.xml中的plugins元素指定。
每個外掛可以有多個目標。
您可以定義外掛應從哪個階段開始處理,使用其phase元素。我們使用了clean階段。
您可以透過將任務繫結到外掛的目標來配置要執行的任務。我們將echo任務繫結到maven-antrun-plugin的run目標。
然後,Maven將下載外掛(如果本地倉庫中不存在)並開始處理。
Maven - 建立專案
Maven使用archetype外掛建立專案。要建立一個簡單的Java應用程式,我們將使用maven-archetype-quickstart外掛。在下面的示例中,我們將在C:\MVN資料夾中建立一個基於Maven的Java應用程式專案。
讓我們開啟命令控制檯,轉到C:\MVN目錄並執行以下mvn命令。在執行命令之前,請確保C:\MVN目錄為空。
C:\MVN>mvn archetype:generate -DgroupId = com.companyname.bank -DartifactId = consumerBanking -DarchetypeArtifactId = maven-archetype-quickstart -DinteractiveMode = false
Maven將開始處理並建立完整的Java應用程式專案結構。
C:\MVN>mvn archetype:generate -DgroupId=com.companyname.bank -DartifactId=consumerBanking -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false [INFO] Scanning for projects... [INFO] [INFO] ------------------< org.apache.maven:standalone-pom >------------------- [INFO] Building Maven Stub Project (No POM) 1 [INFO] --------------------------------[ pom ]--------------------------------- [INFO] [INFO] >>> maven-archetype-plugin:3.2.0:generate (default-cli) > generate-sources @ standalone-pom >>> [INFO] [INFO] <<< maven-archetype-plugin:3.2.0:generate (default-cli) < generate-sources @ standalone-pom <<< [INFO] [INFO] [INFO] --- maven-archetype-plugin:3.2.0:generate (default-cli) @ standalone-pom --- [INFO] Generating project in Batch mode [INFO] ---------------------------------------------------------------------------- [INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-quickstart:1.0 [INFO] ---------------------------------------------------------------------------- [INFO] Parameter: basedir, Value: C:\MVN [INFO] Parameter: package, Value: com.companyname.bank [INFO] Parameter: groupId, Value: com.companyname.bank [INFO] Parameter: artifactId, Value: consumerBanking [INFO] Parameter: packageName, Value: com.companyname.bank [INFO] Parameter: version, Value: 1.0-SNAPSHOT [INFO] project created from Old (1.x) Archetype in dir: C:\MVN\consumerBanking [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 9.396 s [INFO] Finished at: 2021-12-13T15:13:00+05:30 [INFO] ------------------------------------------------------------------------ C:\MVN>
現在轉到C:/MVN目錄。您將看到一個建立的Java應用程式專案,名為consumer Banking(如artifactId中指定)。Maven使用以下所示的標準目錄佈局:

使用以上示例,我們可以理解以下關鍵概念:
序號 | 資料夾結構及描述 |
---|---|
1 | consumerBanking 包含src資料夾和pom.xml |
2 | src/main/java 包含包結構(com/companyName/bank)下的Java程式碼檔案。 |
3 | src/main/test 包含包結構(com/companyName/bank)下的測試Java程式碼檔案。 |
4 | src/main/resources 它包含影像/屬性檔案(在以上示例中,我們需要手動建立此結構)。 |
如果您觀察,您會發現Maven還建立了一個示例Java原始檔和Java測試檔案。開啟C:\MVN\consumerBanking\src\main\java\com\companyname\bank資料夾,您將看到App.java。
package com.companyname.bank; /** * Hello world! * */ public class App { public static void main( String[] args ){ System.out.println( "Hello World!" ); } }
開啟C:\MVN\consumerBanking\src\test\java\com\companyname\bank資料夾以檢視AppTest.java。
package com.companyname.bank; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** * Unit test for simple App. */ public class AppTest extends TestCase { /** * Create the test case * * @param testName name of the test case */ public AppTest( String testName ) { super( testName ); } /** * @return the suite of tests being tested */ public static Test suite() { return new TestSuite( AppTest.class ); } /** * Rigourous Test :-) */ public void testApp() { assertTrue( true ); } }
開發人員需要按照上表中提到的方式放置他們的檔案,Maven處理所有與構建相關的複雜性。
在下一章中,我們將討論如何使用Maven構建和測試專案構建和測試專案。
Maven - 構建和測試專案
我們在專案建立章節中學習的是如何使用Maven建立Java應用程式。現在我們將瞭解如何構建和測試應用程式。
轉到C:/MVN目錄,您已在其中建立了Java應用程式。開啟consumerBanking資料夾。您將看到包含以下內容的POM.xml檔案。更新它以反映當前的Java版本。
<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> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> </dependency> </dependencies> </project>
在這裡您可以看到,Maven已經添加了JUnit作為測試框架。預設情況下,Maven在其預設目錄結構中添加了一個原始檔App.java和一個測試檔案AppTest.java,如上一章所述。
讓我們開啟命令控制檯,轉到C:\MVN\consumerBanking目錄並執行以下mvn命令。
C:\MVN\consumerBanking>mvn clean package
Maven將開始構建專案。
C:\MVN\consumerBanking>mvn clean package [INFO] Scanning for projects... [INFO] [INFO] ----------------< com.companyname.bank:consumerBanking >---------------- [INFO] Building consumerBanking 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ consumerBanking --- [INFO] Deleting C:\MVN\consumerBanking\target [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ consumerBanking --- [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory C:\MVN\consumerBanking\src\main\resources [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ consumerBanking --- [INFO] Changes detected - recompiling the module! [WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent! [INFO] Compiling 1 source file to C:\MVN\consumerBanking\target\classes [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ consumerBanking --- [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory C:\MVN\consumerBanking\src\test\resources [INFO] [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ consumerBanking --- [INFO] Changes detected - recompiling the module! [WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent! [INFO] Compiling 1 source file to C:\MVN\consumerBanking\target\test-classes [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ consumerBanking --- [INFO] Surefire report directory: C:\MVN\consumerBanking\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.companyname.bank.AppTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.028 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ consumerBanking --- [INFO] Building jar: C:\MVN\consumerBanking\target\consumerBanking-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 4.663 s [INFO] Finished at: 2021-12-13T17:34:27+05:30 [INFO] ------------------------------------------------------------------------ C:\MVN\consumerBanking>
您已經構建了專案並建立了最終的 jar 檔案,以下是關鍵的學習概念 -
我們給 Maven 設定了兩個目標,首先是清理目標目錄 (clean),然後將專案構建輸出打包成 jar (package)。
打包後的 jar 檔案位於 consumerBanking\target 資料夾中,名為 consumerBanking-1.0-SNAPSHOT.jar。
測試報告位於 consumerBanking\target\surefire-reports 資料夾中。
Maven 編譯原始碼檔案,然後測試原始碼檔案。
然後 Maven 執行測試用例。
最後,Maven 建立包。
現在開啟命令控制檯,轉到 C:\MVN\consumerBanking\target\classes 目錄並執行以下 Java 命令。
>java com.companyname.bank.App
您將看到如下結果 -
Hello World!
新增 Java 原始檔
讓我們看看如何在專案中新增其他 Java 檔案。開啟 C:\MVN\consumerBanking\src\main\java\com\companyname\bank 資料夾,在其中建立 Util 類,命名為 Util.java。
package com.companyname.bank; public class Util { public static void printMessage(String message){ System.out.println(message); } }
更新 App 類以使用 Util 類。
package com.companyname.bank; /** * Hello world! * */ public class App { public static void main( String[] args ){ Util.printMessage("Hello World!"); } }
現在開啟命令控制檯,轉到 **C:\MVN\consumerBanking** 目錄並執行以下 **mvn** 命令。
>mvn clean compile
Maven 構建成功後,轉到 C:\MVN\consumerBanking\target\classes 目錄並執行以下 Java 命令。
>java -cp com.companyname.bank.App
您將看到如下結果 -
Hello World!
Maven - 外部依賴
如您所知,Maven 使用儲存庫的概念進行依賴項管理。但是,如果依賴項在任何遠端儲存庫和中央儲存庫中都不可用會發生什麼?Maven 使用 **外部依賴項** 的概念為這種情況提供了答案。
例如,讓我們對“建立 Java 專案”一章中建立的專案進行以下更改。
在 src 資料夾中新增 **lib** 資料夾。
將任何 jar 檔案複製到 lib 資料夾中。我們使用了 **ldapjdk.jar**,它是 LDAP 操作的輔助庫。
現在我們的專案結構應如下所示 -

這裡您擁有自己的庫,特定於專案,這是一種常見情況,它包含一些 jar 檔案,這些 jar 檔案可能在任何 Maven 可以從中下載的儲存庫中都不可用。如果您的程式碼使用此庫與 Maven 結合使用,則 Maven 構建將失敗,因為它在編譯階段無法下載或引用此庫。
為了處理這種情況,讓我們使用以下方式將此外部依賴項新增到 Maven 的 **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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.companyname.bank</groupId> <artifactId>consumerBanking</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>consumerBanking</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>ldapjdk</groupId> <artifactId>ldapjdk</artifactId> <scope>system</scope> <version>1.0</version> <systemPath>${basedir}\src\lib\ldapjdk.jar</systemPath> </dependency> </dependencies> </project>
檢視上面示例中 dependencies 下的第二個 dependency 元素,它闡明瞭關於 **外部依賴項** 的以下關鍵概念。
外部依賴項(庫 jar 檔案位置)可以在 pom.xml 中以與其他依賴項相同的方式配置。
將 groupId 指定為庫的名稱。
將 artifactId 指定為庫的名稱。
將 scope 指定為 system。
指定相對於專案位置的系統路徑。
希望您現在對外部依賴項有了清晰的瞭解,並且能夠在您的 Maven 專案中指定外部依賴項。
Maven - 專案文件
本教程將教您如何一次性建立應用程式的文件。因此,讓我們開始吧,轉到 C:/MVN 目錄,您之前使用前面章節中給出的示例在該目錄中建立了 Java **consumerBanking** 應用程式。開啟 **consumerBanking** 資料夾並執行以下 **mvn** 命令。
更新 C:\MVN\consumerBanking 資料夾中的 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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.companyname.bank</groupId> <artifactId>consumerBanking</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>consumerBanking</name> <url>http://maven.apache.org</url> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> <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> </plugins> </build> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
C:\MVN\consumerBanking>mvn site
Maven將開始構建專案。
[INFO] Scanning for projects... [INFO] [INFO] ----------------< com.companyname.bank:consumerBanking >---------------- [INFO] Building consumerBanking 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-site-plugin:3.7:site (default-site) @ consumerBanking --- [WARNING] Input file encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent! [INFO] Relativizing decoration links with respect to localized project URL: http://maven.apache.org [INFO] Rendering site with org.apache.maven.skins:maven-default-skin:jar:1.2 skin. [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 5.850 s [INFO] Finished at: 2021-12-13T17:49:56+05:30 [INFO] ------------------------------------------------------------------------
您的專案文件現已準備就緒。Maven 在目標目錄中建立了一個站點。

開啟 C:\MVN\consumerBanking\target\site 資料夾。點選 index.html 檢視文件。

Maven 使用名為 Doxia 的文件處理引擎建立文件,該引擎將多種源格式讀取到一個公共文件模型中。要為您的專案編寫文件,您可以使用以下幾種常用格式編寫內容,這些格式由 Doxia 解析。
格式名稱 | 描述 | 參考 |
---|---|---|
XDoc | Maven 1.x 文件格式 | |
FML | 用於常見問題解答文件 |
Maven - 專案模板
Maven 使用 **原型** 的概念為使用者提供了非常龐大的不同型別的專案模板列表(614 個)。Maven 幫助使用者使用以下命令快速啟動一個新的 Java 專案。
mvn archetype:generate
什麼是原型?
原型是一個 Maven 外掛,其任務是根據其模板建立專案結構。我們將在這裡使用 quickstart 原型外掛來建立一個簡單的 Java 應用程式。
使用專案模板
讓我們開啟命令控制檯,轉到 **C:\ > MVN** 目錄並執行以下 **mvn** 命令。
C:\MVN>mvn archetype:generate
Maven 將開始處理並提示您選擇所需的原型。
C:\MVN>mvn archetype:generate [INFO] Scanning for projects... [INFO] [INFO] ------------------< org.apache.maven:standalone-pom >------------------- [INFO] Building Maven Stub Project (No POM) 1 [INFO] --------------------------------[ pom ]--------------------------------- [INFO] [INFO] >>> maven-archetype-plugin:3.2.0:generate (default-cli) > generate-sources @ standalone-pom >>> [INFO] [INFO] <<< maven-archetype-plugin:3.2.0:generate (default-cli) < generate-sources @ standalone-pom <<< [INFO] [INFO] [INFO] --- maven-archetype-plugin:3.2.0:generate (default-cli) @ standalone-pom --- [INFO] Generating project in Interactive mode [INFO] No archetype defined. Using maven-archetype-quickstart (org.apache.maven.archetypes:maven-archetype-quickstart:1.0) Choose archetype: 1: remote -> am.ik.archetype:elm-spring-boot-blank-archetype (Blank multi project for Spring Boot + Elm) 2: remote -> am.ik.archetype:graalvm-blank-archetype (Blank project for GraalVM) ... 3021: remote -> za.co.absa.hyperdrive:component-archetype_2.12 (-) Choose a number or apply filter (format: [groupId:]artifactId, case sensitive contains): 1843:
按 Enter 選擇預設選項 (1843: maven-archetype-quickstart)
Maven 將提示您輸入原型的特定版本。
Choose org.apache.maven.archetypes:maven-archetype-quickstart version: 1: 1.0-alpha-1 2: 1.0-alpha-2 3: 1.0-alpha-3 4: 1.0-alpha-4 5: 1.0 6: 1.1 7: 1.3 8: 1.4 Choose a number: 8:
按 Enter 選擇預設選項 (8: maven-archetype-quickstart:1.4)
Maven 將提示您輸入專案詳細資訊。根據提示輸入專案詳細資訊。如果提供了預設值,則按 Enter。您可以透過輸入自己的值來覆蓋它們。
Define value for property 'groupId': : com.companyname.insurance Define value for property 'artifactId': : health Define value for property 'version': 1.0-SNAPSHOT: Define value for property 'package': com.companyname.insurance:
Maven 將提示您確認專案詳細資訊。按 Enter 或按 Y。
Confirm properties configuration: groupId: com.companyname.insurance artifactId: health version: 1.0-SNAPSHOT package: com.companyname.insurance Y:
現在 Maven 將開始建立專案結構並顯示以下內容 -
[INFO] ---------------------------------------------------------------------------- [INFO] Using following parameters for creating project from Archetype: maven-archetype-quickstart:1.4 [INFO] ---------------------------------------------------------------------------- [INFO] Parameter: groupId, Value: com.companyname.insurance [INFO] Parameter: artifactId, Value: health [INFO] Parameter: version, Value: 1.0-SNAPSHOT [INFO] Parameter: package, Value: com.companyname.insurance [INFO] Parameter: packageInPathFormat, Value: com/companyname/insurance [INFO] Parameter: package, Value: com.companyname.insurance [INFO] Parameter: groupId, Value: com.companyname.insurance [INFO] Parameter: artifactId, Value: health [INFO] Parameter: version, Value: 1.0-SNAPSHOT [INFO] Project created from Archetype in dir: C:\MVN\health [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 04:44 min [INFO] Finished at: 2021-12-13T18:52:59+05:30 [INFO] ------------------------------------------------------------------------
建立的專案
現在轉到 **C:\ > MVN** 目錄。您將看到一個名為 **health** 的 Java 應用程式專案,該名稱在專案建立時作為 **artifactId** 指定。Maven 將為專案建立標準的目錄佈局,如下所示 -

建立的 POM.xml
Maven 為專案生成一個 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.insurance</groupId> <artifactId>health</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>health</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
建立的 App.java
Maven 為專案生成示例 Java 原始檔 App.java,如下所示 -
位置:**C:\ > MVN > health > src > main > java > com > companyname > insurance > App.java**。
package com.companyname.insurance; /** * Hello world! * */ public class App { public static void main( String[] args ) { System.out.println( "Hello World!" ); } }
建立的 AppTest.java
Maven 為專案生成示例 Java 源測試檔案 AppTest.java,如下所示 -
位置:**C:\ > MVN > health > src > test > java > com > companyname > insurance > AppTest.java**。
package com.companyname.insurance; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** * Unit test for simple App. */ public class AppTest extends TestCase { /** * Create the test case * * @param testName name of the test case */ public AppTest( String testName ) { super( testName ); } /** * @return the suite of tests being tested */ public static Test suite() { return new TestSuite( AppTest.class ); } /** * Rigourous Test :-) */ public void testApp() { assertTrue( true ); } }
現在您可以看到 Maven 的強大功能。您可以使用 Maven 中的單個命令建立任何型別的專案,並快速啟動您的開發。
不同的原型
序號 | 原型 ArtifactIds 及其描述 |
---|---|
1 | maven-archetype-archetype 一個包含示例原型的原型。 |
2 | maven-archetype-j2ee-simple 一個包含簡化的示例 J2EE 應用程式的原型。 |
3 | maven-archetype-mojo 一個包含示例 Maven 外掛的原型。 |
4 | maven-archetype-plugin 一個包含示例 Maven 外掛的原型。 |
5 | maven-archetype-plugin-site 一個包含示例 Maven 外掛站點的原型。 |
6 | maven-archetype-portlet 一個包含示例 JSR-268 Portlet 的原型。 |
7 | maven-archetype-quickstart 一個包含示例 Maven 專案的原型。 |
8 | maven-archetype-simple 一個包含簡單 Maven 專案的原型。 |
9 | maven-archetype-site 一個包含示例 Maven 站點的原型,用於演示一些受支援的文件型別,如 APT、XDoc 和 FML,並演示如何對站點進行國際化。 |
10 | maven-archetype-site-simple 一個包含示例 Maven 站點的原型。 |
11 | maven-archetype-webapp 一個包含示例 Maven Webapp 專案的原型。 |
Maven - 快照
大型軟體應用程式通常包含多個模組,並且多個團隊在同一應用程式的不同模組上工作是常見情況。例如,假設一個團隊正在開發應用程式的前端作為 app-ui 專案 (app-ui.jar:1.0),並且他們正在使用 data-service 專案 (data-service.jar:1.0)。
現在,可能發生的情況是,負責 data-service 的團隊正在快速進行錯誤修復或增強,並且他們幾乎每天都在向遠端儲存庫釋出庫。
現在,如果 data-service 團隊每隔一天上傳一個新版本,那麼會出現以下問題 -
data-service 團隊應該在每次釋出更新程式碼時都通知 app-ui 團隊。
app-ui 團隊需要定期更新他們的 pom.xml 以獲取更新的版本。
為了處理此類情況,**快照** 概念應運而生。
什麼是快照?
快照是一個特殊版本,表示當前開發副本。與常規版本不同,Maven 在每次構建時都會在遠端儲存庫中檢查新的快照版本。
現在,data-service 團隊將每次將其更新程式碼的快照發布到儲存庫,例如 data-service: 1.0-SNAPSHOT,替換舊的快照 jar 檔案。
快照與版本
對於版本,如果 Maven 一次下載了指定的版本,例如 data-service:1.0,它將永遠不會嘗試下載儲存庫中可用的較新 1.0 版本。要下載更新的程式碼,data-service 版本需要升級到 1.1。
對於快照,Maven 將在每次 app-ui 團隊構建專案時自動獲取最新的快照 (data-service:1.0-SNAPSHOT)。
app-ui pom.xml
**app-ui** 專案使用 data-service 的 1.0-SNAPSHOT 版本。
<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>app-ui</groupId> <artifactId>app-ui</artifactId> <version>1.0</version> <packaging>jar</packaging> <name>health</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>data-service</groupId> <artifactId>data-service</artifactId> <version>1.0-SNAPSHOT</version> <scope>test</scope> </dependency> </dependencies> </project>
data-service pom.xml
**data-service** 專案為每次微小更改釋出 1.0-SNAPSHOT 版本。
<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>data-service</groupId> <artifactId>data-service</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <name>health</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> </project>
儘管在快照的情況下,Maven 每天都會自動獲取最新的快照,但您可以使用 -U 開關強制 Maven 下載最新的快照構建,該開關可用於任何 Maven 命令。
mvn clean package -U
讓我們開啟命令控制檯,轉到 **C:\ > MVN > app-ui** 目錄並執行以下 **mvn** 命令。
C:\MVN\app-ui>mvn clean package -U
Maven 將在下載 data-service 的最新快照後開始構建專案。
[INFO] Scanning for projects... [INFO]-------------------------------------------- [INFO] Building consumerBanking [INFO] task-segment: [clean, package] [INFO]-------------------------------------------- [INFO] Downloading data-service:1.0-SNAPSHOT [INFO] 290K downloaded. [INFO] [clean:clean {execution: default-clean}] [INFO] Deleting directory C:\MVN\app-ui\target [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\app-ui\src\main\resources [INFO] [compiler:compile {execution:default-compile}] [INFO] Compiling 1 source file to C:\MVN\app-ui\target\classes [INFO] [resources:testResources {execution: default-testResources}] [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory C:\MVN\app-ui\src\test\resources [INFO] [compiler:testCompile {execution: default-testCompile}] [INFO] Compiling 1 source file to C:\MVN\app-ui\target\test-classes [INFO] [surefire:test {execution: default-test}] [INFO] Surefire report directory: C:\MVN\app-ui\target\ surefire-reports -------------------------------------------------- T E S T S -------------------------------------------------- Running com.companyname.bank.AppTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.027 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [jar:jar {execution: default-jar}] [INFO] Building jar: C:\MVN\app-ui\target\ app-ui-1.0-SNAPSHOT.jar [INFO]-------------------------------------------------------- [INFO] BUILD SUCCESSFUL [INFO]-------------------------------------------------------- [INFO] Total time: 2 seconds [INFO] Finished at: 2015-09-27T12:30:02+05:30 [INFO] Final Memory: 16M/89M [INFO]------------------------------------------------------------------------
Maven - 構建自動化
構建自動化定義了一種場景,其中依賴專案(s)的構建過程在專案構建成功完成之後啟動,以確保依賴專案(s)穩定。
示例
假設一個團隊正在開發一個名為 **bus-core-api** 的專案,另外兩個專案 **app-web-ui** 和 **app-desktop-ui** 依賴於它。
**app-web-ui** 專案使用 **bus-core-api** 專案的 1.0-SNAPSHOT 版本。
<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>app-web-ui</groupId> <artifactId>app-web-ui</artifactId> <version>1.0</version> <packaging>jar</packaging> <dependencies> <dependency> <groupId>bus-core-api</groupId> <artifactId>bus-core-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>
**app-desktop-ui** 專案使用 **bus-core-api** 專案的 1.0-SNAPSHOT 版本。
<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>app_desktop_ui</groupId> <artifactId>app_desktop_ui</artifactId> <version>1.0</version> <packaging>jar</packaging> <name>app_desktop_ui</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <dependency> <groupId>bus_core_api</groupId> <artifactId>bus_core_api</artifactId> <version>1.0-SNAPSHOT</version> <scope>system</scope> <systemPath>C:\MVN\bus_core_api\target\bus_core_api-1.0-SNAPSHOT.jar</systemPath> </dependency> </dependencies> </project>
**bus-core-api** 專案 -
<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>bus_core_api</groupId> <artifactId>bus_core_api</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> </project>
現在,**app-web-ui** 和 **app-desktop-ui** 專案的團隊要求每當 **bus-core-api** 專案發生更改時,他們的構建過程都應該啟動。
使用快照可以確保使用最新的 **bus-core-api** 專案,但要滿足上述要求,我們需要做一些額外的事情。
我們可以透過以下兩種方式進行操作 -
在 bus-core-api pom 中新增一個構建後目標,以啟動 **app-web-ui** 和 **app-desktop-ui** 的構建。
使用 Hudson 等持續整合 (CI) 伺服器自動管理構建自動化。
使用 Maven
更新 **bus-core-api** 專案的 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>bus-core-api</groupId> <artifactId>bus-core-api</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <build> <plugins> <plugin> <artifactId>maven-invoker-plugin</artifactId> <version>1.6</version> <configuration> <debug>true</debug> <pomIncludes> <pomInclude>app-web-ui/pom.xml</pomInclude> <pomInclude>app-desktop-ui/pom.xml</pomInclude> </pomIncludes> </configuration> <executions> <execution> <id>build</id> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin> </plugins> <build> </project>
讓我們開啟命令控制檯,轉到 **C:\ > MVN > bus-core-api** 目錄並執行以下 **mvn** 命令。
>mvn clean package -U
Maven 將開始構建 **bus-core-api** 專案。
[INFO] Scanning for projects... [INFO] ------------------------------------------------------------------ [INFO] Building bus-core-api [INFO] task-segment: [clean, package] [INFO] ------------------------------------------------------------------ ... [INFO] [jar:jar {execution: default-jar}] [INFO] Building jar: C:\MVN\bus-core-ui\target\ bus-core-ui-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------
**bus-core-api** 構建成功後,Maven 將開始構建 **app-web-ui** 專案。
[INFO] ------------------------------------------------------------------ [INFO] Building app-web-ui [INFO] task-segment: [package] [INFO] ------------------------------------------------------------------ ... [INFO] [jar:jar {execution: default-jar}] [INFO] Building jar: C:\MVN\app-web-ui\target\ app-web-ui-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------
**app-web-ui** 構建成功後,Maven 將開始構建 **app-desktop-ui** 專案。
[INFO] ------------------------------------------------------------------ [INFO] Building app-desktop-ui [INFO] task-segment: [package] [INFO] ------------------------------------------------------------------ ... [INFO] [jar:jar {execution: default-jar}] [INFO] Building jar: C:\MVN\app-desktop-ui\target\ app-desktop-ui-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------- [INFO] BUILD SUCCESSFUL [INFO] -------------------------------------------------------------------
使用持續整合服務與 Maven
使用 CI 伺服器對於開發人員來說更可取。不需要每次新增新專案(例如,app-mobile-ui)時都更新 **bus-core-api** 專案,因為它是 **bus-core-api** 專案的依賴專案。Hudsion 是一個用 Java 編寫的持續整合工具,它執行在 servlet 容器中,例如 Apache tomcat 和 glassfish 應用程式伺服器。Hudson 使用 Maven 依賴項管理自動管理構建自動化。以下快照將定義 Hudson 工具的作用。

Hudson 將每個專案的構建視為一個作業。一旦專案程式碼被檢入 SVN(或對映到 Hudson 的任何原始碼管理工具),Hudson 就會啟動其構建作業,並且一旦該作業完成,它就會自動啟動其他依賴作業(其他依賴專案)。
在上面的示例中,當bus-core-ui原始碼在SVN中更新時,Hudson會啟動構建。一旦構建成功,Hudson會自動查詢依賴專案,並開始構建app-web-ui和app-desktop-ui專案。
Maven - 管理依賴
Maven的核心功能之一是依賴管理。當我們處理多模組專案(包含數百個模組/子專案)時,管理依賴項是一項艱鉅的任務。Maven提供了高度的控制來管理此類場景。
傳遞依賴發現
這種情況很常見,例如,庫A依賴於另一個庫B。如果另一個專案C想要使用A,那麼該專案也需要使用庫B。
Maven有助於避免發現所有必需庫的需求。Maven透過讀取依賴項的專案檔案(pom.xml),找出它們的依賴項等等來做到這一點。
我們只需要在每個專案的pom中定義直接依賴關係。Maven會自動處理其餘部分。
使用傳遞依賴項,包含的庫圖可能會迅速增長到很大程度。可能會出現重複庫的情況。Maven提供了一些功能來控制傳遞依賴項的範圍。
序號 | 功能和描述 |
---|---|
1 | 依賴仲裁 確定在遇到多個版本的構件時要使用哪個版本的依賴項。如果兩個依賴項版本在依賴項樹中處於相同的深度,則將使用第一個宣告的依賴項。 |
2 | 依賴管理 在遇到傳遞依賴項中的構件時,直接指定要使用的構件版本。例如,專案C可以在其依賴管理部分包含B作為依賴項,並直接控制在引用B時要使用哪個版本的B。 |
3 | 依賴範圍 根據構建的當前階段包含依賴項。 |
4 | 排除的依賴項 可以使用“exclusion”元素排除任何傳遞依賴項。例如,A依賴於B,B依賴於C,那麼A可以將C標記為排除。 |
5 | 可選依賴項 可以使用“optional”元素將任何傳遞依賴項標記為可選。例如,A依賴於B,B依賴於C。現在B將C標記為可選。那麼A將不會使用C。 |
依賴範圍
可以使用下面提到的各種依賴範圍來限制傳遞依賴發現。
序號 | 範圍和描述 |
---|---|
1 | compile 此範圍表示依賴項在專案的類路徑中可用。它是預設範圍。 |
2 | provided 此範圍表示依賴項將在執行時由JDK或Web伺服器/容器提供。 |
3 | runtime 此範圍表示依賴項不需要進行編譯,但需要在執行期間使用。 |
4 | test 此範圍表示依賴項僅在測試編譯和執行階段可用。 |
5 | system 此範圍表示您必須提供系統路徑。 |
6 | import 此範圍僅在依賴項型別為pom時使用。此範圍表示指定的POM應替換為該POM的<dependencyManagement>部分中的依賴項。 |
依賴管理
通常,我們有一組專案在一個公共專案下。在這種情況下,我們可以建立一個包含所有公共依賴項的公共pom,然後使此pom成為子專案pom的父pom。以下示例將幫助您理解此概念。

以下是上述依賴關係圖的詳細資訊:
- App-UI-WAR依賴於App-Core-lib和App-Data-lib。
- Root是App-Core-lib和App-Data-lib的父級。
- Root在其依賴項部分定義了Lib1、lib2、Lib3作為依賴項。
App-UI-WAR
<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.groupname</groupId> <artifactId>App-UI-WAR</artifactId> <version>1.0</version> <packaging>war</packaging> <dependencies> <dependency> <groupId>com.companyname.groupname</groupId> <artifactId>App-Core-lib</artifactId> <version>1.0</version> </dependency> </dependencies> <dependencies> <dependency> <groupId>com.companyname.groupname</groupId> <artifactId>App-Data-lib</artifactId> <version>1.0</version> </dependency> </dependencies> </project>
App-Core-lib
<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"> <parent> <artifactId>Root</artifactId> <groupId>com.companyname.groupname</groupId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.companyname.groupname</groupId> <artifactId>App-Core-lib</artifactId> <version>1.0</version> <packaging>jar</packaging> </project>
App-Data-lib
<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"> <parent> <artifactId>Root</artifactId> <groupId>com.companyname.groupname</groupId> <version>1.0</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.companyname.groupname</groupId> <artifactId>App-Data-lib</artifactId> <version>1.0</version> <packaging>jar</packaging> </project>
Root
<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.groupname</groupId> <artifactId>Root</artifactId> <version>1.0</version> <packaging>pom</packaging> <dependencies> <dependency> <groupId>com.companyname.groupname1</groupId> <artifactId>Lib1</artifactId> <version>1.0</version> </dependency> </dependencies> <dependencies> <dependency> <groupId>com.companyname.groupname2</groupId> <artifactId>Lib2</artifactId> <version>2.1</version> </dependency> </dependencies> <dependencies> <dependency> <groupId>com.companyname.groupname3</groupId> <artifactId>Lib3</artifactId> <version>1.1</version> </dependency> </dependencies> </project>
現在,當我們構建App-UI-WAR專案時,Maven將透過遍歷依賴關係圖來發現所有依賴項並構建應用程式。
從上面的示例中,我們可以學習以下關鍵概念:
可以使用父pom的概念將公共依賴項放在一個地方。App-Data-lib和App-Core-lib專案的依賴項列在Root專案中(請參閱Root的打包型別。它是POM)。
無需在App-UI-WAR中將Lib1、lib2、Lib3指定為依賴項。Maven使用傳遞依賴機制來管理此類細節。
Maven - 部署自動化
在專案開發中,部署過程通常包含以下步驟:
將所有正在進行的專案的程式碼檢入SVN(版本控制系統)或原始碼儲存庫並對其進行標記。
從SVN下載完整的原始碼。
構建應用程式。
將構建輸出(WAR或EAR檔案)儲存到一個公共網路位置。
從網路獲取檔案並將檔案部署到生產站點。
使用應用程式的日期和更新版本號更新文件。
問題陳述
上述部署過程中通常涉及多個人。一個團隊可能負責程式碼檢入,另一個團隊可能負責構建,依此類推。由於涉及人工操作以及多團隊環境,很可能任何步驟都可能被遺漏。例如,較舊的構建可能未替換到網路機器上,部署團隊再次部署了較舊的構建。
解決方案
透過結合以下內容來自動化部署過程:
- Maven,用於構建和釋出專案。
- SubVersion,原始碼儲存庫,用於管理原始碼。
- 遠端儲存庫管理器(Jfrog/Nexus),用於管理專案二進位制檔案。
更新專案POM.xml
我們將使用Maven Release外掛來建立一個自動釋出過程。
例如:bus-core-api專案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>bus-core-api</groupId> <artifactId>bus-core-api</artifactId> <version>1.0-SNAPSHOT</version> <packaging>jar</packaging> <scm> <url>http://www.svn.com</url> <connection>scm:svn:https://:8080/svn/jrepo/trunk/ Framework</connection> <developerConnection>scm:svn:${username}/${password}@localhost:8080: common_core_api:1101:code</developerConnection> </scm> <distributionManagement> <repository> <id>Core-API-Java-Release</id> <name>Release repository</name> <url>https://:8081/nexus/content/repositories/ Core-Api-Release</url> </repository> </distributionManagement> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-release-plugin</artifactId> <version>2.0-beta-9</version> <configuration> <useReleaseProfile>false</useReleaseProfile> <goals>deploy</goals> <scmCommentPrefix>[bus-core-api-release-checkin]-< /scmCommentPrefix> </configuration> </plugin> </plugins> </build> </project>
在Pom.xml中,我們使用了以下重要元素:
序號 | 元素和描述 |
---|---|
1 | SCM 配置Maven將從中檢出原始碼的SVN位置。 |
2 | 儲存庫 程式碼構建成功後,將儲存構建的WAR/EAR/JAR或任何其他構件的位置。 |
3 | 外掛 配置maven-release-plugin來自動化部署過程。 |
Maven Release外掛
Maven使用maven-release-plugin執行以下有用的任務。
mvn release:clean
如果上次釋出過程不成功,則清理工作區。
mvn release:rollback
如果上次釋出過程不成功,則回滾對工作區程式碼和配置所做的更改。
mvn release:prepare
執行多個操作,例如:
檢查是否存在任何未提交的本地更改。
確保不存在SNAPSHOT依賴項。
更改應用程式的版本並從版本中刪除SNAPSHOT以進行釋出。
更新到SVN的pom檔案。
執行測試用例。
提交修改後的POM檔案。
在Subversion中標記程式碼
遞增版本號併為將來的釋出附加SNAPSHOT。
將修改後的POM檔案提交到SVN。
mvn release:perform
使用先前定義的標籤檢出程式碼並執行Maven部署目標,以將war或構建的構件部署到儲存庫。
開啟命令控制檯,轉到C:\ > MVN >bus-core-api目錄並執行以下mvn命令。
>mvn release:prepare
Maven將開始構建專案。構建成功後,執行以下mvn命令。
>mvn release:perform
構建成功後,您可以在儲存庫中驗證上傳的JAR檔案。
Maven - Web 應用
本章將教您如何使用Maven管理基於Web的專案。在這裡,您將學習如何建立/構建/部署和執行Web應用程式。
建立Web應用程式
要建立一個簡單的Java Web應用程式,我們將使用maven-archetype-webapp外掛。因此,開啟命令控制檯,轉到C:\MVN目錄並執行以下mvn命令。
C:\MVN>mvn archetype:generate -DgroupId = com.companyname.automobile -DartifactId = trucks -DarchetypeArtifactId = maven-archetype-webapp -DinteractiveMode = false
Maven將開始處理並建立完整的基於Web的Java應用程式專案結構,如下所示:
C:\MVN>mvn archetype:generate -DgroupId=com.companyname.automobile -DartifactId=trucks -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false [INFO] Scanning for projects... [INFO] [INFO] ------------------< org.apache.maven:standalone-pom >------------------- [INFO] Building Maven Stub Project (No POM) 1 [INFO] --------------------------------[ pom ]--------------------------------- ... [INFO] ---------------------------------------------------------------------------- [INFO] Using following parameters for creating project from Old (1.x) Archetype: maven-archetype-webapp:1.0 [INFO] ---------------------------------------------------------------------------- [INFO] Parameter: basedir, Value: C:\MVN [INFO] Parameter: package, Value: com.companyname.automobile [INFO] Parameter: groupId, Value: com.companyname.automobile [INFO] Parameter: artifactId, Value: trucks [INFO] Parameter: packageName, Value: com.companyname.automobile [INFO] Parameter: version, Value: 1.0-SNAPSHOT [INFO] project created from Old (1.x) Archetype in dir: C:\MVN\trucks [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 10.381 s [INFO] Finished at: 2021-12-13T19:00:13+05:30 [INFO] ------------------------------------------------------------------------ C:\MVN>
現在轉到C:/MVN目錄。您將看到一個名為trucks(如artifactId中指定)的Java應用程式專案,如以下快照中指定。以下目錄結構通常用於Web應用程式:

Maven使用標準的目錄佈局。使用上面的示例,我們可以理解以下關鍵概念:
序號 | 資料夾結構及描述 |
---|---|
1 | trucks 包含src資料夾和pom.xml。 |
2 | src/main/webapp 包含index.jsp和WEB-INF資料夾。 |
3 | src/main/webapp/WEB-INF 包含web.xml |
4 | src/main/resources 它包含影像/屬性檔案。 |
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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.companyname.automobile</groupId> <artifactId>trucks</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>trucks Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>trucks</finalName> </build> </project>
如果您觀察,您會發現Maven還建立了一個示例JSP原始檔。
開啟C:\ > MVN > trucks > src > main > webapp >資料夾以檢視包含以下程式碼的index.jsp:
<html> <body> <h2>Hello World!</h2> </body> </html>
構建Web應用程式
開啟命令控制檯,轉到C:\MVN\trucks目錄並執行以下mvn命令。
C:\MVN\trucks>mvn clean package
Maven將開始構建專案。
C:\MVN\trucks>mvn clean package [INFO] Scanning for projects... [INFO] [INFO] -----------------< com.companyname.automobile:trucks >------------------ [INFO] Building trucks Maven Webapp 1.0-SNAPSHOT [INFO] --------------------------------[ war ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ trucks --- [INFO] Deleting C:\MVN\trucks\target [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ trucks --- [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] Copying 0 resource [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ trucks --- [INFO] No sources to compile [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ trucks --- [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory C:\MVN\trucks\src\test\resources [INFO] [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ trucks --- [INFO] No sources to compile [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ trucks --- [INFO] No tests to run. [INFO] [INFO] --- maven-war-plugin:2.2:war (default-war) @ trucks --- WARNING: An illegal reflective access operation has occurred WARNING: Illegal reflective access by com.thoughtworks.xstream.core.util.Fields (file:/C:/Users/intel/.m2/repository/com/thoughtworks/xstream/xstream/1.3.1/xstream-1.3.1.jar) to field java.util.Properties.defaults WARNING: Please consider reporting this to the maintainers of com.thoughtworks.xstream.core.util.Fields WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations WARNING: All illegal access operations will be denied in a future release [INFO] Packaging webapp [INFO] Assembling webapp [trucks] in [C:\MVN\trucks\target\trucks] [INFO] Processing war project [INFO] Copying webapp resources [C:\MVN\trucks\src\main\webapp] [INFO] Webapp assembled in [50 msecs] [INFO] Building war: C:\MVN\trucks\target\trucks.war [INFO] WEB-INF\web.xml already added, skipping [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.494 s [INFO] Finished at: 2021-12-13T19:02:15+05:30 [INFO] ------------------------------------------------------------------------ C:\MVN\trucks>
部署Web應用程式
現在將C:\ > MVN > trucks > target >資料夾中建立的trucks.war複製到您的Web伺服器webapp目錄並重新啟動Web伺服器。
測試Web應用程式
使用URL:http://<server-name>:<port-number>/trucks/index.jsp執行Web應用程式。
驗證輸出。

Maven - Eclipse IDE
Eclipse提供了一個優秀的外掛m2eclipse,它將Maven和Eclipse無縫整合在一起。
m2eclipse的一些功能如下:
您可以從Eclipse執行Maven目標。
您可以使用Eclipse自己的控制檯檢視Eclipse內部Maven命令的輸出。
您可以使用IDE更新Maven依賴項。
您可以從Eclipse內部啟動Maven構建。
它根據Maven的pom.xml管理Eclipse構建路徑的依賴項。
它從Eclipse工作區解析Maven依賴項,而無需安裝到本地Maven儲存庫(需要依賴項專案位於同一工作區)。
它會自動從遠端Maven儲存庫下載所需的依賴項和原始碼。
它提供嚮導來建立新的Maven專案、pom.xml以及在現有專案上啟用Maven支援
它提供對遠端Maven儲存庫中依賴項的快速搜尋。
安裝m2eclipse外掛
使用以下連結之一安裝m2eclipse:
Eclipse | URL |
---|---|
Eclipse 3.5(Gallileo) | |
Eclipse 3.6(Helios) |
以下示例將幫助您利用整合Eclipse和maven的好處。
在Eclipse中匯入Maven專案
開啟Eclipse。
選擇檔案 > 匯入 >選項。
選擇Maven專案選項。單擊“下一步”按鈕。

選擇專案位置,即使用Maven建立專案的所在位置。我們在前面的章節中建立了一個Java專案consumer Banking。轉到“建立Java專案”章節,瞭解如何使用Maven建立專案。
單擊“完成”按鈕。

現在,您可以在Eclipse中看到Maven專案。

現在,讓我們看一下**consumer Banking**專案的屬性。您可以看到Eclipse已將Maven依賴項新增到Java構建路徑。

現在,是時候使用Eclipse的Maven功能構建此專案了。
- 右鍵單擊consumerBanking專案以開啟上下文選單。
- 選擇“Run as”選項。
- 然後選擇“maven package”選項。
Maven將開始構建專案。您可以在Eclipse控制檯中看到如下輸出:
[INFO] Scanning for projects... [INFO] [INFO] ----------------< com.companyname.bank:consumerBanking >---------------- [INFO] Building consumerBanking 1.0-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ consumerBanking --- [INFO] Deleting C:\MVN\consumerBanking\target [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ consumerBanking --- [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory C:\MVN\consumerBanking\src\main\resources [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ consumerBanking --- [INFO] Changes detected - recompiling the module! [WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent! [INFO] Compiling 1 source file to C:\MVN\consumerBanking\target\classes [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ consumerBanking --- [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory C:\MVN\consumerBanking\src\test\resources [INFO] [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ consumerBanking --- [INFO] Changes detected - recompiling the module! [WARNING] File encoding has not been set, using platform encoding Cp1252, i.e. build is platform dependent! [INFO] Compiling 1 source file to C:\MVN\consumerBanking\target\test-classes [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ consumerBanking --- [INFO] Surefire report directory: C:\MVN\consumerBanking\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.companyname.bank.AppTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.028 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ consumerBanking --- [INFO] Building jar: C:\MVN\consumerBanking\target\consumerBanking-1.0-SNAPSHOT.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 4.663 s [INFO] Finished at: 2021-12-13T17:34:27+05:30 [INFO] ------------------------------------------------------------------------
現在,右鍵單擊App.java。選擇**Run As**選項。然後選擇**Java Application**。

您將看到如下結果 -
Hello World!
Maven - NetBeans
NetBeans 6.7及更高版本內建支援Maven。對於早期版本,Maven外掛可在外掛管理器中獲得。在本例中,我們使用的是NetBeans 6.9。
NetBeans的一些功能如下所示:
您可以從NetBeans執行Maven目標。
您可以使用NetBeans自己的控制檯檢視Maven命令的輸出。
您可以使用IDE更新Maven依賴項。
您可以從NetBeans內部啟動Maven構建。
NetBeans根據Maven的pom.xml自動執行依賴項管理。
NetBeans從其工作區解析Maven依賴項,無需安裝到本地Maven儲存庫(需要依賴項專案位於同一工作區)。
NetBeans自動從遠端Maven儲存庫下載所需的依賴項和原始碼。
NetBeans提供用於建立新的Maven專案和pom.xml的嚮導。
NetBeans提供了一個Maven儲存庫瀏覽器,使您能夠檢視本地儲存庫和已註冊的外部Maven儲存庫。
以下示例將幫助您利用整合NetBeans和Maven的好處。
在NetBeans中開啟一個Maven專案
開啟NetBeans。
選擇**檔案選單 > 開啟專案**選項。
選擇專案位置,即使用Maven建立專案的資料夾。我們建立了一個Java專案consumerBanking。請參閱“建立Java專案”章節,瞭解如何使用Maven建立專案。

現在,您可以在NetBeans中看到Maven專案。看一下consumerBanking專案的庫和測試庫。您可以看到NetBeans已將其Maven依賴項新增到其構建路徑。

在NetBeans中構建Maven專案
現在,是時候使用NetBeans的Maven功能構建此專案了。
- 右鍵單擊consumerBanking專案以開啟上下文選單。
- 選擇“Clean and Build”選項。

Maven將開始構建專案。您可以在NetBeans控制檯中看到如下輸出:
NetBeans: Executing 'mvn.bat -Dnetbeans.execution = true clean install' NetBeans: JAVA_HOME = C:\Program Files\Java\jdk1.6.0_21 Scanning for projects... ------------------------------------------------------------------------ Building consumerBanking task-segment: [clean, install] ------------------------------------------------------------------------ [clean:clean] [resources:resources] [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent! skip non existing resourceDirectory C:\MVN\consumerBanking\src\main\resources [compiler:compile] Compiling 2 source files to C:\MVN\consumerBanking\target\classes [resources:testResources] [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent! skip non existing resourceDirectory C:\MVN\consumerBanking\src\test\resources [compiler:testCompile] Compiling 1 source file to C:\MVN\consumerBanking\target\test-classes [surefire:test] Surefire report directory: C:\MVN\consumerBanking\target\surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.companyname.bank.AppTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.023 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [jar:jar] Building jar: C:\MVN\consumerBanking\target\consumerBanking-1.0-SNAPSHOT.jar [install:install] Installing C:\MVN\consumerBanking\target\consumerBanking-1.0-SNAPSHOT.jar to C:\Users\GB3824\.m2\repository\com\companyname\bank\consumerBanking\ 1.0-SNAPSHOT\consumerBanking-1.0-SNAPSHOT.jar ------------------------------------------------------------------------ BUILD SUCCESSFUL ------------------------------------------------------------------------ Total time: 9 seconds Finished at: Thu Jul 19 12:57:28 IST 2012 Final Memory: 16M/85M ------------------------------------------------------------------------
在NetBeans中執行應用程式
現在,右鍵單擊App.java。選擇**執行檔案**選項。您將在NetBeans控制檯中看到結果。
NetBeans: Executing 'mvn.bat -Dexec.classpathScope = runtime -Dexec.args = -classpath %classpath com.companyname.bank.App -Dexec.executable = C:\Program Files\Java\jdk1.6.0_21\bin\java.exe -Dnetbeans.execution = true process-classes org.codehaus.mojo:exec-maven-plugin:1.1.1:exec' NetBeans: JAVA_HOME = C:\Program Files\Java\jdk1.6.0_21 Scanning for projects... ------------------------------------------------------------------------ Building consumerBanking task-segment: [process-classes, org.codehaus.mojo:exec-maven-plugin:1.1.1:exec] ------------------------------------------------------------------------ [resources:resources] [WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources, i.e. build is platform dependent! skip non existing resourceDirectory C:\MVN\consumerBanking\src\main\resources [compiler:compile] Nothing to compile - all classes are up to date [exec:exec] Hello World! ------------------------------------------------------------------------ BUILD SUCCESSFUL ------------------------------------------------------------------------ Total time: 1 second Finished at: Thu Jul 19 14:18:13 IST 2012 Final Memory: 7M/64M ------------------------------------------------------------------------
Maven - IntelliJ IDEA IDE整合
IntelliJ IDEA內建支援Maven。在本例中,我們使用的是IntelliJ IDEA社群版11.1。
IntelliJ IDEA的一些功能如下所示:
您可以從IntelliJ IDEA執行Maven目標。
您可以使用IntelliJ IDEA自己的控制檯檢視Maven命令的輸出。
您可以在IDE中更新Maven依賴項。
您可以從IntelliJ IDEA內部啟動Maven構建。
IntelliJ IDEA根據Maven的pom.xml自動執行依賴項管理。
IntelliJ IDEA從其工作區解析Maven依賴項,無需安裝到本地Maven儲存庫(需要依賴項專案位於同一工作區)。
IntelliJ IDEA自動從遠端Maven儲存庫下載所需的依賴項和原始碼。
IntelliJ IDEA提供用於建立新的Maven專案和pom.xml的嚮導。
以下示例將幫助您利用整合IntelliJ IDEA和Maven的好處。
在IntelliJ IDEA中建立新專案
我們將使用“新建專案”嚮導匯入Maven專案。
開啟IntelliJ IDEA。
選擇**檔案選單 > 新建專案**選項。
選擇“從現有模型匯入專案”。

- 選擇Maven選項

選擇專案位置,即使用Maven建立專案的資料夾。我們建立了一個Java專案consumerBanking。請參閱“建立Java專案”章節,瞭解如何使用Maven建立專案。

- 選擇要匯入的Maven專案。

- 輸入專案的名稱,然後單擊“完成”。

現在,您可以在IntelliJ IDEA中看到Maven專案。看一下consumerBanking專案的外部庫。您可以看到IntelliJ IDEA已將Maven依賴項新增到其構建路徑(位於Maven部分)。

在IntelliJ IDEA中構建Maven專案
現在,是時候使用IntelliJ IDEA的功能構建此專案了。
選擇consumerBanking專案。
選擇**構建選單 > 重新構建專案**選項
您可以在IntelliJ IDEA控制檯中看到輸出
4:01:56 PM Compilation completed successfully
在IntelliJ IDEA中執行應用程式
選擇consumerBanking專案。
右鍵單擊App.java以開啟上下文選單。
選擇**執行App.main()**

您將在IntelliJ IDEA控制檯中看到結果。
"C:\Program Files\Java\jdk1.6.0_21\bin\java" -Didea.launcher.port=7533 "-Didea.launcher.bin.path= C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 11.1.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.6.0_21\jre\lib\charsets.jar; C:\Program Files\Java\jdk1.6.0_21\jre\lib\deploy.jar; C:\Program Files\Java\jdk1.6.0_21\jre\lib\javaws.jar; C:\Program Files\Java\jdk1.6.0_21\jre\lib\jce.jar; C:\Program Files\Java\jdk1.6.0_21\jre\lib\jsse.jar; C:\Program Files\Java\jdk1.6.0_21\jre\lib\management-agent.jar; C:\Program Files\Java\jdk1.6.0_21\jre\lib\plugin.jar; C:\Program Files\Java\jdk1.6.0_21\jre\lib\resources.jar; C:\Program Files\Java\jdk1.6.0_21\jre\lib\rt.jar; C:\Program Files\Java\jdk1.6.0_21\jre\lib\ext\dnsns.jar; C:\Program Files\Java\jdk1.6.0_21\jre\lib\ext\localedata.jar; C:\Program Files\Java\jdk1.6.0_21\jre\lib\ext\sunjce_provider.jar; C:\Program Files\Java\jdk1.6.0_21\jre\lib\ext\sunmscapi.jar; C:\Program Files\Java\jdk1.6.0_21\jre\lib\ext\sunpkcs11.jar C:\MVN\consumerBanking\target\classes; C:\Program Files\JetBrains\ IntelliJ IDEA Community Edition 11.1.2\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.companyname.bank.App Hello World! Process finished with exit code 0