Maven 入门教程
FreeGuideOnline
最新
2026-07-14
bash mvn -version
输出应显示 Maven 版本、Java 版本和操作系统信息。
### 配置本地仓库与镜像
Maven 默认本地仓库位于 `~/.m2/repository`(Windows 在 `C:\Users\用户名\.m2\repository`)。为提高下载速度,推荐配置阿里云镜像。
编辑 `conf/settings.xml`(全局)或 `~/.m2/settings.xml`(用户级),添加:
```xml
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
核心概念:坐标与 POM
每个 Maven 项目通过 坐标 唯一标识:
- groupId:组织或公司域名反写,如
com.example - artifactId:项目名称或模块名,如
my-app - version:项目版本,如
1.0-SNAPSHOT(快照版本)或1.0.0(正式版) - packaging:打包类型,默认
jar,也可为war、pom等
POM(Project Object Model) 是 Maven 项目的核心配置文件,名为 pom.xml,所有构建规则、依赖、插件均在此定义。
第一个 Maven 项目
使用原型(Archetype)快速创建
mvn archetype:generate -DgroupId=com.example -DartifactId=hello-maven -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
执行后得到标准目录结构:
hello-maven
├── pom.xml
└── src
├── main/java/com/example/App.java
└── test/java/com/example/AppTest.java
App.java 默认打印 “Hello World!”。
项目目录约定
项目根目录
│ pom.xml
└── src
├── main
│ ├── java # 应用程序源码
│ ├── resources # 配置文件、资源文件
│ └── webapp # Web 应用前端资源(如为 war 模块)
└── test
├── java # 测试源码
└── resources # 测试资源
target/为构建输出目录,编译 class、打包后 jar 等均在此,无需版本控制。
依赖管理
Maven 通过在 pom.xml 的 <dependencies> 中声明坐标来引入外部库。
基本依赖声明示例
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.14.0</version>
</dependency>
</dependencies>
保存后 Maven 将自动下载该 jar 及其传递依赖至本地仓库,并加入 classpath。
依赖范围(scope)
通过 scope 控制依赖生效的类路径范围:
| 范围 | 编译 | 测试 | 运行 | 打包 | 典型场景 |
|---|---|---|---|---|---|
| compile(默认) | ✔ | ✔ | ✔ | ✔ | 常用框架 |
| provided | ✔ | ✔ | ✘ | ✘ | Servlet API(由容器提供) |
| runtime | ✘ | ✔ | ✔ | ✔ | JDBC 驱动 |
| test | ✘ | ✔ | ✘ | ✘ | JUnit、测试工具 |
| system | ✔ | ✔ | ✘ | ✘ | 本地 jar(不推荐) |
传递性依赖与冲突解决
- 传递性依赖:A 依赖 B,B 依赖 C,则 A 自动获得 C(依赖传递)。
- 依赖冲突:当多个依赖引入同一个 jar 的不同版本时,Maven 采用 最短路径优先 原则;路径相同则 先声明者优先。
- 通过
<exclusions>排除不需要的传递依赖:
<dependency>
<groupId>...</groupId>
<artifactId>...</artifactId>
<exclusions>
<exclusion>
<groupId>冲突组ID</groupId>
<artifactId>冲突构ID</artifactId>
</exclusion>
</exclusions>
</dependency>
- 查看依赖树命令:
mvn dependency:tree,便于定位冲突。
Maven 生命周期与插件
Maven 定义了三套相互独立的生命周期,每个生命周期由多个阶段组成:
- clean:清理项目(仅
clean阶段) - default:核心构建(编译、测试、打包、安装、部署等)
- site:生成项目站点文档
常用 default 生命周期阶段
| 阶段 | 作用 |
|---|---|
| validate | 验证项目是否正确且所有必要信息可用 |
| compile | 编译源代码 |
| test | 运行单元测试(使用 surefire 插件) |
| package | 将编译后代码打包成 jar / war 等 |
| verify | 集成测试等校验 |
| install | 将包安装到本地仓库,供其他本地项目依赖 |
| deploy | 将包部署到远程仓库(如私服中央仓库) |
执行某个阶段时,之前的所有阶段会按顺序自动执行。例如 mvn package 会先 validate、compile、test 再 package。
插件(Plugin)
Maven 所有功能均由插件实现,插件绑定到生命周期阶段上执行。
- 核心插件:如
maven-compiler-plugin(编译)、maven-surefire-plugin(测试) - 可配置插件参数,例如指定 Java 编译版本:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
</build>
常见构建命令
# 清理 target 目录
mvn clean
# 编译源代码
mvn compile
# 运行测试
mvn test
# 打包(生成 jar/war)
mvn package
# 安装到本地仓库
mvn install
# 跳过测试进行打包
mvn package -DskipTests
# 查看依赖树
mvn dependency:tree
# 生成 Eclipse 项目文件
mvn eclipse:eclipse
多模块项目
当一个项目包含多个子模块时,可以通过聚合 POM 管理:
根目录 pom.xml 的 <packaging> 为 pom,并使用 <modules> 声明子模块:
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<modules>
<module>module-a</module>
<module>module-b</module>
</modules>