Maven
Maven 是什么
Maven 是 Apache 旗下的开源项目,一款用于管理和构建 Java 项目的工具 。官网:maven.apache.org/
核心作用就三个:
- 依赖管理:自动下载和管理 jar 包,解决版本冲突。不用再手动拷贝 jar 到 lib 目录了。
- 项目构建:提供标准化的跨平台自动化构建方式------编译、测试、打包、发布一条龙。
- 统一项目结构:约定优于配置,所有 Maven 项目结构一致,降低团队协作成本。
核心概念
Maven 的整体架构可以用五个核心概念来概括:
1. 项目对象模型(POM)
POM 是 Maven 的心脏,对应项目根目录下的 pom.xml 文件。它描述了项目的基本信息、依赖关系、构建配置等所有内容。Maven 一切都是围绕着 pom.xml 来运转的。
2. 依赖管理模型(Dependency)
在 pom.xml 中声明项目需要哪些第三方库,Maven 自动从仓库下载。依赖之间还存在传递性 ------你引了 A,A 又依赖 B、C,Maven 会自动把 B 和 C 也拉下来。如果不需要某个传递依赖,可以通过排除依赖把它去掉。
3. 构建生命周期(Build Lifecycle)
Maven 定义了三套独立的生命周期:
| 生命周期 | 作用 | 常用阶段 |
|---|---|---|
| clean | 清理 | 删除上次构建产物 |
| default | 核心构建 | compile → test → package → install → deploy |
| site | 站点生成 | 生成项目报告文档 |
阶段是有顺序的 ,执行后面的阶段会自动触发前面的阶段。比如执行 package,它会先执行 compile、再执行 test,最后才打包。
常用命令:
mvn clean:清理mvn compile:编译源代码mvn test:运行单元测试mvn package:打包成 jar/warmvn install:安装到本地仓库
4. 插件(Plugin)
生命周期本身只是定义了"做什么",但"具体怎么做"是由插件来实现的。每个阶段背后都有对应的插件在工作。Maven 本质上是一个插件执行框架。
5. 仓库(Repository)
Maven 的仓库是用来存储和管理 jar 包的,分三类,查找顺序如下:
本地仓库(你电脑上) → 远程仓库/私服(公司内部) → 中央仓库(Maven 官方)
查找依赖时按这个顺序依次找,找到了就停。如果一路都没找到,就报错了。

Maven 安装
-
下载并解压 apache-maven 压缩包
-
配置本地仓库:修改
conf/settings.xml中的<localRepository>标签,指定一个目录xml<localRepository>D:\develop\apache-maven-3.9.4\mvn_repo</localRepository> -
配置镜像(如阿里云):修改
<mirrors>标签,加速下载xml<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> <mirrorOf>central</mirrorOf> </mirror> -
配置环境变量:设
MAVEN_HOME为解压目录,把bin目录加到PATH -
验证:
mvn -v
IDEA集成Maven
-
配置Maven环境(全局)




-
创建Maven项目
-
创建模块,选择New Module,填写模块信息,选择构建工具为Maven,点击create,创建完成
-
编写 HelloWorld,并运行

-
Maven 坐标
坐标是资源(jar)的唯一标识,由三部分组成:
| 组成部分 | 含义 | 示例 |
|---|---|---|
| groupId | 组织名称,通常域名反写 | com.company |
| artifactId | 模块/项目名称 | order-service |
| version | 版本号 | 1.0.0 |
版本分类:
SNAPSHOT:快照版本,功能不稳定、还在开发中RELEASE:发布版本,功能稳定、可以用于生产
代码示例
xml
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.27</version>
</dependency>
导入maven项目
- 方式一:File -> Project Structure -> Modules -> Import Module -> 选择maven项目的pom.xml

- 方式二:Maven面板 -> +(Add Maven Projects) -> 选择maven项目的pom.xml。

依赖管理
依赖配置
在 pom.xml 的 <dependencies> 标签里,用 <dependency> 引入坐标即可。配置变更后记得点刷新按钮重新加载。本地仓库没有的依赖需要联网下载。

依赖传递
Maven 的依赖具有传递性。比如你的项目 A 依赖了 B,B 又依赖了 C 和 D,那么 Maven 会自动把 C 和 D 也拉进你的项目中,不需要你手动声明。依赖传递遵循两条规则:
- 路径优先:路径短的优先
- 先声明优先 :路径长度相同时,
pom.xml里谁先声明用谁
依赖传递的好处是你不用关心间接依赖,但也会带来问题------比如传递进来的依赖和你的项目已有的依赖版本冲突,或者有些传递依赖你根本不需要。

排除依赖
有些传递依赖你不需要(比如版本冲突或者冗余),可以通过 <exclusions> 标签主动断开,被排除的资源不用指定版本。

依赖范围(scope)
通过 <scope> 标签控制依赖在什么环境下生效:
| scope值 | 主程序 | 测试程序 | 打包运行 | 典型用途 |
|---|---|---|---|---|
compile(默认) |
✓ | ✓ | ✓ | log4j |
test |
✗ | ✓ | ✗ | JUnit |
provided |
✓ | ✓ | ✗ | servlet-api |
runtime |
✗ | ✓ | ✓ | JDBC驱动 |
-
举两个典型例子说明为什么要控制依赖范围:
-
JUnit 用
test范围: JUnit 只在写单元测试和跑测试的时候需要,主程序根本用不到它,上线打包时更没必要把它打进去。如果把 JUnit 打进生产包,一来增大包体积,二来还可能和运行环境的框架产生莫名其妙的冲突。所以 scope 设成test,这个依赖就只在测试环境生效,到了主程序编码和打包运行时,Maven 自动把它排除掉。这样不同环境的依赖保持轻量化,测试归测试,生产归生产,互不干扰。
-
servlet-api 用
provided范围: 写代码和跑测试时需要它(import 它的类),但部署到 Tomcat 的时候,Tomcat 容器自己就带了这个 jar,你如果再打一份进去反而会冲突,所以 scope 设成provided------编译和测试阶段能用,打包时不带走。
-
Maven 生命周期
- Maven的生命周期就是为了对所有的maven项目构建过程进行抽象和统一。

-
Maven 有三套独立的生命周期:
- clean:清理工作。
- default:核心工作,如:编译、测试、打包、安装、部署等。
- site:生成报告、发布站点等。
-
每套生命周期包含一些阶段(phase),阶段是有顺序的,后面的阶段依赖于前面的阶段。

-
生命周期阶段
- clean:移除上一次构建生成的文件
- compile:编译项目源代码
- test:使用合适的单元测试框架运行测试(junit)
- package:将编译后的文件打包,如:jar、war等
- install:安装项目到本地仓库

-
每个生命周期都配有对应的插件

两种执行方式
- IDEA 右侧 Maven 面板:双击对应生命周期阶段
- 命令行 :
mvn clean、mvn compile、mvn package等
常见问题
依赖下载失败
- 现象:引入依赖后项目报错,jar 包找不到。
- 原因 :网络问题导致依赖下载不完整,Maven 仓库里生成了
.lastUpdated文件。有这个文件在,Maven 就不会重新下载。 - 解决 :找到仓库中对应的
.lastUpdated文件删掉,然后重新加载项目。可以批量递归删除:del /s *.lastUpdated。