Maven 是 Apache 基金會頂級項目,基於項目對象模型 (POM) 的軟件項目管理與構建工具。它統一了構建流程、依賴管理、項目資訊、插件生態,是 Java 生態事實標準構建工具 (Gradle 為強力挑戰者)。本文面向零基礎,覆蓋安裝配置、核心概念、HelloWorld 構建、測試、打包、依賴管理、倉庫遷移全流程。
| 概念 | 含義 | 類比 |
|---|---|---|
| POM (Project Object Model) | 項目坐標、依賴、構建配置的 XML 描述 (pom.xml) | 項目身份證 + 說明書 |
| 坐標 (GAV) | groupId:artifactId:version 唯一標識構件 | 群組:產品:版本 |
| 依賴 | 項目運行/構建所需的第三方 JAR | 原材料清單 |
| 倉庫 | 本地 (~/.m2/repository) / 遠程 (Central, 阿里云) 存儲構件 | 原材料倉庫 |
| 生命周期/階段 | clean → validate → compile → test → package → verify → install → deploy | 標準化生產流水線 |
| 插件/目標 | 實際執行構建任務的單元 (如 maven-compiler-plugin:compile) | 流水線上的機器人 |
| 繼承/聚合 | 父 POM 統一版本/配置;多模塊項目聚合構建 | 集團管控 / 總裝車間 |
JAVA_HOME、PATH
JAVA_HOME=D:\Java\jdk1.8.0_202
PATH=%JAVA_HOME%\bin;%PATH%
apache-maven-3.9.6-bin.zip (最新穩定版)D:\maven\apache-maven-3.9.6
M2_HOME=D:\maven\apache-maven-3.9.6
PATH=%M2_HOME%\bin;%PATH%
> mvn -version
Apache Maven 3.9.6 (....)
Maven home: D:\maven\apache-maven-3.9.6
Java version: 1.8.0_202, vendor: Oracle Corporation
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
HelloWorld
├── pom.xml
└── src
├── main
│ └── java
│ └── com
│ └── example
│ └── helloworld
│ └── HelloWorld.java
└── test
└── java
└── com
└── example
└── helloworld
└── HelloWorldTest.java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="https://maven.apache.org/POM/4.0.0"
xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>HelloWorld</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- JUnit 5 -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.10.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.10.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
package com.example.helloworld;
public class HelloWorld {
public String sayHello() { return "Hello Maven!"; }
public static void main(String[] args) { System.out.println(new HelloWorld().sayHello()); }
}
package com.example.helloworld;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
class HelloWorldTest {
@Test void testSayHello() { assertEquals("Hello Maven!", new HelloWorld().sayHello()); }
}
| 命令 | 作用 | 輸出產物 |
|---|---|---|
mvn clean | 刪除 target 目錄 | 乾淨工作區 |
mvn compile | 編譯主代碼 | target/classes |
mvn test-compile | 編譯測試代碼 | target/test-classes |
mvn test | 運行測試 (Surefire Plugin) | 測試報告 target/surefire-reports |
mvn package | 打包 (JAR/WAR) | target/HelloWorld-1.0-SNAPSHOT.jar |
mvn install | 安裝到本地倉庫 | ~/.m2/repository/com/example/HelloWorld/1.0-SNAPSHOT/ |
mvn deploy | 部署到遠程倉庫 (需配置 distributionManagement) | 遠程倉庫 |
mvn site | 生成項目站點文檔 | target/site |
mvn dependency:tree | 查看依賴樹 | 控制台輸出 |
mvn help:effective-pom | 查看合併後的有效 POM | 控制台輸出 |
> cd HelloWorld
> mvn clean compile
[INFO] Building jar: .../target/HelloWorld-1.0-SNAPSHOT.jar
> mvn test
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
> mvn package
[INFO] Building jar: .../target/HelloWorld-1.0-SNAPSHOT.jar
> java -cp target/HelloWorld-1.0-SNAPSHOT.jar com.example.helloworld.HelloWorld
Hello Maven!
網站:mvnrepository.com 或 search.maven.org
搜索 junit → 選擇 org.junit.jupiter:junit-jupiter → 複製依賴 XML 到 <dependencies>。
| Scope | 編譯類路徑 | 測試類路徑 | 運行類路徑 | 打包包含 | 典型場景 |
|---|---|---|---|---|---|
| compile (默認) | ✅ | ✅ | ✅ | ✅ | 業務核心依賴 (Spring, MyBatis, Jackson) |
| test | ❌ | ✅ | ❌ | ❌ | 測試框架 (JUnit, Mockito, AssertJ) |
| provided | ✅ | ✅ | ❌ | ❌ | 容器提供 (Servlet API, JSP API, JDBC 驅動) |
| runtime | ❌ | ✅ | ✅ | ✅ | 運行時才需 (JDBC 驅動, 日誌實現) |
| system | ✅ | ✅ | ❌ | ❌ | 本地 JAR (不推薦,破壞可移植性) |
| import | 僅在 dependencyManagement 中導入 BOM | Spring Boot BOM, Spring Cloud BOM |
<exclusion><groupId>...</groupId><artifactId>...</artifactId></exclusion><dependencyManagement> 統一版本,子模塊/項目引用時可省略版本號${user.home}/.m2/repository (Windows: C:\Users\用戶名\.m2\repository)
settings.xml文件位置:${M2_HOME}/conf/settings.xml (全局) 或 ${user.home}/.m2/settings.xml (用戶級,推薦)
<settings>
<localRepository>D:/maven/repository</localRepository>
<!-- 鏡像加速 (阿里云) -->
<mirrors>
<mirror>
<id>aliyun</id>
<name>Aliyun Maven</name>
<url>https://maven.aliyun.com/repository/public</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
</settings>
> mvn help:effective-settings | grep localRepository
D:\maven\repository
後續構建將下載 JAR 到 D:/maven/repository。
File → Settings → Build Tools → MavenD:\maven\apache-maven-3.9.6 (使用系統安裝版,而非 IDEA 內置)D:\maven\apache-maven-3.9.6\conf\settings.xml 或用戶級 settings.xml
Maven 核心
├── POM (坐標、依賴、構建、屬性、配置文件)
├── 生命周期 (clean, default, site) + 階段
├── 插件/目標 (Compiler, Surefire, JAR, WAR, Source, Javadoc, GPG...)
├── 倉庫 (本地、遠程、鏡像、快照/發布)
├── 依賴管理 (坐標、範圍、傳遞、調解、排除、BOM)
├── 繼承/聚合 (父 POM、模塊、版本鎖定)
├── 環境隔離 (Profile、Settings、Properties)
└── 最佳實踐
├── 標準目錄結構
├── 版本號語義化 (MAJOR.MINOR.PATCH[-SNAPSHOT])
├── 依賴範圍精準控制
├── 統一版本管理 (dependencyManagement + BOM)
├── 私服搭建
└── CI/CD 集成
掌握 Maven,不僅是會用幾條命令,而是理解標準化構建背後的工程哲學:約定優於配置、依賴可傳遞、構建可復用、過程可追溯。