Dev Study
← Spring コース

8. mvn・./mvnw・ant・./gradlew: ビルドのコマンド

は を実行するコマンドで、 は を実行するコマンドです。 と は、プロジェクトに付いているスクリプト()で、決まった版の Maven や を取ってきて実行します。Node で言うと、 は nest build に近い位置ですが、テストの実行と 作りまで1回で進みます。ラッパーに近いのは Corepack です。

mvn package の は(ビルドの段階)の名前で、先頭から package までを順に進めます。実際の作業をするのは(Maven が取ってきて使う部品)で、プラグインが持つ作業の1つ1つをと呼びます。compiler プラグインなら compile と testCompile です。 のように「プラグイン:ゴール」と書くと、ゴールを直接実行します。

の clean と jar は、 に書かれた (手順のまとまり)の名前で、 の jar コマンドとは別物です。フェーズは npm の scripts に似て見えますが、順番が Maven の側で決まっていて、指定したところまで前から全部進みます。 の は設定値を渡す指示です。-v は、mvn では版の表示、ant では詳しい表示です。

点線の付いた語はタップすると説明が出ます。用語集を開く →

mvn package と打ったとき、後ろの語がどう読まれるか(下の段は Ant と Gradle の場合)
mvn packagemvn は Maven を実行するコマンド。別に入れておく
./mvnw packageラッパー。決まった版の Maven を取ってきて、同じことをする
Node: nest build に近い(テストと JAR 作りまで進む点が違う)
package はフェーズの名前。先頭から package まで順に進める
フェーズビルドの段階。validate → compile → test → package の順(抜粋)。順番は Maven が決めている
npm scripts と違い、自分では書かない
各フェーズに割り当てられた作業を実行する
プラグインのゴールcompiler:compile(コンパイル)、surefire:test(テスト)、jar:jar(JAR を作る)など
ほかの道具では、後ろの語は別のものを指す
ant clean jarclean と jar は target の名前。build.xml を書いた人が付けた
./gradlew clean buildclean と build はタスク(Gradle の作業の単位)の名前
  • ・フェーズを決まった順に並べた流れをライフサイクルと呼びます。Maven には default、clean、site の3つがあり、package は default の、clean は clean のフェーズです。mvn clean package は、2つを並べて書いた形です(Maven 公式の Introduction to the Build Lifecycle)
  • ・Maven の公式サイトは、Maven は POM とプラグインの集まりを使ってプロジェクトをビルドする、と説明しています。プラグインは1つ以上のゴールを持ち、公式の例では、Compiler プラグインのゴールは compile と testCompile の2つです。プラグインも依存と同じく、初回に取ってきて手元の ~/.m2/repository に置かれます
  • ・Maven の入っていない JDK 25 だけの環境で ./mvnw -v を実行すると、Maven 3.9.16 を取ってきてから版を表示しました(Spring Boot 4.1.1 の雛形で1回)。この出力には、使っている Java の版と場所も出ます
  • ・ant も mvn も、実体は java を起動するスクリプトで、Ant や Maven の本体はその JVM の中で動きます。OS が起動した実行ファイルを strace で記録すると、どちらも、スクリプトが小さなコマンドをいくつか呼んだあと、最後に java を起動していました(Ant 1.10.18 と Maven 3.9.16 を、Linux のコンテナで各1回)
  • ・ant を引数なしで打つと、build.xml の default に書かれた target が実行されます。ant -p は target の一覧を表示します
  • ・./gradlew build の build や、bootJar は、タスクの名前です。bootJar は Spring Boot の Gradle プラグインが足すタスクで、後のレッスンで扱います
  • ・ラッパーに近い Corepack は、package.json の packageManager に書かれた版の Yarn や pnpm などを、取ってきてから実行する Node の道具です。当たらない点は置き場所で、mvnw はプロジェクトの中に置くファイルですが、Corepack は Node に同梱されてきた道具です(Node.js 25 からは同梱されません)
  • ・npm との対応はたとえです。Ant の「名前を付けた手順を ant 名前 で呼ぶ」点は npm run 名前 に近いのですが、手順の中身はシェルのコマンドではなく、Ant の中の Java の部品です
  • ・下のコードは、mvn の後ろの語を「フェーズ」「プラグイン:ゴール」「-D のオプション」に読み分ける模型です。フェーズとゴールの割り当ては、JAR を作るプロジェクトの既定の表(Maven 公式)から抜粋しました。Maven の実装ではありません

▶ サンプルコードを実行してみよう(自由に書き換えてOK)

Java

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

サンプルコードで身につける(5本) →

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

公式ドキュメントで詳しく ↗