Maven 与 Maven Wrapper
Maven 与 Maven Wrapper(mvnw)对比
一、它们分别是什么
Maven --- Java 项目的"构建管家"。你的代码要编译、测试、打包、管依赖(比如要用 MySQL 驱动、Spring 框架),Maven 读你的 pom.xml 帮你干完所有这些事。
mvnw(Maven Wrapper) --- 就是一个 shell 脚本,自带自动下载 Maven 的能力。它确保任何机器、任何人,都用项目指定的同一个 Maven 版本来构建。
二、最直观的区别:第一次用的体验
| 传统 Maven | mvnw | |
|---|---|---|
| 第一步 | 去官网下载 → 解压 → 配置 MAVEN_HOME 和 PATH 环境变量 → source ~/.zshrc |
什么都不用装 |
| 使用命令 | mvn clean package |
./mvnw clean package |
| 新同事 clone 项目后 | "你装 Maven 了吗?哪个版本?我 3.8 行不行?" | 直接 ./mvnw,完事 |
三、一个生活化的类比
传统 mvn 就像你电脑上装的 Photoshop------要安装、要激活,换了电脑还得重装一遍。
mvnw 就像U 盘里的绿色版 Photoshop------插上去双击就能用,不写注册表,用完拔走,换哪台电脑都一样。
再多一层:mvnw 不仅是绿色软件,还是会自动下载的绿色软件 。第一次运行它发现本地没有 Maven,就自己去 Apache 官网下载,然后缓存到 ~/.m2/wrapper/dists/,以后就用缓存的,不再下载。
第一次 ./mvnw:下载 Maven → 缓存到本地 → 执行构建
第二次及以后:直接用缓存 → 执行构建(秒启)
四、锁定版本的意义
如电脑上三个不同项目用了三个不同版本的 Maven:
~/.m2/wrapper/dists/
├── apache-maven-3.6.3 ← 老项目 A 指定
├── apache-maven-3.9.9 ← 项目 B 指定
└── apache-maven-3.9.16 ← 当前项目 C 指定
各用各的,互不干扰。不会出现"我 3.9 能构建,你 3.6 就报错"这种版本不一致导致的诡异问题。
五、核心对比表
| 传统 Maven | Maven Wrapper | |
|---|---|---|
| 安装方式 | 手动下载、解压、配环境变量 | 无需安装,就是一段脚本 |
| 命令 | mvn |
./mvnw |
| Maven 本体位置 | 你指定的某个目录 | 自动下载到 ~/.m2/wrapper/dists/ |
| 依赖环境变量 | MAVEN_HOME + PATH |
不需要,脚本自己知道路径 |
| 版本控制 | 全机器共用同一个版本 | 每个项目锁定自己的版本 |
| 新机器上手 | 装 Maven → 配环境变量 | clone 项目 → ./mvnw |
| 适合场景 | 个人固定机器 | 团队协作、CI/CD |
六、一句话总结
mvn 是你电脑上装的;mvnw 是项目自带的。
装 mvn 像给整台电脑装软件,需要环境变量;mvnw 像每个项目自备一份绿色版 Maven,项目走到哪 Maven 跟到哪。
补充-Maven / mvnw 常用命令
所有命令两者通用 ,只是前缀不同:mvn 换成 ./mvnw。
核心生命周期命令
| 命令 | 作用 |
|---|---|
mvn clean |
清空 target/ 目录,删除所有编译产物 |
mvn compile |
编译 src/main/java 下的源码 |
mvn test |
运行所有单元测试 |
mvn package |
编译 → 测试 → 打包(jar 或 war) |
mvn install |
打包 → 安装到本地仓库 ~/.m2/repository/,供其他项目引用 |
mvn deploy |
打包 → 上传到远程仓库(私有/公有 Nexus、Artifactory) |
日常高频命令
| 命令 | 作用 |
|---|---|
mvn clean package |
最常用:清空 → 打包,跳过单元测试用下面的 |
mvn clean package -DskipTests |
清空 → 打包,跳过测试执行 |
mvn clean package -Dmaven.test.skip=true |
清空 → 打包,连测试编译都跳过 |
mvn spring-boot:run |
直接运行 Spring Boot 项目 |
mvn dependency:tree |
查看完整的依赖树,排查依赖冲突必备 |
mvn clean package -DskipTests && java -jar target/xxx.jar |
打完包直接运行 |
指定文件/模块
| 命令 | 作用 |
|---|---|
mvn clean package -f pom.xml |
指定 pom 文件构建(多模块项目用) |
mvn clean package -pl 模块名 |
只构建指定子模块 |
mvn clean package -pl 模块名 -am |
构建指定模块 + 它依赖的模块 |
测试相关
| 命令 | 作用 |
|---|---|
mvn test |
运行全部测试 |
mvn test -Dtest=UserServiceTest |
只跑指定测试类 |
mvn test -Dtest=UserServiceTest#testLogin |
只跑指定测试方法 |
版本/检查
| 命令 | 作用 |
|---|---|
mvn --version |
查看 Maven 和 JDK 版本 |
mvn validate |
验证项目结构是否正确 |
mvn versions:display-dependency-updates |
查看哪些依赖有更新版本 |
快速记忆
clean → 清空
compile → 编译
test → 测试
package → 打包
install → 装到本地仓库
最常用就这一条:
./mvnw clean package -DskipTests