Mavenのすぐ忘れること
#Maven #シュッと出したい
pomの記法とか
filter
https://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html
<filtering> tag にtrueをセットして置くと、リソース内の${propertiesで定義した名前}とかで値を置き換えることが可能
dependencyManagement
ココに記述した内容は即依存性として追加されないが、groupId, artifactIdごとにデフォルトのバージョンなどを定義できる。ここで指定していれば、dependenciesの中でバージョンを指定しなくても、dependencyManagementで指定したバージョンが使われる。
親Pom作ってそれを継承するものが複数いるときとかにバージョン揃えるのに非常に便利
http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Dependency_Management
http://cynipe.hateblo.jp/entry/20101128/1290943804
マルチモジュールプロジェクトとかで、親pom内にのみバージョンを指定して子プロジェクトではバージョンをそのままにするというのをよくやる
bomプロジェクトを指定して関連プロジェクトのバージョンを簡単に管理することができる
bomプロジェクトに、関連するライブラリの必要なバージョンが全部書いてあるので、推移的なバージョンの依存性を意識しなくてよくなる
http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Importing_Dependencies
これは良い例だと思ったけど、あるバージョンのarquillianのbomをdependencyManagementへ書いておけば、arquillianの実ライブラリたちのバージョンを意識しなくても、bomで定義されている正しいバージョンを依存に加えることができる
http://create-something.hatenadiary.jp/entry/2015/05/08/063000
pluginManagement
plugin向けのdependencyManagementという理解
親PomのpluginManagementに記述しておけば、子供のpomではバージョンとか指定せずにpluginを利用することができる
https://stackoverflow.com/questions/11254356/maven-dependency-management-for-plugin-dependencies
scope
table: scopeの種類
種類 内容
compile デフォルト値。全ての状況でクラスパスに追加される。
provided ライブラリが JDK やコンテナによって提供される場合に指定。コンパイル時のみクラスパスに追加される。
runtime 実行時のみに必要な場合に指定。テストの実行および通常の実行のときにクラスパスに追加される。
test テストのときのみ必要な場合に指定。テストのコンパイルと実行のときにクラスパスに追加される。
system システムのライブラリを明示的にクラスパスに追加する場合に指定。リポジトリを検索しない。
packaging
table: packagingの種類
種類 内容
jar デフォルト。
war
ear
pom pomプロジェクト。マルチモジュールプロジェクトのrootのpomとかはこれを指定する。
optional
trueにするとクラパス上で依存が使われない限りはその依存はpackagingされない
たとえば開発時だけ使うツールとかをoptional=trueにしておけば、jarとかには依存がpackagingされなくなり、開発時だけ有効にできる
https://stackoverflow.com/a/54414832
ビルドライフサイクル
ココがよくまとまってた
https://qiita.com/kawakawaryuryu/items/96db58fb9a607973eca0
plugins
https://qiita.com/kawakawaryuryu/items/96db58fb9a607973eca0#プラグイン
mavenでは全ての処理がプラグインによって実現されています。←これ重要
ライフサイクルの各フェーズで行われる処理は実際はプラグインが持つ処理が実行されています。
mavenではフェーズとプラグインが持つ処理(ゴール)を紐付けることにより、フェーズを指定するだけで処理が実行される仕組みになっています。
https://qiita.com/kawakawaryuryu/items/96db58fb9a607973eca0#フェーズとゴールの紐づけ
上記で説明したように、フェーズとゴールを紐付けることでフェーズを指定するだけでゴールが実行されます。
mavenではそれぞれのライフサイクルのいくつかのフェーズはあらかじめゴールが紐付けられています。
https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html#Built-in_Lifecycle_Bindings
core plugins
https://www.baeldung.com/core-maven-plugins
process-resources -> resources:resources
https://www.baeldung.com/maven-resources-plugin
compile -> compiler:compile
https://www.baeldung.com/maven-compiler-plugin
maven.compiler.source, maven.compiler.target に指定されたJavaのversionでコンパイルしてくれる
process-test-resources -> resources:testResources
https://www.baeldung.com/maven-resources-plugin
test-compile -> compiler:testComiile
https://www.baeldung.com/maven-compiler-plugin
test -> surefire:test
maven-surefire-plugin
テストの実行してくれるplugin。
pluginで指定しなくても、maven testを実行するとsurefireが動いてテストが実行されている
ただし、デフォルトのバージョンだと低いのでJUnit5がうまく動かなかったりする
Mavenコマンド経由でテストするとExtentionが呼ばれない
コマンドラインからのpluginの省略呼び出し
https://maven.apache.org/guides/plugin/guide-java-plugin-development.html#Shortening_the_Command_Line
mvn sample.plugin:hello-maven-plugin:sayhi -> mvn hello:sayhi で呼び出せる
${prefix}-maven-plugin or maven-${prefix}-plugin の命名に沿っていれば上記の省略が適用できる
アーティファクトの複数バージョンが競合したときのMavenの依存性解決の仕組み
https://offshore.craid-inc.com/maven-dependency-mechanism/
基本はpom.xmlから一番距離的に近いバージョンのものが使われる
ある依存内に含まれる推移依存を取り除いて依存性の競合を手動で解決する
https://maven.apache.org/guides/introduction/introduction-to-optional-and-excludes-dependencies.html
exclusionで特定の推移依存を取り除くことが可能
その他
exec plugin
https://www.mojohaus.org/exec-maven-plugin/
exec:exec
Javaを含めた、任意のプログラムの実行
npmとかも実行できるよ
https://qiita.com/youhei/items/6e09fd058f61bd08168d
exec:java
Javaプログラムの実行
Javaの実行に特化したパラメータとかになってるので、Java実行するならこっちが便利よ
jar作るpluginたち
https://medium.com/@randilfernando/when-to-use-maven-jar-maven-assembly-or-maven-shade-ffc3f76ba7a6
xxxx.jarにメイン・マニフェスト属性がありません はだいたいmainClassの指定不足
maven-jar-plugin
そのプロジェクト配下のclassやresourceのみのjarを作る
maven-assembly-plugin
uber jar作れるけどクラス名が競合したら問題になるので、小さいプロジェうと向け
maven-shade-plugin
uber jar作れて、クラス名が競合した場合も設定で再配置して競合を解決可能
Apache Mave Shade Plugin と shaded jar
maven-failsafe-plugin
integrationテストのplugin
kotlin-maven-plugin
kotlin入れるときに追加する
build-helper-maven-plugin
profileごとにsrcフォルダを分けたりできる
https://github.com/yuizho/chambre/commit/fed66fa9e8908e6909ccf6997cd40f329a8644c1#diff-9c5fb3d1b7e3b0f54bc5c4182965c4fe1f9023d449017cece3005d3f90e8e4d8R194
同じプロジェクト内で同名クラスが存在しちゃうとどちら使えばいいか見分けつかなくてコンパイルエラーになる
devプロファイル内で依存と同名のパッケージ&クラスを定義してやれば置き換えたりできる
devのときだけダミーのクラスに置き換えたりできるので結構べんり
一応srcフォルダ追加する以外にもresourceフォルダ追加したり色々できるんやな
やりたいこと別
profileごとにsrc, resourceを分けてビルドできるようにしたい
mavenのprofilesの記述とbuild-heloper-pluginを使えばかのう
サンプル
https://github.com/yuizho/chambre/commit/fed66fa9e8908e6909ccf6997cd40f329a8644c1#diff-9c5fb3d1b7e3b0f54bc5c4182965c4fe1f9023d449017cece3005d3f90e8e4d8R181
複数プロファイルのresourceフォルダに同名プロファイルがあった場合先勝ちになるのでdevプロファイルとかつくったらresourceは先に定義してやるのがよい
srcはbuild-helper-maven-pluginでやる感じで
その他
同じphaseのgoalが複数指定されていたときの順番
同じphaseに複数goalが指定されていた場合、pom.xmlの定義順に実行される
https://stackoverflow.com/a/2451031
mvnwの導入
READMEのコマンド叩くだけ
https://github.com/takari/takari-maven-plugin
mvn wrapper:wrapper 叩くだけ
https://maven.apache.org/wrapper/