引言:什么是Maven?
Maven是Java项目管理和构建工具,用于依赖管理、项目构建和文档生成。
Maven类比:自动售货机
传统方式(手动下载jar):
- 需要什么jar,就去网上搜索下载
- 还需要下载它依赖的其他jar
- 版本冲突?自己解决!
Maven方式:
- 告诉Maven你需要什么
- Maven自动从仓库下载
- 自动解决依赖关系
- 就像扫码取货一样简单!
Maven坐标
Maven坐标是Maven定位仓库中jar包的唯一标识,由三个元素组成。
坐标三要素
| 元素 | 说明 | 示例 |
|---|---|---|
| groupId | 组织/公司名称 | com.alibaba |
| artifactId | 项目/模块名称 | druid |
| version | 版本号 | 1.2.16 |
依赖配置示例
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.14</version>
</dependency>
仓库类型
Maven使用仓库来存储依赖jar包。
三种仓库
| 仓库类型 | 说明 | 位置 |
|---|---|---|
| 本地仓库 | 本机存储依赖 | ~/.m2/repository |
| 远程仓库(私服) | 公司内部仓库 | nexus.公司.com |
| 中央仓库 | Maven官方仓库 | repo.maven.apache.org |
仓库优先级
查找顺序:
1. 本地仓库 - 有则直接使用
2. 私服仓库 - 有则下载到本地使用
3. 中央仓库 - 有则下载到本地使用
配置私服(settings.xml):
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
依赖作用域
作用域控制依赖在哪些阶段生效。
| 作用域 | 编译 | 测试 | 运行 | 说明 |
|---|---|---|---|---|
| compile | ✓ | ✓ | ✓ | 默认,全部有效 |
| test | ✓ | 仅测试时有效(如JUnit) | ||
| provided | ✓ | ✓ | 容器已提供(如Servlet API) | |
| runtime | ✓ | ✓ | 运行时需要(如JDBC驱动) | |
| system | ✓ | ✓ | 系统路径,不推荐 |
作用域示例
<!-- Spring Boot Web依赖(编译、测试、运行都需要) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<scope>compile</scope>
</dependency>
<!-- JUnit(仅测试需要) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Servlet API(编译、测试需要,运行时由容器提供) -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency>
<!-- JDBC驱动(编译不需要,运行时需要) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
依赖传递
Maven会自动传递依赖,不需要手动声明间接依赖。
依赖传递示意
项目A
├── spring-boot-starter-web
│ ├── spring-boot-starter
│ │ ├── spring-boot
│ │ └── spring-boot-autoconfigure
│ └── tomcat-embed-core
项目A只需要声明spring-boot-starter-web
其他依赖会自动传递进来!
依赖冲突与排除
<!-- 依赖冲突:两个依赖都引入了不同版本的log4j -->
<!-- 解决:排除不需要的传递依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
查看依赖树
# 查看项目依赖树
mvn dependency:tree
# 过滤查看特定依赖
mvn dependency:tree -Dincludes=com.alibaba:fastjson
# 分析依赖
mvn dependency:analyze
Maven生命周期
Maven有三个主要生命周期,每个生命周期包含多个阶段。
三大生命周期
| 生命周期 | 说明 | 常用阶段 |
|---|---|---|
| clean | 清理构建产物 | clean |
| default | 核心构建过程 | compile, test, package, install, deploy |
| site | 生成项目站点 | site |
常用命令
# 清理并编译
mvn clean compile
# 清理并打包(跳过测试)
mvn clean package -DskipTests
# 清理并安装到本地仓库
mvn clean install
# 运行测试
mvn test
# 生成项目站点
mvn site
# 跳过测试和检查
mvn clean package -DskipTests -Dmaven.test.skip=true
常用阶段说明
| 阶段 | 说明 |
|---|---|
| validate | 验证项目结构 |
| compile | 编译源代码 |
| test-compile | 编译测试代码 |
| test | 运行测试 |
| package | 打包(jar/war) |
| install | 安装到本地仓库 |
| deploy | 部署到远程仓库 |
pom.xml基本结构
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0">
<modelVersion>4.0.0</modelVersion>
<!-- 项目坐标 -->
<groupId>com.example</groupId>
<artifactId>my-project</artifactId>
<version>1.0.0</version>
<packaging>jar</packaging>
<!-- 项目属性 -->
<properties>
<java.version>17</java.version>
<maven.compiler.source>17</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!-- 依赖管理 -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.14</version>
</dependency>
</dependencies>
<!-- 构建配置 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Maven聚合与继承
聚合(多模块项目)
<!-- 父pom.xml -->
<project>
<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>
</project>
继承(统一版本管理)
<!-- 子模块pom.xml -->
<project>
<parent>
<groupId>com.example</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>module-a</artifactId>
<!-- 版本号继承父pom -->
</project>
依赖版本管理(DependencyManagement)
<!-- 父pom.xml -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 子模块中引入,不需要指定版本 -->
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<!-- 不写version,继承父pom -->
</dependency>
</dependencies>
常用Maven命令
mvn clean compile:清理并编译
mvn test:运行测试
mvn package:打包项目
mvn install:安装到本地仓库
mvn dependency:tree:查看依赖树
最佳实践
使用国内镜像:配置阿里云镜像加速下载
避免使用system作用域:不便于移植
统一版本管理:使用parent pom管理版本
排除不需要的传递依赖:避免冲突
小结
- Maven坐标:groupId + artifactId + version 唯一标识
- 仓库:本地仓库 → 私服 → 中央仓库
- 作用域:compile(默认)、test、provided、runtime
- 依赖传递:自动引入间接依赖,可用exclusions排除
- 生命周期:clean、default、site
- 常用命令:compile、test、package、install
- 聚合与继承:便于多模块项目管理