Maven构建体系中mvn vs mvnw区别

1.mvnwmvn 的本质区别

对比项 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
2
3
4
5
6
7
8
# 1. 仅安装根项目依赖 (不构建模块)
./mvnw install -N

# 2. 构建 backend 模块,跳过测试与 Jenkins 的 ant 任务
./mvnw clean install -DskipTests -DskipAntRunForJenkins --file backend/pom.xml

# 3. 打包项目,跳过测试
./mvnw clean package -DskipTests

这些命令使用 ./mvnw,说明项目里已有 Maven Wrapper(即 .mvn 目录 + mvnw 文件),是为了确保构建使用固定版本(比如 Maven 3.9.9),避免不同开发环境下的差异。


3.用 mvn 构建

可以,但要满足条件:

  1. 你本机或 CI 环境中已安装 Maven;
  2. Maven 版本与 mvnw 指定版本一致(或兼容);
  3. 环境变量 PATH 中能找到 mvn
  4. 项目构建脚本未依赖 wrapper 的路径逻辑。

命令改写示例:

1
2
3
mvn install -N
mvn clean install -DskipTests -DskipAntRunForJenkins --file backend/pom.xml
mvn clean package -DskipTests

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