サンプルコードで身につける: Maven: ライフサイクル・フェーズ・ゴール・プラグインの関係
解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。
1mvn validate / compile / package で動いたゴール(--- の行)
同じ雛形で、指定するを変えて実行したときに出た --- の行だけを抜き出しました。validate では1本も出ず、compile では2本、 では7本です。行の形は :版: (実行の id) @ プロジェクト名 で、フェーズ名はログに出ません。 はテストを走らせるプラグインです。強調した最後の1本だけが 由来で、雛形の が宣言したプラグインのゴールです。
$ mvn validate[INFO] BUILD SUCCESS[INFO] Total time: 0.103 s$ mvn compile[INFO] --- resources:3.5.0:resources (default-resources) @ demo ---[INFO] --- compiler:3.15.0:compile (default-compile) @ demo ---[INFO] BUILD SUCCESS$ mvn package[INFO] --- resources:3.5.0:resources (default-resources) @ demo ---[INFO] --- compiler:3.15.0:compile (default-compile) @ demo ---[INFO] --- resources:3.5.0:testResources (default-testResources) @ demo ---[INFO] --- compiler:3.15.0:testCompile (default-testCompile) @ demo ---[INFO] --- surefire:3.5.6:test (default-test) @ demo ---[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0[INFO] --- jar:3.5.1:jar (default-jar) @ demo ---[INFO] Building jar: /bt/l4-pom/demo/target/demo-0.0.1-SNAPSHOT.jar[INFO] --- spring-boot:4.1.1:repackage (repackage) @ demo ---[INFO] Replacing main artifact /bt/l4-pom/demo/target/demo-0.0.1-SNAPSHOT.jar with repackaged archive, adding nested dependencies in BOOT-INF/.[INFO] BUILD SUCCESS
2clean package、install、-DskipTests で何が増え、何が減るか
は別の(clean)のフェーズなので、clean package と並べると clean:clean が先頭に1本増えます。install は package の後に が加わり、の com/example/demo/ に .pom と を置きます。 を付けても surefire:test の行は出ます。ゴールは呼ばれ、その中でテストを飛ばしているからです。
$ mvn clean package[INFO] --- clean:3.5.0:clean (default-clean) @ demo ---[INFO] Deleting /bt/l4-pom/demo/target[INFO] --- resources:3.5.0:resources (default-resources) @ demo ---...[INFO] --- spring-boot:4.1.1:repackage (repackage) @ demo ---[INFO] BUILD SUCCESS$ mvn install[INFO] --- resources:3.5.0:resources (default-resources) @ demo ---...[INFO] --- spring-boot:4.1.1:repackage (repackage) @ demo ---[INFO] --- install:3.1.4:install (default-install) @ demo ---[INFO] Installing /bt/l4-pom/demo/pom.xml to /root/.m2/repository/com/example/demo/0.0.1-SNAPSHOT/demo-0.0.1-SNAPSHOT.pom[INFO] Installing /bt/l4-pom/demo/target/demo-0.0.1-SNAPSHOT.jar to /root/.m2/repository/com/example/demo/0.0.1-SNAPSHOT/demo-0.0.1-SNAPSHOT.jar[INFO] BUILD SUCCESS$ mvn -DskipTests package[INFO] --- resources:3.5.0:resources (default-resources) @ demo ---[INFO] --- compiler:3.15.0:compile (default-compile) @ demo ---[INFO] --- resources:3.5.0:testResources (default-testResources) @ demo ---[INFO] --- compiler:3.15.0:testCompile (default-testCompile) @ demo ---[INFO] --- surefire:3.5.6:test (default-test) @ demo ---[INFO] --- jar:3.5.1:jar (default-jar) @ demo ---[INFO] --- spring-boot:4.1.1:repackage (repackage) @ demo ---[INFO] BUILD SUCCESS$ mvn clean validate[INFO] --- clean:3.5.0:clean (default-clean) @ demo ---[INFO] BUILD SUCCESS# validate にはゴールが割り当てられていないので、clean:clean だけで終わる
3help:describe -Dcmd=package: フェーズとゴールの対応表
のプロジェクトで、23のフェーズのどこに何が割り当てられているかを 自身に答えさせた出力です。Not defined のフェーズでは何も起きません。ただし表示される版(resources 3.4.0、surefire 3.5.4、jar 3.5.0)は Maven 3.9.16 に組み込みの既定で、実際のビルドで走ったのは が決めた 3.5.0、3.5.6、3.5.1 でした。Boot が足した もこの表には出ません。
$ mvn help:describe -Dcmd=package[INFO] 'package' is a phase corresponding to this plugin:org.apache.maven.plugins:maven-jar-plugin:3.5.0:jarIt is a part of the lifecycle for the POM packaging 'jar'. This lifecycle includes the following phases:* validate: Not defined* initialize: Not defined* generate-sources: Not defined* process-sources: Not defined* generate-resources: Not defined* process-resources: org.apache.maven.plugins:maven-resources-plugin:3.4.0:resources* compile: org.apache.maven.plugins:maven-compiler-plugin:3.15.0:compile* process-classes: Not defined* generate-test-sources: Not defined* process-test-sources: Not defined* generate-test-resources: Not defined* process-test-resources: org.apache.maven.plugins:maven-resources-plugin:3.4.0:testResources* test-compile: org.apache.maven.plugins:maven-compiler-plugin:3.15.0:testCompile* process-test-classes: Not defined* test: org.apache.maven.plugins:maven-surefire-plugin:3.5.4:test* prepare-package: Not defined* package: org.apache.maven.plugins:maven-jar-plugin:3.5.0:jar* pre-integration-test: Not defined* integration-test: Not defined* post-integration-test: Not defined* verify: Not defined* install: org.apache.maven.plugins:maven-install-plugin:3.1.4:install* deploy: org.apache.maven.plugins:maven-deploy-plugin:3.1.4:deploy
4プラグインは何を持っているか: help:describe -Dplugin= と、JAR の実体
compiler プラグインは、公式の説明が挙げる compile・testCompile に help を加えた3つのゴールを持ち、spring-boot プラグインは repackage や run を含む11のゴールを持ちます。フェーズに割り当てられているのはそのうち一部で、残りは spring-boot:run のように直接呼びます。プラグインの実体は、依存と同じ規則でローカルリポジトリに置かれた です。
$ mvn help:describe -Dplugin=compiler[INFO] org.apache.maven.plugins:maven-compiler-plugin:3.15.0Name: Apache Maven Compiler PluginDescription: The Compiler Plugin is used to compile the sources of yourproject....Goal Prefix: compilerThis plugin has 3 goals:compiler:compileDescription: Compiles application sources. By default uses the javaccompiler of the JDK used to execute Maven. ...compiler:help...compiler:testCompileDescription: Compiles application test sources. ...$ mvn help:describe -Dplugin=org.springframework.boot:spring-boot-maven-plugin[INFO] org.springframework.boot:spring-boot-maven-plugin:4.1.1Name: Spring Boot Maven Plugin...Goal Prefix: spring-bootThis plugin has 11 goals:# 以下、各ゴールの Description は repackage 以外省略spring-boot:build-imagespring-boot:build-image-no-forkspring-boot:build-infospring-boot:helpspring-boot:process-aotspring-boot:process-test-aotspring-boot:repackageDescription: Repackage existing JAR and WAR archives so that they can beexecuted from the command line using {@literal java -jar}. With layout=NONEcan also be used simply to package a JAR with nested dependencies (and nomain class, so not executable).spring-boot:runspring-boot:startspring-boot:stopspring-boot:test-run$ ls -l /root/.m2/repository/org/apache/maven/plugins/maven-compiler-plugin/3.15.0/-rw-r--r-- 1 root root 83823 Jan 27 2026 maven-compiler-plugin-3.15.0.jar-rw-r--r-- 1 root root 40 Oct 1 13:22 maven-compiler-plugin-3.15.0.jar.sha1-rw-r--r-- 1 root root 9549 Jan 27 2026 maven-compiler-plugin-3.15.0.pom-rw-r--r-- 1 root root 40 Oct 1 13:22 maven-compiler-plugin-3.15.0.pom.sha1-rw-r--r-- 1 root root 224 Oct 1 13:22 _remote.repositories$ find /root/.m2/repository/org/springframework/boot/spring-boot-maven-plugin -name "*.jar"/root/.m2/repository/org/springframework/boot/spring-boot-maven-plugin/4.1.1/spring-boot-maven-plugin-4.1.1.jar
5うまくいかない場合と、ゴールの直接呼び出し: フェーズ名を間違える
存在しないフェーズ名を渡すと、Maven はエラー文の中で3つの書き方(フェーズ名、prefix:goal、:artifactId[:version]:goal)と、3つのライフサイクルの全30フェーズを列挙します。後半は、ゴールを直接呼んだ例です。短い compiler:compile と完全な座標は同じゴールを指し、どちらも (コマンドラインから直接呼んだ実行の名前)として1本だけ動きます。 も同じで、この3つではフェーズは1つも進みませんでした。ゴールによっては先にフェーズを走らせるものもあります( は test-compile を必ず実行する、と公式の説明にあります)。
$ mvn nosuchphase[INFO] BUILD FAILURE...[ERROR] Unknown lifecycle phase "nosuchphase". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: pre-clean, clean, post-clean, validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-site, site, post-site, site-deploy. -> [Help 1]$ mvn dependency:tree[INFO] --- dependency:3.10.0:tree (default-cli) @ demo ---[INFO] BUILD SUCCESS[INFO] Total time: 0.461 s$ mvn compiler:compile[INFO] --- compiler:3.15.0:compile (default-cli) @ demo ---[INFO] BUILD SUCCESS$ mvn org.apache.maven.plugins:maven-compiler-plugin:3.15.0:compile[INFO] --- compiler:3.15.0:compile (default-cli) @ demo ---[INFO] BUILD SUCCESS