Dev Study
← 解説「mvn・./mvnw・ant・./gradlew: ビルドのコマンド」に戻る

サンプルコードで身につける: mvn・./mvnw・ant・./gradlew: ビルドのコマンド

解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1用語早見表: ビルドのコマンドと、後ろに書く語の種類

ビルドのコマンド4つと、その後ろに書く語の種類を並べた表です。「近いもの」はたとえで、 や npm の公式文書が互いを対応づけているわけではありません。同じ や という語が道具ごとに別のものを指す点は、5本目にまとめました。

用語早見表(mvn・./mvnw・ant・./gradlew)表
用語 | 一言で
手元では: 何として見えるか
近いもの: Node / NestJS で近いもの
 
mvn | Maven を実行するコマンド
実体は、java を起動するスクリプト
手元では: mvn package(Maven を別に入れておく)
近いもの: npm(ただし JDK には入っていない)
 
./mvnw | Maven のラッパー。決まった版の Maven を
取ってきて実行するスクリプト。使い方は mvn と同じ
手元では: プロジェクト直下の mvnw というファイル
./mvnw package は nest build に近いが、
テストの実行と JAR 作りまで進む
近いもの: Corepack(決まった版の Yarn や pnpm を
取ってきて実行する。プロジェクトの中の
ファイルではない点が違う)
 
ant | Ant を実行するコマンド
実体は、java を起動するスクリプト
手元では: ant、ant clean jar(build.xml のある場所で)
近いもの: npm run 名前
(中身はシェルのコマンドではない)
 
./gradlew | Gradle のラッパー
手元では: プロジェクト直下の gradlew というファイル
近いもの: Corepack(./mvnw と同じ)
 
フェーズ | Maven のビルドの段階。順番が決まっている
手元では: mvn package の package
近いもの: npm scripts の名前
(順番を自分で書かない点が違う)
 
ライフサイクル | フェーズを決まった順に並べた流れ
default、clean、site の3つ
手元では: mvn clean package は2つの流れを並べた形
近いもの: 無い
 
プラグイン | Maven が取ってきて使う部品
1つ以上のゴール(作業)を持つ
手元では: ログの compiler、surefire、jar など
近いもの: 対応を確かめていない
 
ゴール | プラグインが行う作業の1つ
手元では: compiler:compile、compiler:testCompile
(compiler プラグインの2つのゴール)
近いもの: 対応を確かめていない
 
target(Ant) | build.xml の中の、手順のまとまり1つ
手元では: ant clean jar の clean と jar
近いもの: npm scripts の1項目
(中身はシェルのコマンドではない)
 
タスク(Gradle) | Gradle の作業の単位
手元では: ./gradlew clean build の clean と build
近いもの: 対応を確かめていない

2後ろに書く語とオプションの早見表

コースの図やラベルに出るビルドのコマンド行を、道具ごとにまとめました。 のオプションの説明は Maven 3.9.11 の CLI リファレンスの文面を短くしたもので、コースの実測は 3.9.16 です(どれも実測のログで受け付けられています)。 でも書き方は同じです。

