やる気がストロングZERO

やる気のストロングスタイル

mavenのbuild lifecycleについて調べた

mavenjavaをbuildしてjarを作ることをよく行っているが、どういうことが行われてbuildされているのかよく分かってなかったので調べてみた。 結構難しいと思った。分かった範囲でメモる

参考資料:

Mavenの基本勉強メモ #Java - Qiita

Maven – Introduction to the Build Lifecycle

mavenが定義している処理の流れがある

javaをbuildしてjarを作成するまでに行われる工程がある。 例えば、事前にリソースファイルを移動して、コードをコンパイルして、jarに固めて、、というような工程である。 これらの工程をmavenは定義している。

mavenで定義されている工程は以下である。

参考) Maven – Introduction to the Build Lifecycle

  • 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

これらの工程1つ1つを「フェーズ」と呼ぶ

フェーズではプラグインが処理を行っている

上記の各フェーズはあくまで「こういう工程がある」とmavenが定義しているだけで、実際に何を行うかはPluginが責任を持っている。 なので、どのフェーズで具体的に何をするのかは、どのPluginを使うのかを指定する必要がある。

mavenには代表的なユースケースに関しては一通りのPlugin設定を行ったデフォルト設定というものがある。

例えば、mavenでjarを作成する場合にmavenで定義されている工程は以下で、それぞれpluginがデフォルトで指定されている。 参考) Maven – Introduction to the Build Lifecycle

フェーズ plugin:ゴール
process-resources resources:resources
compile compiler:compile
process-test-resources resources:testResources
test-compile compiler:testCompile
test surefire:test
package ejb:ejb or ejb3:ejb3 or jar:jar or par:par or rar:rar or war:war
install install:install
deploy deploy:deploy

僕らが何も明示的に設定しなければ、各フェーズではデフォルトのプラグインによって処理が実行される。 たとえば、compileフェーズに対するデフォルトプラグインmaven-compiler-pluginである。

Pluginのゴールについて

プラグインには複数の機能があったりする。 maven-compiler-pluginには以下の2つの機能がある。

参考) Apache Maven Compiler Plugin – Introduction

Pluginの持っているこれらの機能のことを「ゴール」と呼んでいる。 maven-compiler-pluginはcompileフェーズとtest-compileフェーズのデフォルトPluginとして定義されていて、それぞれcompileゴールとtestCompileゴールが指定されている。

デフォルトプラグインではなく、自分でPluginを指定、設定したい場合は「どのフェーズで、どのPluginのどのゴールを実行するのか」を指定する感じになる。

mavenで何をするか(jarやwarをpackageingするのか、cleanするのかなど)によって定義されているフェーズが異なる。

上記で説明したのはjarをパッケージしたい場合のフェーズだが、行いたいことによって定義されているフェーズやそれに紐づけられているデフォルトPluginが異なる。 例えばpomをパッケージングしたい場合のフェーズは以下。

  • package
  • install
  • deploy