mvnd

Maven Daemon 1.0+

Maven Daemon(mvnd)命令速查 —— 长驻 JVM 后台进程的 mvn 包装,所有 mvn 子命令均可直接使用,外加守护进程管理指令(--status / --stop / --shutdown)。

29 条命令

守护进程管理

mvnd --status

列出所有正在运行的 mvnd 守护进程:ID、JDK home、版本、运行时长、空闲时间、已完成/正在执行的构建数。脚本中可用 `-o plain` 输出纯文本。

-o plain|json 输出格式

mvnd --status
mvnd --stop

停止一个空闲的守护进程,需传入 `--status` 显示的守护进程 ID。除非加 `-y`,否则会提示确认。

-y 跳过确认

mvnd --stop 7d3c4e5f-a1b2-4c3d-9e0f-1234567890ab
mvnd --stop-all

关闭所有正在运行的 mvnd 守护进程。升级 JDK、切换 `JAVA_HOME`、或希望冷启动构建时使用。

mvnd --stop-all
mvnd --shutdown

`--stop-all` 的别名。行为一致;针对 mvnd 1.0+ 的脚本推荐用这个名字。

mvnd --shutdown
mvnd --version

打印 mvnd 版本、启动器的 Java 版本,以及守护进程所用 Maven 版本。可用来确认将创建或复用哪个守护进程。

mvnd --version
mvnd --create-daemon

强制用当前 JDK 和 Maven 版本新建一个守护进程,而非复用旧守护进程。切换 `JAVA_HOME` 后避免旧守护进程持有过期类数据时很有用。

--user <name> JVM 配置预设

mvnd --create-daemon clean install

生命周期阶段(mvn drop-in)

mvnd validate

校验项目:解析 `pom.xml`、下载快照版本、检查依赖。与 `mvn validate` 完全一致。

mvnd validate
mvnd compile

编译 `src/main/java` 到 `target/classes`。守护进程预热后比 `mvn compile` 显著更快——JIT 已优化过常用插件。

-DskipTests; -T 4 并行线程数(转发给 mvn)

mvnd compile
mvnd test

运行 Surefire 单元测试。测试仍 fork 新 JVM(隔离不变),加速仅体现在 Maven 侧。

-Dtest=ClassName; -Dtest=Class#method; -DfailIfNoTests=false

mvnd test -Dtest=UserServiceTest
mvnd package

运行此前所有阶段,然后把输出打包成 `target/*.jar`(或 `.war`/`.ear`)。

-DskipTests; -Dpackaging=jar

mvnd package -DskipTests
mvnd install

运行 verify,然后把生成的制品安装到 `~/.m2/repository/`,供本机其他项目依赖。

mvnd install -DskipTests
mvnd clean install

清空 `target/` 然后一路跑到 `install`。最常用的「从头重建」命令。守护进程跨过 `clean` 仍然存活,所以 mvnd 比 mvn 快很多。

-U 强制更新 snapshot 依赖

mvnd clean install -U
mvnd deploy

构建并把制品发布到 `pom.xml` 的 `<distributionManagement>` 指定的远程仓库。语义与 `mvn deploy` 一致。

-DskipTests; -P release 使用 release profile

mvnd deploy -P release -DskipTests

守护进程调优

mvnd -Dmvnd.daemonStorage=<path> <phase>

覆盖守护进程注册目录(默认 `~/.m2/mvnd/`)。按项目设独立路径可让每个 worktree 拥有自己的守护进程池。

mvnd -Dmvnd.daemonStorage=.mvnd clean install
mvnd -Dmvnd.idleTimeout=<duration> <phase>

守护进程空闲多久自动关闭。默认 3h。接受 `30s` / `5m` / `2h` / `1d`。

mvnd -Dmvnd.idleTimeout=30m test
mvnd -Dmvnd.maxHeap=<size> <phase>

限制守护进程 JVM 堆。默认 2G。其他工具争内存时调小;大型多模块 OOM 时调大。

mvnd -Dmvnd.maxHeap=4G clean install
mvnd -Dmvnd.threads=<n> <phase>

mvnd 同时保活的最大守护进程数。默认 = CPU 核数。调小可减少空闲内存;调大可让不同 JDK/Maven 组合并行。

