一、先搞懂:Maven 到底解决了什么痛点?
假设你零基础写 Java 项目,会遇到 3 个经典麻烦:
- Jar 包地狱:要用 Spring、MySQL 驱动,得手动下载 jar,版本选错就报错;jar 之间还会冲突(A 包需要 log4j1,B 包需要 log4j2)。
- 项目结构混乱:有的人代码放 src,有的人新建 java 文件夹,没有统一标准。
- 打包、编译麻烦:编译
javac、打包jar命令手动敲,项目大了极其繁琐。
Maven 定位:Java 项目构建工具 + 依赖管理工具核心两件事:✅依赖管理:只需要写配置,自动下载 jar、自动解决 jar 冲突✅项目构建:一键编译、测试、打包、部署
类比理解:前端的 npm、yarn;Python 的 pip。Maven 就是 Java 界的包管理工具。
二、Maven 核心概念(必须先看懂,不然后续一脸懵)
1. 仓库(Repository)
Maven 所有 jar 包都存放在仓库,分三类:
- 本地仓库:电脑本地文件夹,第一次下载 jar 会保存这里,后续项目直接复用,不用重复下载。
默认路径:
C:\Users\用户名\.m2\repository(Windows) - 中央仓库:Maven 官方远程仓库,互联网默认源,全世界共用。缺点:国内访问慢。
- 远程仓库(私服 / 镜像)
- 阿里云 Maven 镜像:国内加速下载(日常开发必配)
- 公司私服:企业内部存放私有 jar
下载顺序:本地仓库 → 镜像 / 私服 → 中央仓库
2. 坐标 (GAV) — Maven 定位 Jar 的唯一标识
所有 jar 包通过 3 个参数精准找到,写在 pom.xml 中
<!-- GAV三要素 --> <groupId>组织/公司名(反向域名)</groupId> <artifactId>项目/模块名称</artifactId> <version>版本号</version>示例 MySQL 驱动:
<groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version>3. POM 文件(Project Object Model)
文件名固定:pom.xml,Maven 项目的核心配置文件没有 pom.xml,文件夹就不是 Maven 项目。所有依赖、打包方式、插件、项目配置全部写在这里。
4. 标准 Maven 目录结构(约定优于配置!重点)
Maven 强制一套通用目录,不用自己新建文件夹:
项目根目录 ├── pom.xml # 核心配置文件 └── src ├── main │ ├── java # 【业务源代码】.java文件 │ └── resources # 配置文件:application.properties、xml等 └── test ├── java # 【单元测试代码】 └── resources # 测试环境配置文件约定优于配置:遵循这套结构,不用写大量配置;如果目录改名,才需要额外配置。
三、环境安装与配置(零基础实操)
1. 安装 Maven
- 官网下载:apache-maven 压缩包(选择二进制 bin 包)
- 解压到无中文、无空格路径,例:
D:\software\maven - 配置环境变量
MAVEN_HOME= maven 解压目录- Path 新增:
%MAVEN_HOME%\bin
- 验证:打开 cmd 输入
mvn -v输出版本信息 = 安装成功
2. 核心配置:settings.xml
路径:maven/conf/settings.xml(全局配置)
重点修改两处:本地仓库路径、阿里云镜像
① 修改本地仓库(可选,建议自定义)
<localRepository>D:/maven/repository</localRepository>② 配置阿里云镜像【最重要!解决下载慢】
找到<mirrors>标签,粘贴:
<mirror> <id>aliyunmaven</id> <mirrorOf>central</mirrorOf> <name>阿里云公共仓库</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>四、Maven 常用命令(cmd / 终端执行)
所有命令格式:mvn 指令,必须在 pom.xml 所在文件夹执行
表格
| 命令 | 作用 |
|---|---|
mvn clean | clean:清理,删除编译产生的 target 文件夹 |
mvn compile | 编译源代码,生成 class 文件,放在 target |
mvn test | 执行 test 目录下所有单元测试 |
mvn package | 打包!生成 jar 包 /war 包(存放在 target) |
mvn install | 打包后,把当前项目 jar 安装到本地仓库,其他项目可以引用 |
mvn deploy | 发布 jar 到远程私服(企业开发使用) |
✅ 组合写法(日常高频)
# 清理+编译+打包 mvn clean package # 清理+打包+安装到本地仓库 mvn clean installtarget 文件夹:Maven 所有编译、打包输出文件,不要手动修改。
五、pom.xml 详解,从零手写一个最简 pom
最简基础模板
<?xml version="1.0" encoding="UTF-8"?> <!-- 固定头部,项目模型版本,不用修改 --> <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> <!-- 当前项目GAV坐标 --> <groupId>com.demo</groupId> <artifactId>maven-demo</artifactId> <version>1.0-SNAPSHOT</version> <!-- 打包方式:jar普通Java项目;war web项目;pom父工程 --> <packaging>jar</packaging> <!-- 项目名称(可选) --> <name>Maven入门Demo</name> <!-- ======== 依赖区域:所有需要导入的jar包写在这里 ======== --> <dependencies> <!-- 示例:mysql驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> <!-- Junit单元测试依赖 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <!-- scope:作用范围,test代表只在测试代码生效 --> <scope>test</scope> </dependency> </dependencies> </project>重点标签:scope(依赖范围,面试高频)
<scope>控制 jar 什么时候生效,4 种常用值:
- compile(默认):编译、测试、运行都有效,绝大部分依赖
- test:仅单元测试有效,打包不会带入(junit)
- provided:编译测试有效,运行时容器提供(例如 servlet-api,tomcat 自带)
- runtime:编译无效,运行、测试有效(mysql 驱动)
六、依赖冲突(Maven 最常见问题,架构师重点)
冲突场景
项目 A 引入 log4j1,项目 B 引入 log4j2,两个版本 jar 同时存在,程序直接报错。
Maven 自动调解规则(就近优先)
- 路径最短优先:直接引入的包 > 间接传递依赖包
- 先声明优先:路径一样,pom.xml 写在前面的版本生效
手动解决冲突
使用<exclusions>排除不需要的传递依赖
<dependency> <groupId>org.springframeword</groupId> <artifactId>spring-core</artifactId> <version>5.3.20</version> <!-- 排除内部自动携带的冲突jar --> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> </exclusions> </dependency>IDEA 查看依赖树
命令查看依赖树:
mvn dependency:tree可以直观看到所有传递进来的 jar 包,定位冲突。
七、IDEA 整合 Maven(开发必用)
- IDEA 新建项目 → 选择 Maven
- File → Settings → Build,Execution → Build Tools → Maven
- Maven home path:选择自己安装的 maven(不要用 IDEA 自带)
- User settings file:勾选,选择自己的
settings.xml
- 右侧 Maven 面板,可以直接点击 clean、package 等按钮,不用敲命令
重要提示
修改 pom.xml 后,刷新 Maven 按钮,IDEA 才会自动下载依赖。
八、SNAPSHOT 和 Release 版本区分
1.0-SNAPSHOT:快照版本,开发测试版本,随时更新1.0:Release 正式稳定版,不会变动企业规范:开发用 Snapshot,上线发布使用 Release
九、高级概念快速预习(零基础先了解,后续进阶)
- 父工程 pom(pom 打包):多模块项目统一管理版本,统一定义依赖,避免每个子模块重复写版本号(SpringBoot 底层大量使用)
- dependencyManagement:统一管理依赖版本,子模块引入时不用写 version
- 多模块项目:大型项目拆分成多个 module(微服务常用)
- Maven 插件:编译插件、打包插件、springboot 打包插件
spring-boot-maven-plugin
十、零基础入门实操路线(建议跟着动手)
- 安装 Maven,配置 settings.xml 阿里云镜像
- 手动创建标准 maven 目录结构,新建 pom.xml
- 在 dependencies 添加 mysql 依赖
- 执行
mvn clean compile观察自动下载 jar - 编写简单 Java 代码测试,执行
mvn package打包 - 导入 IDEA,尝试新增依赖、观察依赖树
常见新手坑总结
- pom.xml 路径有中文、空格 → 下载异常
- 没配置阿里云镜像 → jar 下载卡住、失败
- 命令执行位置不对,不在 pom 同级目录运行 mvn 指令
- 依赖 GAV 坐标写错,大小写、名字错误,找不到 jar
- 依赖冲突导致启动报错,不会使用 dependency:tree 排查