🔧 什么是 Maven?
Maven 是一个 Java 项目的构建工具,主要用于:
- 项目构建(比如编译、打包)
- 依赖管理(比如自动下载第三方 Jar 包)
- 项目管理(比如版本控制、模块化、多环境配置)
Maven 的核心是 POM(Project Object Model) 文件,也就是 pom.xml,它是你项目的说明书,告诉 Maven 怎么处理你的项目。
🧱 Maven 做了什么?
Maven 主要做三件事:
-
管理依赖
- 自动下载你项目所需的 jar 包
- 支持依赖传递(即 A 依赖 B,B 依赖 C,那 A 会自动获取 C)
-
标准化构建流程
- 提供一套 生命周期 和插件机制,统一构建(比如编译、测试、打包)
-
模块化项目管理
- 支持多模块项目(父子模块结构)
🏗️ Maven 项目结构(默认)
project
├── pom.xml // Maven核心配置文件
└── src
├── main
│ ├── java // 主代码
│ └── resources // 配置文件等资源
└── test
├── java // 测试代码
└── resources // 测试资源
📦 什么是 POM?
POM(Project Object Model)是 Maven 的配置文件 pom.xml,定义了:
- 项目名称、版本等元信息
- 依赖列表(dependencies)
- 插件和构建流程(plugins)
- 打包方式(如 jar、war)
- 模块(modules)等
示例:最小 pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" ...>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>myapp</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.7.3</version>
</dependency>
</dependencies>
</project>
🔁 构建生命周期(Lifecycle)
Maven 有三套主要生命周期,最常用的是 默认生命周期(default lifecycle):
常见阶段如下:
| 阶段 | 功能 |
|---|---|
validate | 验证项目结构是否正确 |
compile | 编译源代码 |
test | 编译并运行测试代码 |
package | 打包(如 jar、war) |
install | 安装到本地仓库 |
deploy | 发布到远程仓库 |
执行命令:
mvn clean package # 清除旧编译产物后打包
🧩 Maven 仓库
Maven 下载依赖包的地方叫做 仓库(Repository),有三种类型:
-
本地仓库(Local Repository)
默认在~/.m2/repository,你项目依赖的包会缓存到这里 -
中央仓库(Central Repository)
Maven 官方维护的大型仓库 -
私服仓库(Remote Repository)
公司内部搭建的,比如 Nexus、Artifactory
📁 settings.xml
配置 Maven 全局行为,比如:
- 本地仓库位置
- 私服地址
- 代理设置
位置:~/.m2/settings.xml
🧰 常用 Maven 命令
mvn clean # 清除 target 目录
mvn compile # 编译
mvn test # 执行测试
mvn package # 打包
mvn install # 安装到本地仓库
mvn dependency:tree # 查看依赖树
🧱 多模块项目(父子工程)
Maven 支持大型项目拆分为多个子模块,通过父 POM 管理。
父 pom.xml 示例:
<modules>
<module>module-a</module>
<module>module-b</module>
</modules>
📌 Maven 和 Gradle 的区别(简略)
| 项目 | Maven | Gradle |
|---|---|---|
| 语法 | XML(固定格式) | Groovy/Kotlin(灵活) |
| 学习曲线 | 简单 | 略陡 |
| 性能 | 慢(早期) | 快(增量构建) |
| 可读性 | 清晰但啰嗦 | 简洁但灵活性过高 |
✅ 总结一句话
Maven 是一个约定优于配置的 Java 项目构建管理工具,核心是通过 POM 文件实现依赖管理和构建自动化。
关于➡️本地仓库⬅️的常见问题
❓ 第一次运行 pom.xml,会下载依赖吗?
是的!当你第一次运行 Maven 命令(如 mvn compile、mvn package 等)时,Maven 会读取 pom.xml,解析出依赖项,然后:
- 先查你本地仓库(默认在
~/.m2/repository)有没有对应依赖; - 如果没有,就从 中央仓库 下载依赖;
- 下载完的依赖会缓存在本地仓库中,下次不再下载。
❓ 什么操作会导致依赖“下载到仓库里”?
只要你执行任何会解析依赖的命令(如以下这些),依赖就会被下载到本地仓库:
mvn compile
mvn test
mvn package
mvn dependency:resolve
❓ 当我更新 pom.xml(比如加了个依赖),依赖仓库会改变吗?
✅ 会下载新依赖,但旧的不会删除或改变。
解释:
- Maven 会检测新增的依赖;
- 如果新依赖本地没有,就会下载并放入本地仓库;
- 已存在的依赖不会被修改或重新下载(除非你强制刷新,见下一条)。
❓ 如果我修改了已有依赖的版本呢?
比如你将:
<version>1.0</version>
改成:
<version>1.1</version>
✅ 此时 Maven 会认为这是全新的依赖,并从仓库下载该版本,缓存到本地。
旧版本仍保留在本地仓库中(不会自动删除)!!!
❌ 如果我什么都没改,依赖仓库会自动更新吗?
❌ 不会自动变更!
- Maven 默认不会重新下载依赖,即使远程仓库上该依赖已更新(除非你加 SNAPSHOT 依赖)。
- SNAPSHOT 版本除外(见下一条)。
🔁 SNAPSHOT 依赖是例外!
如果你依赖的是:
<version>1.0-SNAPSHOT</version>
那么 Maven 会默认每次运行检查远程仓库是否有新版本,可能会重新下载。
你也可以配置 SNAPSHOT 的刷新频率(如每天、每次等)。
🧹 什么时候依赖会被更新或重下?
| 操作 | 会更新依赖吗? |
|---|---|
| 修改 pom 增加新依赖 | ✅ 是 |
| 修改依赖版本 | ✅ 是 |
| 使用 SNAPSHOT 依赖 | ✅ 是(条件) |
执行 mvn dependency:purge-local-repository | ✅ 会强制清除并重新下载 |
手动删掉 .m2/repository 某依赖 | ✅ 会重新下载 |
| 什么都不做再运行 | ❌ 不会 |
✅ 总结一句话:
Maven 只在你添加/修改依赖或首次构建时,才会从远程仓库下载依赖并保存到本地仓库。之后不会自动变动,除非你用的是 SNAPSHOT 或手动清理。

2393

被折叠的 条评论
为什么被折叠?



