← 解説「mvn・./mvnw・ant・./gradlew: ビルドのコマンド」に戻る
サンプルコードで身につける: mvn・./mvnw・ant・./gradlew: ビルドのコマンド
解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。
1用語早見表: ビルドのコマンドと、後ろに書く語の種類
ビルドのコマンド4つと、その後ろに書く語の種類を並べた表です。「近いもの」はたとえで、 や npm の公式文書が互いを対応づけているわけではありません。同じ や という語が道具ごとに別のものを指す点は、5本目にまとめました。
用語 | 一言で手元では: 何として見えるか近いもの: 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(./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 $?"(; の後ろは、終了コードを表示するシェルの書き方)# antant | 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...[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 の一覧と を表示し、 に無い名前を渡すと最後のように失敗します。
$ antBuildfile: /w/build.xmlinit:[mkdir] Created dir: /w/build/classes[mkdir] Created dir: /w/distcompile:[javac] Compiling 2 source files to /w/build/classesjar:[jar] Building jar: /w/dist/app.jarBUILD SUCCESSFULTotal time: 0 seconds[exit 0]$ ant -pBuildfile: /w/build.xmlSmallest Ant build: compile two classes and put them in a JARMain targets:clean Delete everything this build createdcompile Compile src/ into build/classes/jar Package build/classes/ into dist/app.jarDefault target: jar[exit 0]$ ant nosuchBuildfile: /w/build.xmlBUILD FAILEDTarget "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.jarjar(ant の後ろ) | build.xml に書かれた target の名前例: ant clean jarjar:jar(mvn のログ) | Maven の jar プラグインのゴール例: --- jar:3.5.0:jar (default-jar) @ hello ---jar(Gradle のログ) | Gradle のタスクの名前例: > Task :jarclean(mvn の後ろ) | clean ライフサイクルのフェーズclean(ant の後ろ) | 各自が build.xml に書いた targetclean(./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 の部品