mvnd 实战:从安装到 Fork 项目 CI 验证
mvnd 实战:从安装到 Fork 项目 CI 验证
Maven Daemon(mvnd)是 Apache Maven 的守护进程版本,通过常驻后台进程复用 JVM,显著提升构建速度。本文从原理剖析、Windows 安装实操、到 Fork 项目配合 GitHub Actions CI 验证的完整流程,一次性讲透。
一、mvnd 为什么比 mvn 快
一句话:mvn 每次都"开机关机",mvnd 一直"待机";mvn 一个一个干活,mvnd 一群人并行干活。
1.1 守护进程(Daemon)—— 省去 JVM 冷启动
mvn 的痛点:
你敲 mvn install
↓
启动 JVM (~1-2s)
↓
加载 Maven 核心 (~1-2s)
↓
加载所有插件 class (~2-3s)
↓
JIT 还在预热(前几个方法解释执行,慢)
↓
开始干活
↓
干完,JVM 关闭,所有缓存灰飞烟灭 💀每次构建 3-5 秒纯启动开销,啥事没干就花掉了。
mvnd 怎么搞:
第一次: 启动一个后台 daemon JVM(一次性付出启动成本)
↓
干活
↓
干完,daemon 不退出,待机等下一次 ✨
↓
你再敲 mvnd install
↓
直接复用 daemon,0 启动开销,立刻干活 🚀收益:第二次起,省掉 3-5 秒 + JIT 已经热了,热点代码直接跑机器码。
1.2 JIT 已预热 —— 热代码直接跑机器码
JVM 有个特性:同一段代码运行次数越多,JIT 编译得越激进,性能越好。
mvn每次冷启动,JIT 都从零开始观察 → 解释执行 → C1 编译 → C2 编译,慢热mvnddaemon 一直活着,第二次构建时所有 Maven 核心代码、常用插件代码都已经是 C2 编译过的本地机器码,飞起 ✈️
举例:Maven 核心的 XML 解析、依赖解析、文件 IO 包装类这些热点路径,mvnd 里早就编译成最优机器码了。
1.3 类加载器复用 —— 插件只加载一次
- mvn:每次构建重新加载 Maven 核心类、所有插件类(几千个类)
- mvnd:插件第一次加载后缓存在 daemon 里。例如
maven-compiler-plugin、maven-surefire-plugin这种重磅插件,第一次加载完,之后所有项目都不用再加载了
🎁 彩蛋:您电脑上跑过 mvnd 的项目越多,新项目第一次跑反而越快 —— 因为常用插件早就在 daemon 缓存里热着。
1.4 并行构建默认开启 + 智能化
- mvn:默认串行,模块一个一个来,需要手动加
-T参数 - mvnd:默认
-T1C(每核一个线程),多模块项目自动并行
💡 CI 里常用
mvnd -B -T1 clean verify(单线程,日志清晰)。本地用默认-T1C才真飞。
1.5 客户端/服务端架构 —— 客户端是原生程序
mvnd.exe (Native,GraalVM AOT 编译) ← 你敲的命令
↓ 本地 socket 通信
mvnd-daemon (JVM) ← 真正干活的mvnd.exe是 native 二进制,启动 < 50ms- 它只负责:解析参数 → 找 daemon → 转发命令 → 显示输出
- 对比
mvn.cmd—— 批处理脚本,每次还得启动一个 JVM
1.6 类比理解
| 场景 | mvn | mvnd |
|---|---|---|
| 比喻 | 每次叫外卖都新开个店 🏪 | 楼下 7-11 一直开着 🏬 |
| 司机 | 每次都得发动汽车热车 🚗 | 出租车一直怠速等客 🚕 |
| 厨师 | 每次都要重新点炉子 🔥 | 老灶头一直烧着 🍳 |
二、Windows 安装实操
2.1 环境信息
| 项目 | 值 |
|---|---|
| OS | Windows 11 AMD64 |
| JDK | Temurin 21.0.10 |
| Maven | 3.9.9 |
| 安装约定 | 工具统一放 C:\devSpace\ |
2.2 安装步骤
版本选择:1.0.3(与 CI 保持一致,避免本地和远端行为差异)
:: 1. 下载 mvnd 1.0.3 windows-amd64 zip
curl -L -o %TEMP%\mvnd-1.0.3.zip ^
https://github.com/apache/maven-mvnd/releases/download/1.0.3/maven-mvnd-1.0.3-windows-amd64.zip
:: 2. 解压到 C:\devSpace\
powershell -Command "Expand-Archive -Path '%TEMP%\mvnd-1.0.3.zip' -DestinationPath 'C:\devSpace\' -Force"
:: 3. 重命名为简洁路径(可选,原名为 maven-mvnd-1.0.3-windows-amd64)
ren C:\devSpace\maven-mvnd-1.0.3-windows-amd64 maven-mvnd-1.0.3
:: 4. 加用户 PATH
powershell -Command "$old=[Environment]::GetEnvironmentVariable('Path','User'); [Environment]::SetEnvironmentVariable('Path', $old + ';C:\devSpace\maven-mvnd-1.0.3\bin', 'User')"
:: 5. 新开 cmd 窗口验证
mvnd -v2.3 验证结果
Apache Maven Daemon (mvnd) 1.0.3 windows-amd64 native client
Apache Maven 3.9.11
Java version: 21.0.10, vendor: Eclipse Adoptium2.4 常见问题
Q: 启动时有 JAVA_HOME 警告?
WARNING: Falling back to finding JAVA_HOME by running java executable available in PATH.设置 JAVA_HOME 环境变量即可消除:
[Environment]::SetEnvironmentVariable('JAVA_HOME','C:\devSpace\EclipseAdoptium\jdk-21.0.10.7-hotspot','User')Q: 内存占用?
daemon 默认占 1-2GB 常驻。内存吃紧时:
mvnd --stop :: 停掉所有 daemon 释放内存
mvnd --status :: 看当前 daemon 状态Q: 配置改完不生效?
改了 settings.xml 或 pom 大版本后,mvnd --stop 重启 daemon。
三、Fork 项目 CI 验证流程
以 agentscope-java 为例,完整演示 Fork → 本地验证 → CI 验证 → 提 PR 的流程。
3.1 项目结构
| 仓库 | 地址 | 角色 |
|---|---|---|
| 主库 | agentscope-ai/agentscope-java | 上游 |
| Fork | amyaxy/agentscope-java | 您的副本 |
3.2 CI 配置分析
.github/workflows/maven-ci.yml 关键触发条件:
on:
push: # 任何分支 push 都触发 ✅
pull_request: # 任何 PR 都触发关键发现:push: 没有限制分支,所以 feature 分支 push 后会自动跑 CI。
CI 包含 4 个 Job:
| Job | 内容 | 说明 |
|---|---|---|
license | Apache License 头检查 + 依赖 License 检查 | 新文件必须带 License 头 |
module-sync | agentscope-all / agentscope-bom 同步性 | 新增模块必须同步注册 |
build | Ubuntu + Windows 双平台,JDK 17,mvnd 1.0.3 | mvnd -B -T1 clean verify |
codecov | 覆盖率上传 | 需要 CODECOV_TOKEN,fork 没配会红 |
⚠️ Codecov 红了别慌:fork 没配 token,coverage upload 那步会失败,但 build/test 通过就算实质通过。主库 PR 用主库的 secrets,不受影响。
3.3 完整操作流程
# 1. clone fork
cd E:\muyi-tech
git clone https://github.com/amyaxy/agentscope-java.git
cd agentscope-java
# 2. 添加 upstream,保持同步
git remote add upstream https://github.com/agentscope-ai/agentscope-java.git
git fetch upstream
git checkout main
git merge upstream/main
git push origin main
# 3. 基于最新 main 创建 feature 分支
git checkout -b feat_1590
# 4. 做修改 ...
# 5. 本地先自测(重要!省 CI 时间)
mvnd -B -T1 clean verify
# 6. License 头检查(CI 第一步会查)
# 看 .licenserc.yaml,新增文件要带 Apache 2.0 头
# 7. commit + push
git add .
git commit -m "feat: #1590 简述"
git push origin feat_1590Push 后打开 https://github.com/amyaxy/agentscope-java/actions 查看 CI 运行状态。
3.4 CI 通过后提 PR
直接访问:
https://github.com/agentscope-ai/agentscope-java/compare/main...amyaxy:agentscope-java:feat_1590PR 描述模板:
Fixes #1590
## What
<!-- 改了什么 -->
## How
<!-- 怎么改的 -->
## Test
- [ ] 本地 mvnd clean verify 通过
- [ ] fork CI 全绿3.5 注意事项
- License 头:新文件必须带 Apache 2.0 头,否则 license job 直接红
- Module Sync:新增 extension 模块必须同步加到
agentscope-all和agentscope-bom的 pom 里 - Codecov:想完全绿,去 codecov.io 给 fork 配 token,加到 Secrets 里命名
CODECOV_TOKEN - 主库 PR 的 CI:提 PR 后,主库 maintainer 通常需要 approve 才会跑 workflow(fork PR 默认受保护)
四、实战速查
:: 日常开发(飞快)
mvnd clean install
:: CI 复现(和远端行为一致)
mvnd -B -T1 clean verify
:: 内存吃紧时停掉 daemon
mvnd --stop
:: 看 daemon 状态
mvnd --status
:: batch 模式(日志和 mvn 一致,方便排查)
mvnd -B clean install五、总结
| 维度 | mvn | mvnd |
|---|---|---|
| JVM 启动 | 每次冷启动 3-5s | 守护进程复用,0 启动开销 |
| JIT | 每次从零预热 | 热代码已是 C2 机器码 |
| 类加载 | 每次重新加载 | 插件缓存复用 |
| 并行构建 | 需手动 -T | 默认 -T1C |
| 客户端 | 批处理脚本 + JVM | GraalVM Native < 50ms |
| CI/CD | 无差异 | 冷启动优势减弱 |
| 兼容性 | — | 完全兼容,命令参数一致 |
mvnd 快的本质 = 避免重复的 JVM 启动开销 + JIT 热编译积累 + 类加载缓存 + 默认并行构建
就像你雇了一个常驻工匠(mvnd),而不是每次干活都从人才市场临时招一个(mvn)。工匠对你的项目越来越熟,干活自然越来越快。