ここでは、Mavenビルドツールのコマンドの意味を理解するうえで重要となる、ライフサイクル、フェーズ、プラグイン、ゴールの関係についてまとめます。
なお、執筆にあたっては以下の公式リファレンスを参考にしているので、項目ごとに詳細を知りたい場合は併せて参照をお願いします。
https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html
ライフサイクルとフェーズ
まず、ライフサイクルは以下の3種類があります。
- Default
- Clean
- Site
そして、それぞれのライフサイクルは複数のフェーズで成り立っています。
例えば、mvn compile
などでよく使うcompileというのはフェーズの一種で、これはDefaultライフサイクルの中にあります。
コマンドでフェーズを指定して実行したときは、そのフェーズを含むライフサイクルの、始めのフェーズから、指定したフェーズまでが順次実行されます。
つまり、もしmvn install
コマンドを叩いたときは、installフェーズだけが実行されるのではなく、その前のcompileフェーズやtestフェーズも実行されるということです。
プラグインとゴール
ここまでの説明だけだと、Mavenが提供するコンパイルやテストなどの各機能はフェーズとして定義されているように感じるかもしれませんが、まだ続きがあります。
Mavenにはプラグインという概念があって、プラグインの中には1つ以上のゴールが含まれます。
この関係は、ものすごくざっくり言うと、便利な機能をまとめたサービス(プラグイン)があって、その中の実際の各機能に相当するのがゴールといった感じです。
そして、Mavenの各機能はすべてこのプラグインのゴールとして定義されています。
例えば、Compilerというプラグインがありますが、この中にはcompileとtestCompileという2つのゴールがあります。
compileはメインコードのソースコードをコンパイルし、testCompileはテストコードのほうをコンパイルする機能ですね。
ライフサイクルのフェーズと、プラグインのゴールの関係
「Mavenの各機能はすべてこのプラグインのゴールとして定義されています。」と言いました。
ではなぜ、先述のmvn install
などのコマンドでは、フェーズを指定するだけで機能の実行ができるのでしょうか。
それは、ライフサイクルのフェーズに、プラグインのゴールが紐づけられているからです。
これは、デフォルトで紐づけられているものもあるし、pomファイル上で設定することもできます。
例えば、Cleanライフサイクルのcleanフェーズには、cleanプラグインのcleanゴールが初めから紐づいています。
コマンドを叩くときは、フェーズではなく、プラグインのゴールを直接指定することもできます。
フェーズを指定したときとは異なり、この場合は、ライフサイクル内の順番を無視して該当のゴール(機能)だけを単独で実行できます。
コマンドで見た時の違い
最後に、フェーズを指定するときと、プラグインのゴールを直接指定するときの違いをコマンドで確認しておきます。
mvn compile
としたときは、compileフェーズを指定しています。
つまり、Defaultライフサイクルの初めから、compileフェーズが指し示す機能までが順次実行されます。
mvn compiler:compile
としたときは、compilerプラグインのcompileゴールを直接指定しています。(このように、プラグイン名:ゴール名
という書き方をします。)
この場合は、ライフサイクルに関係なく、compilerプラグインのcompileゴールの機能のみが単独で実行されます。
まとめ
いかがだったでしょうか。
普段叩いているコマンドの意味を理解するうえで、少しでもお役に立てれば幸いです
※このアカウントで発信する内容はあくまで私個人の意見であり、現在所属する会社の公式見解を示すものではありません。