mvn・ant・./gradlew の後ろに書くもの(# の行は組の見出し)表
書き方 | 意味
 
# mvn(./mvnw でも同じ)
mvn package | package フェーズまでを順に進める
コンパイル、テスト、JAR 作りまで
mvn clean package | 先に clean(target/ を消す)、
続けて package まで
mvn validate | 最初のフェーズ(プロジェクトの確認)だけ
mvn dependency:tree | プラグイン:ゴール の形
依存がさらに何に依存しているかを、木の形で表示する
mvn dependency:build-classpath | 同じ形
依存の JAR の場所を、クラスパスの形で書き出す
mvn native:compile | 同じ形
native image を作るゴール(後のレッスンで扱う)
-DskipTests | -D は設定値(プロパティ)を渡す指示
skipTests を渡すと、テストの実行を飛ばす
(テストのコンパイルは行う)
-B | 対話なしで動かす(出力の色も消える)
-ntp | ダウンロードの進み具合を表示しない
-o | オフラインで動かす(取りに行かない)
-q | 静かに動かす(エラーだけ表示する)
-P名前 | pom.xml に用意された設定の組(プロファイル)
を有効にする。例: -Pnative
-v | 版を表示する
例: ./mvnw -B -ntp package
例: ./mvnw -B -Pnative native:compile
例: mvn -B -o -ntp -q package; echo "mvn exit $?"
(; の後ろは、終了コードを表示するシェルの書き方)
 
# ant
ant | build.xml の default の target を実行する
ant clean | clean という名前の target を実行する
ant clean jar | clean、続けて jar(とその前提)を実行する
-p | target の一覧と default を表示して終わる
-v | 内側でしていることを詳しく表示する
-f ファイル | build.xml 以外のファイルを使う
 
# ./gradlew
./gradlew clean build | clean タスク、build タスクの順
./gradlew clean bootJar | clean タスクと、
実行可能 JAR を作る bootJar タスク
--no-daemon | デーモン(残って使い回される JVM)を
使うかどうかの指定(後のレッスンで扱う)
--status | 同じ版の Gradle の、動いているデーモンと
最近止まったデーモンを一覧する
--console=plain | 出力を飾りのない文字だけにする

3mvn package のログで、フェーズとゴールを見分ける

2つのと依存1本だけの最小プロジェクトで を実行したログです。強調した --- の行が1つのの開始で、:版:ゴール (実行の id) @ プロジェクトの の順に書かれています。 というの名前そのものはログに出ず、割り当てられたゴールが順に出ます。

$ mvn -B -ntp package(Maven 3.9.16 / JDK 25。1回目のログの抜粋。... は省略した行で、空行とダウンロードの行も除いてある)コマンド出力
$ mvn -B -ntp package
...
[INFO] Building hello 1.0.0
...
[INFO] --- resources:3.4.0:resources (default-resources) @ hello ---
[INFO] skip non existing resourceDirectory /work/f-maven/std/src/main/resources
[INFO] --- compiler:3.15.0:compile (default-compile) @ hello ---
...
[INFO] Compiling 2 source files with javac [debug release 25] to target/classes
[INFO] --- resources:3.4.0:testResources (default-testResources) @ hello ---
...
[INFO] --- compiler:3.15.0:testCompile (default-testCompile) @ hello ---
[INFO] No sources to compile
[INFO] --- surefire:3.5.4:test (default-test) @ hello ---
[INFO] No tests to run.
[INFO] --- jar:3.5.0:jar (default-jar) @ hello ---
[INFO] Building jar: /work/f-maven/std/target/hello-1.0.0.jar
...
[INFO] BUILD SUCCESS
...
 
# --- の行の読み方(Maven 3.9 系)
# --- compiler:3.15.0:compile (default-compile) @ hello ---
# compiler プラグイン(の短い名前)
# 3.15.0 そのプラグインの版
# compile ゴール
# default-compile 実行の id(この実行に付いた名前)
# hello プロジェクトの artifactId(pom.xml の名前)
 
# フェーズとゴールの割り当て(JAR を作るプロジェクトの既定。Maven 公式の表から)
# process-resources resources:resources
# compile compiler:compile
# process-test-resources resources:testResources
# test-compile compiler:testCompile
# test surefire:test
# package jar:jar

4ant のログと、ant -p、無い名前を渡したとき

1.10.18 での実物です。引数なしの は、行頭に の名前(init:、compile:、jar:)を出し、その下に、中の作業が出した行を字下げして並べます。 は target の一覧と を表示し、 に無い名前を渡すと最後のように失敗します。

$ ant / $ ant -p / $ ant nosuch(Ant 1.10.18 / JDK 25。build.xml の default は jar。[exit N] は実験用のスクリプトが足した終了コードで、0 が成功)コマンド出力
$ ant
Buildfile: /w/build.xml
 
init:
[mkdir] Created dir: /w/build/classes
[mkdir] Created dir: /w/dist
 
compile:
[javac] Compiling 2 source files to /w/build/classes
 
jar:
[jar] Building jar: /w/dist/app.jar
 
BUILD SUCCESSFUL
Total time: 0 seconds
[exit 0]
 
$ ant -p
Buildfile: /w/build.xml
Smallest Ant build: compile two classes and put them in a JAR
Main targets:
 
clean Delete everything this build created
compile Compile src/ into build/classes/
jar Package build/classes/ into dist/app.jar
Default target: jar
[exit 0]
 
$ ant nosuch
Buildfile: /w/build.xml
 
BUILD FAILED
Target "nosuch" does not exist in the project "hello".
 
Total time: 0 seconds
[exit 1]

5混同しやすいもの: 同じ語が、道具ごとに別のものを指す

jar、clean、target、-v は、道具が変わると指すものが変わります。とくに jar は、 のコマンド、Ant の target の名前、Maven のゴール、 のの4通りに出ます。Ant は JDK の jar コマンドを起動せず、自分で を書いていました(Ant 1.10.18 での記録)。

同じ語の読み分け(このコースに出る形)表
語(どこに出るか) | 何を指すか
 
jar(行の先頭) | JDK のコマンド
例: jar tf app.jar
jar(ant の後ろ) | build.xml に書かれた target の名前
例: ant clean jar
jar:jar(mvn のログ) | Maven の jar プラグインのゴール
例: --- jar:3.5.0:jar (default-jar) @ hello ---
jar(Gradle のログ) | Gradle のタスクの名前
例: > Task :jar
 
clean(mvn の後ろ) | clean ライフサイクルのフェーズ
clean(ant の後ろ) | 各自が build.xml に書いた target
clean(./gradlew の後ろ) | Gradle のタスク
 
target(Ant) | build.xml の中の、手順のまとまり
target/(Maven) | ビルドの出力を置くフォルダ
 
-v(mvn) | 版を表示する
-v(ant) | 詳しく表示する
 
-D(mvn) | Maven に設定値を渡す。例: -DskipTests
-D(java) | 動かすプログラムから読める設定値を渡す
 
mvn と ./mvnw | 同じ Maven。./mvnw は、決まった版を
取ってきてから実行する。後ろに書くものは同じ
 
フェーズ と ゴール | package はフェーズ(段階)
compiler:compile はゴール(作業)
フェーズを書くと、そこまでのゴールが順に動く
 
# npm の scripts と当たらない点
# scripts は、名前も中身も順番も自分で書く
# Maven のフェーズは、名前も順番も最初から決まっている
# Ant の target は、名前と順番を自分で書くが、
# 中身はシェルのコマンドではなく Ant の部品

図やコードに出てくる用語(タップで説明)