mvnd -Dmvnd.threads=2 test
mvnd -Dmvnd.scheduler=simple|async <phase>

守护进程选择策略。`simple`(默认)选最近用过的;`async` 为每种 Maven/JDK 组合各保留一个守护进程并按需分派。JDK 切换频繁时用 `async`。

mvnd -Dmvnd.scheduler=async install

构建控制(透传给 mvn)

mvnd -DskipTests <phase>

跳过测试运行但仍编译测试代码。与 mvn 一致——mvnd 原样转发所有 `-D` 系统属性。

mvnd -DskipTests package
mvnd -T <n> <phase> / mvnd -T 1C <phase>

并行 reactor 构建:`-T 4` 表示 4 线程,`-T 1C` 表示每 CPU 核 1 线程。配合暖守护进程,`-T 1C clean install` 是 mvnd 下最快的全量构建。

mvnd -T 1C clean install
mvnd -B -ntp <phase>

批处理 / 非交互 / 不显示传输进度条。CI 推荐写法——mvnd 关闭进度条与 ANSI 颜色,日志解析更稳。

mvnd -B -ntp clean verify
mvnd -X <phase>

调试日志。打印每个插件执行与仓库查找。输出量大,建议重定向到文件。

-e 出错时打印完整堆栈

mvnd -X test > mvnd-debug.log 2>&1
mvnd -pl <module> -am <phase>

构建指定模块及其依赖。`-amd`(also-make-dependents)方向相反。标志位与 mvn 完全一致。

mvnd -pl user-service -am test
mvnd -s <settings.xml> <phase>

本次构建用指定的 `settings.xml` 覆盖 `~/.m2/settings.xml`。CI 用来指向镜像仓库或发布凭证。

mvnd -s ./.mvn/settings.xml deploy
mvnd -o <phase>

离线模式——本地仓库缺制品就失败。mvnd 原样转发此标志;守护进程只负责自己那份解析工作。

mvnd -o test

诊断

mvnd --log <phase>

把守护进程侧的 Maven 构建日志流式输出到前台(默认写到 `~/.m2/mvnd/<daemon-id>/daemon.log`)。调试只在守护进程内发生的失败时有用。

mvnd --log test
mvnd --purge

清空整个守护进程注册目录(默认 `~/.m2/mvnd/`)。JDK/Maven 大版本升级改变了字节码布局后,旧守护进程可能报莫名其妙的错——先 purge 再重建。

mvnd --purge
mvnd --help

列出所有 mvnd 专有标志(`--status` 家族)。完整的 Maven 标志(`-D` / `-P` / `-T` / `-pl` 等)见 `mvn --help`——mvnd 全都原样转发。

mvnd --help

包装器

./mvnw <phase>

通过 Maven Wrapper 跑构建。若想用 mvnd 透明替代,把 wrapper 软链/改名为 `mvndw`,或在 `.mvn/maven.config` 中改成调用 mvnd。

./mvnw clean install

相关命令速查

关于 Maven Daemon

Apache Maven Daemon(mvnd)是标准 `mvn` CLI 的包装,由 Peter Palaga 发起,经过多年孵化后在 Apache 软件基金会下推出,1.0.0 稳定版于 2024 年发布。mvnd 在后台维护一个或多个长驻 JVM 守护进程,并将每次构建请求分派给它们。它复用 Maven 3.x 的 `pom.xml`、`~/.m2/repository`、所有插件和生命周期阶段,因此是真·drop-in 替代品——`mvnd compile` 与 `mvn compile` 行为完全一致,只是更快。加速来自三个层面:(1)JVM 只启动一次并在多次构建间复用,跳过 `mvn` 每次调用 1-3 秒的 JVM 启动开销;(2)mvnd 用 GraalVM 作为守护进程的 JDK,缩短预热时间并降低常驻内存;(3)单守护进程内可并行执行多模块构建。速度提升范围从小型单模块项目的约 2 倍,到大型多模块 reactor 的 10 倍以上。mvnd 的守护进程注册目录位于 `~/.m2/mvnd/`(与 `~/.m2/repository/` 分开),允许多个守护进程使用不同 JDK 并存。守护进程在可配置的空闲超时(默认 3 小时)后自动关闭。所有处理都在本地完成,源码或制品不会上传到任何地方。

速查页版本 1.0.0