Maven 超详细全知识点整理
一、Maven 基础认知
1. 什么是 Maven
Maven 是 Apache 开源的项目管理和构建工具,基于 POM (Project Object Model,项目对象模型) 统一管理 Java 项目的:
- 编译
- 测试
- 打包
- 依赖管理
- 部署
- 文档生成
2. Maven 核心作用
- 标准化项目结构:所有 Maven 项目目录结构一致
- 自动依赖管理:自动下载 jar 包 + 处理依赖传递 + 解决冲突
- 一键构建项目:一条命令完成编译、测试、打包、部署
- 跨平台:Windows/Linux/Mac 通用
- 插件化扩展:支持编译、测试、打包、代码检查等插件
3. Maven 与 Ant/Gradle 区别
| 工具 | 特点 |
|---|---|
| Ant | 无规范、无依赖管理、配置繁琐 |
| Maven | 约定大于配置、依赖管理、生命周期标准化 |
| Gradle | 基于 Maven,兼容 Maven,DSL 语法更灵活 |
二、Maven 安装与环境配置
1. 下载 Maven
官网:maven.apache.org/ 版本选择:3.8.x / 3.9.x(稳定版)
2. 环境变量配置
Windows
- 解压 Maven 到无中文路径
- 新建系统变量:
- 变量名:
MAVEN_HOME - 变量值:Maven 解压路径
- 变量名:
- 编辑 Path:添加
%MAVEN_HOME%\bin - 验证:cmd 输入
mvn -v
Linux/Mac
# 解压
tar -zxvf apache-maven-xxx.tar.gz -C /usr/local/
# 配置环境变量
vim /etc/profile
export MAVEN_HOME=/usr/local/apache-maven-xxx
export PATH=$PATH:$MAVEN_HOME/bin
# 生效
source /etc/profile
# 验证
mvn -v
3. Maven 目录结构
apache-maven-xxx/
├── bin/ # 命令脚本(mvn、mvn.cmd)
├── boot/ # 类加载器
├── conf/ # 核心配置文件(settings.xml)
├── lib/ # 依赖 jar
└── LICENSE
三、Maven 核心配置文件
1. 两个核心配置文件
- settings.xml(全局配置)
- 位置1:
maven/conf/settings.xml(全局) - 位置2:
用户目录/.m2/settings.xml(用户级,优先级更高)
- 位置1:
- pom.xml(项目配置)
- 每个项目独有,定义项目信息、依赖、插件
2. settings.xml 核心配置
(1)本地仓库配置
<localRepository>D:\maven_repository</localRepository>
- 用于存储所有下载的 jar 包,默认:
C:\Users\用户名.m2\repository
(2)阿里云镜像(必须配置!)
解决下载慢、下载失败问题:
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
(3)JDK 版本配置
全局默认编译 JDK:
<profiles>
<profile>
<id>jdk1.8</id>
<activation>
<jdk>1.8</jdk>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
(4)私服配置(企业必备)
<servers>
<server>
<id>nexus-releases</id>
<username>admin</username>
<password>123456</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>admin</username>
<password>123456</password>
</server>
</servers>
四、Maven 标准项目结构(约定大于配置)
1. 单模块项目结构
项目名/
├── pom.xml # 核心配置文件
├── src/
│ ├── main/ # 主程序
│ │ ├── java/ # Java 源代码
│ │ ├── resources/ # 配置文件(mybatis、application.yml)
│ │ └── webapp/ # Web 项目页面(jsp、css、js)
│ └── test/ # 测试程序
│ ├── java/ # 测试代码
│ └── resources/ # 测试配置
└── target/ # 编译输出目录(class、jar、war)
2. 约定大于配置(Convention over Configuration)
Maven 提前规定好目录、文件、插件位置,不用手动配置,减少冗余配置。
五、POM.xml 核心标签详解
1. 基础信息标签
<!-- 项目坐标:唯一标识 -->
<groupId>com.company</groupId> <!-- 公司/组织域名(反写) -->
<artifactId>demo-project</artifactId> <!-- 项目名/模块名 -->
<version>1.0.0</version> <!-- 版本号 -->
<packaging>jar</packaging> <!-- 打包方式:jar/war/pom -->
<name>demo</name> <!-- 项目名 -->
<description>测试项目</description>
2. 版本号规范
SNAPSHOT:快照版本(开发中,不稳定,每次更新)RELEASE:正式版本(稳定,发布后不修改) 示例:1.0.0-SNAPSHOT、2.1.0-RELEASE
3. 依赖管理核心标签
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope> <!-- 依赖范围 -->
<optional>false</optional> <!-- 是否可选依赖 -->
</dependency>
</dependencies>
4. 依赖范围(scope)6 种(高频面试)
| scope | 主程序 | 测试 | 打包 | 说明 |
|---|---|---|---|---|
| compile | ✔ | ✔ | ✔ | 默认值,编译运行都需要 |
| test | ❌ | ✔ | ❌ | 仅测试(JUnit) |
| provided | ✔ | ✔ | ❌ | 已由容器提供(Servlet API) |
| runtime | ❌ | ✔ | ✔ | 运行时需要(JDBC 驱动) |
| system | ✔ | ✔ | ❌ | 本地 jar,不下载 |
| import | 仅在 dependencyManagement 中使用 |
5. 继承与聚合标签
(1)父工程 pom
<packaging>pom</packaging>
<!-- 子模块 -->
<modules>
<module>demo-common</module>
<module>demo-web</module>
</modules>
<!-- 统一管理版本 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.company</groupId>
<artifactId>demo-common</artifactId>
<version>1.0.0</version>
</dependency>
</dependencies>
</dependencyManagement>
(2)子模块 pom
<parent>
<groupId>com.company</groupId>
<artifactId>demo-parent</artifactId>
<version>1.0.0</version>
<relativePath>../pom.xml</relativePath>
</parent>
6. 构建插件标签
<build>
<plugins>
<!-- 编译插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
六、Maven 依赖机制(核心重点)
1. 依赖传递
A 依赖 B,B 依赖 C → A 自动依赖 C 示例:Spring-core → commons-logging
2. 依赖冲突解决原则(面试必问)
当同一个 jar 出现多个版本时,Maven 自动解决冲突:
- 路径优先:依赖路径越短,优先级越高
- 声明优先:路径相同,pom.xml 中先声明的优先
- 覆写优先:子 pom 优先于父 pom
3. 排除依赖(exclusions)
手动排除不需要的传递依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.23</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
4. 统一版本管理(dependencyManagement)
- 父工程定义版本,子工程直接引用,不实际引入依赖
- 作用:统一管理项目所有依赖版本,避免冲突
七、Maven 生命周期与命令
1. 三套独立生命周期
Maven 有 3 套生命周期,互相独立:
- clean:清理项目
- default:核心构建(编译、测试、打包、部署)
- site:生成项目站点
2. 生命周期阶段(执行后面会自动执行前面)
(1)clean 生命周期
pre-clean → clean → post-clean
clean:删除 target 目录
(2)default 生命周期(最重要)
validate → compile → test → package → install → deploy
- compile:编译 src/main/java
- test:运行测试代码
- package:打包成 jar/war
- install:安装到本地仓库
- deploy:部署到私服
(3)site 生命周期
生成项目文档、报告
3. 常用 Maven 命令(工作必备)
# 清理
mvn clean
# 编译
mvn compile
# 测试
mvn test
# 打包
mvn package
# 安装到本地仓库
mvn install
# 部署到私服
mvn deploy
# 清理+打包
mvn clean package
# 跳过测试打包
mvn clean package -Dmaven.test.skip=true
4. 命令与生命周期关系
执行一个阶段,自动执行前面所有阶段
例如:执行 mvn install → 自动执行 compile、test、package
八、Maven 插件机制
Maven 本身不执行构建,所有功能都由插件完成。
1. 常用插件
- maven-compiler-plugin:编译 Java 代码
- maven-surefire-plugin:运行测试
- maven-jar-plugin:打 jar 包
- maven-war-plugin:打 war 包
- spring-boot-maven-plugin:SpringBoot 可执行 jar
- maven-resources-plugin:处理资源文件
2. 插件目标(goal)
每个插件包含多个目标,例如:
compiler:compile:编译主代码compiler:testCompile:编译测试代码
九、Maven 多模块项目(企业开发标准)
1. 结构规范
parent-project(pom)
├── common(jar) # 工具类、实体类
├── dao(jar) # 数据访问
├── service(jar) # 业务逻辑
└── web(war) # 控制器、前端
2. 优势
- 代码解耦:分工明确
- 复用性高:common 被所有模块依赖
- 统一版本:父工程管理所有依赖版本
- 一键构建:父工程执行命令,所有模块自动构建
十、Maven 私服(Nexus)
1. 什么是私服
企业内部搭建的 Maven 仓库服务器,用于:
- 缓存中央仓库 jar,加速下载
- 存储公司内部私有 jar
- 统一管理依赖,安全可控
2. Nexus 仓库类型
- hosted:宿主仓库(公司内部 jar)
- releases:正式版
- snapshots:快照版
- proxy:代理仓库(代理中央仓库、阿里云)
- group:仓库组(统一入口,包含以上所有)
3. 项目配置私服
<repositories>
<repository>
<id>nexus</id>
<url>http://localhost:8081/repository/maven-public/</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<!-- 部署配置 -->
<distributionManagement>
<repository>
<id>nexus-releases</id>
<url>http://localhost:8081/repository/releases/</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<url>http://localhost:8081/repository/snapshots/</url>
</snapshotRepository>
</distributionManagement>
十一、Maven 高级特性
1. 动态版本号
<version>[1.0,2.0)</version> # 1.0 ≤ 版本 < 2.0
<version>1.0.+</version> # 最新补丁版
2. 多环境切换(profile)
开发/测试/生产环境切换:
<profiles>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>
命令:mvn clean package -Pdev
3. 依赖分析命令
# 查看依赖树
mvn dependency:tree
# 分析依赖冲突
mvn dependency:analyze
十二、Maven 常见问题与解决方案
1. 下载 jar 失败
- 解决方案:删除仓库里
.lastUpdated文件,配置阿里云镜像
2. 依赖冲突
- 解决方案:
dependency:tree查看冲突,使用exclusions排除
3. 编译版本错误
- 解决方案:pom 中指定 JDK 版本 1.8
4. 打包后配置文件无法读取
- 解决方案:resources 插件配置过滤
十三、Maven 高频面试题
- Maven 的核心概念?
- 依赖范围 scope 有哪些?
- 依赖冲突解决原则?
- Maven 生命周期有哪些?
- 什么是 SNAPSHOT 版本?
- dependencyManagement 与 dependencies 区别?
- Maven 私服作用?
- 如何排除传递依赖?