mavenでjavaをbuildしてjarを作ることをよく行っているが、どういうことが行われてbuildされているのかよく分かってなかったので調べてみた。 結構難しいと思った。分かった範囲でメモる
参考資料:
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