Maven 与 Maven Wrapper

Maven 与 Maven Wrapper

Maven 与 Maven Wrapper(mvnw)对比


一、它们分别是什么

Maven --- Java 项目的"构建管家"。你的代码要编译、测试、打包、管依赖(比如要用 MySQL 驱动、Spring 框架),Maven 读你的 pom.xml 帮你干完所有这些事。

mvnw(Maven Wrapper) --- 就是一个 shell 脚本,自带自动下载 Maven 的能力。它确保任何机器、任何人,都用项目指定的同一个 Maven 版本来构建。


二、最直观的区别:第一次用的体验

传统 Maven mvnw
第一步 去官网下载 → 解压 → 配置 MAVEN_HOMEPATH 环境变量 → 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