mvnd

Maven Daemon 1.0+

Maven Daemon (mvnd) 명령어 모음 — 상주 JVM 데몬 프로세스로 `mvn`을 감싼 래퍼. 모든 mvn 하위 명령을 그대로 사용할 수 있으며, 데몬 관리 명령(--status / --stop / --shutdown)을 추가로 제공합니다.

명령어 29개

데몬 관리

mvnd --status

실행 중인 모든 mvnd 데몬을 나열: ID, JDK 홈, 버전, 가동 시간, 유휴 시간, 완료/실행 중인 빌드 수. 스크립트에서는 `-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 드롭인)

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 단위 테스트를 실행합니다. 테스트는 여전히 새 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 스냅샷 의존성을 강제 업데이트

mvnd clean install -U
mvnd deploy

빌드 후 산출물을 `pom.xml`의 `<distributionManagement>`에 선언된 원격 리포지토리로 게시합니다. 의미는 `mvn deploy`과 동일합니다.

-DskipTests; -P release release 프로파일 사용

mvnd deploy -P release -DskipTests

데몬 튜닝

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

데몬 레지스트리 디렉터리를 덮어씁니다(기본 `~/.m2/mvnd/`). 프로젝트별 경로를 지정해 각 워크트리에 독립된 데몬 풀을 둘 수 있습니다.

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>

동시에 유지할 최대 데몬 수. 기본값 = 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>

이번 빌드에서 `~/.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 Software Foundation에서 오랜 기간 인큐베이션을 거쳐 2024년 첫 안정 버전인 1.0.0을 출시했습니다. mvnd는 백그라운드에서 하나 이상의 상주 JVM 데몬을 유지하고, 각 빌드 요청을 해당 데몬에 디스패치합니다. Maven 3.x와 동일한 `pom.xml`, `~/.m2/repository`, 플러그인, 라이프사이클을 그대로 재사용하므로 진정한 drop-in 대체 도구입니다. `mvnd compile`은 `mvn compile`과 정확히 동일하게 동작하지만 빌드 속도만 훨씬 빠릅니다. 속도 향상은 세 가지 요소에서 비롯됩니다. (1) JVM은 한 번만 시작되어 여러 빌드에 걸쳐 재사용되므로, `mvn`이 호출마다 부담하는 1~3초 JVM 시작 비용이 사라집니다. (2) mvnd는 데몬용 JDK로 GraalVM을 사용해 워밍업 시간과 상주 메모리 사용량을 줄입니다. (3) 단일 데몬 안에서 다중 모듈 빌드를 병렬 실행할 수 있습니다. 속도 향상 폭은 소규모 단일 모듈 프로젝트의 약 2배부터, 대규모 멀티모듈 reactor의 10배 이상까지 다양합니다. mvnd는 데몬 레지스트리를 `~/.m2/mvnd/`(기본 `~/.m2/repository/`와 별도)에 저장해 서로 다른 JDK의 데몬을 공존시킬 수 있습니다. 데몬은 설정 가능한 유휴 타임아웃(기본 3시간) 이후 자동으로 종료됩니다. 모든 처리는 로컬에서 이루어지며, 소스 코드나 산출물은 외부로 전송되지 않습니다.

치트시트 버전 1.0.0