Maven构建体系中mvn vs mvnw区别
1.mvnw 与 mvn 的本质区别
| 对比项 | mvnw |
mvn |
|---|---|---|
| 全称 | Maven Wrapper | Maven 命令行客户端 |
| 执行文件 | ./mvnw(Linux/Mac)或 mvnw.cmd(Windows) |
系统环境变量中的 mvn |
| 依赖 | 不依赖系统安装的 Maven(自动下载指定版本) | 依赖系统已安装的 Maven |
| Maven 版本 | 项目内 .mvn/wrapper/maven-wrapper.properties 固定版本 |
取决于系统安装版本 |
| 场景 | CI/CD、多人协作、自动化构建 | 本地开发环境已统一 Maven 版本时使用 |
| 优点 | 构建结果可复现、一致性强 | 启动稍快、配置简单 |
| 缺点 | 初次执行会下载 wrapper + Maven | 不同机器版本不一致可能导致构建差异 |
总结一句话:
mvnw= 项目自带 Maven 版本mvn= 使用系统全局 Maven 版本
2.命令说明
1 | # 1. 仅安装根项目依赖 (不构建模块) |
这些命令使用 ./mvnw,说明项目里已有 Maven Wrapper(即 .mvn 目录 + mvnw 文件),是为了确保构建使用固定版本(比如 Maven 3.9.9),避免不同开发环境下的差异。
3.用 mvn 构建
可以,但要满足条件:
- 你本机或 CI 环境中已安装 Maven;
- Maven 版本与
mvnw指定版本一致(或兼容); - 环境变量
PATH中能找到mvn; - 项目构建脚本未依赖 wrapper 的路径逻辑。
命令改写示例:
1 | mvn install -N |
4.最佳实践
| 场景 | 推荐做法 |
|---|---|
| 多人协作项目 | ✅ 使用 ./mvnw(统一版本、无依赖系统环境) |
| CI/CD 构建(如 Jenkins/GitLab CI) | ✅ 使用 mvnw,保证一致性 |
| 本地开发环境已统一 Maven 版本 | ⚙️ 可使用 mvn 加快构建 |
| 容器化或可复现构建(Dockerfile) | ✅ 明确写 ./mvnw,防止环境漂移 |
5.结构图
flowchart TD
A[项目源码] -->|调用| B[mvnw Wrapper]
B -->|使用指定版本| C[下载 Maven 分发包]
C --> D[Maven 构建引擎]
D --> E[编译 / 测试 / 打包 / 部署]
A2[系统命令行] -->|调用| F[mvn 命令]
F -->|使用系统版本| D