maven3互換性まとめ

maven3がリリースされましたね。気が向いたのでこんぱちのーつでもざーっと眺めてみました。@shin1ogawaさんに1000万の人が喜んでくれると言われたのでものっそい久しぶりに書いてみた!間違ってたりしたらご指摘ください〜。不安な箇所もあるので。。。

元ネタ: https://cwiki.apache.org/MAVEN/maven-3x-compatibility-notes.html

profiles.xmlが廃止

だけを書ける*1profiles.xmlが廃止されたみたい。個人的には開発者、環境ごとの設定をに書いたものがまとめられて割と好きだっただけに、この変更は残念至極。AppEngineのAppIdとかAppVersionとかもこれに書いてたのになー。

Site、Reportingなどのドキュメント系機能はCoreには含まれなくなった

個人的にはあまり興味のないところ。というかお世話になるほどの大規模プロジェクトはやったことがない。。。
詳しくは->https://cwiki.apache.org/MAVEN/maven-3x-and-site-plugin.html

maven1のリポジトリ(=legacy)サポートの廃止

maven1スタイルのリポジトリは使えなくなりましたよっと。まぁ、これもあまり問題がない。

依存解決時のエラーをキャッシュするように

パフォーマンス向上のために依存解決時のエラー*2をキャッシュするようになった。設定間違えててエラーキャッシュされてしまった場合などは-Uオプションでキャッシュを見ないように出来るとのこと。ライブラリ追加のタイミングなんかでは-Uしておくと良さそうっすね。

maven2、maven3を同時に使ってもSNAPSHOTなライブラリの更新は別々に行われる

別のmetadataを利用するようになったためmaven3で更新をかけていてもmaven2ではサイド取得しなおすとのこと。まぁ、これも特に問題ない気がする。metadataの形式を変えたための副作用ってとこなのかしら?

ユニークバージョン有効時にデプロイした場合Classifierもメタデータに含まれるようになった

maven2ではclassifierを指定してデプロイしてもSNAPSHOTのユニークバージョンはclassfierが異なるものでも同一に扱われてしまっていた問題に対する修正。これは簡単な利用ケースではあまり弊害はなかったことに思える。ただ、この変更でユニークバージョンが使われているmaven3なリポジトリではmaven2での正常な利用は出来なくなるとのこと。この変更はでかいと思うなぁ。classfier付きっていうとslf4jあたりが有名?

プラグインの自動バージョン解決時に警告が出るようになった

maven2では暗黙のバージョンがRootPOMから引き継がれる上にバージョンが指定されていなかった場合は最新のプラグインが利用されるという仕組みだった。このせいである日突然ビルドが通らないなんてことがあったりしたのだけど、これを防ぐために警告ログが出されるようになった。

プラグインのバージョンにRELEASE、LATESTのメタバージョンの指定が出来なくなった

むしろそんなものあったのかよ。。。まぁ、問題ない。

で指定されたリポジトリからはプラグインを取得できなくなった

今まではどうもに指定されていたリポジトリからでも取得出来ていたようです。まぁ、個人的にはこれも問題なし。きちんと書いてた(はず)だし。

依存解決時の衝突が改善された

依存性解決のエンジンをAetherに変更。これによってトリッキーなケースでの依存解決が改善されたとのこと。

古いバージョンのリアクターサポートが打ち切られた

マルチモジュールプロジェクトなどで途中までビルドして失敗したさいにレジュームするオプションとして使えた--reactorオプションが廃止された。代わりにmaven-reactor-pluginが使えるはず。でかいプロジェクトでローカルビルドの際などには便利。

POMのバリデーションがより厳密に

plugin依存解決の話もそうだけど、maven2のPOMをそのまま実行するとよっぽど厳密な書き方してる人以外は結構な勢いで警告が出るようになった。警告見ながらPOMのより正しい書き方も覚えられるし、突然ビルドが通らなくなることもかわせるしでいいこと尽くめ。この変更は初期段階から気に入っとります。

子POMのが省略されてる場合親POMが解決されないようになった

最初まじすか!?と思ったけどよくよく考えるとこれを書き忘れてハマったケースは多々あるので、いい変更かな。

モジュールのビルドはモジュール内で閉じるように

Extension Loading
In Maven 2.x, build extensions defined by one module had global effects and as such affected other modules in the reactor. In contrast, Maven 3 keeps the visibility of build extensions limited to the modules that actually declare them. As a consequence, modules that require build extensions, e.g. to properly resolve dependencies with custom types, and did not declare the extension but relied on some previous module in the reactor to load and share the extension will now fail to build. This is consistent with the build result one would experience when trying to build such a module on its own outside of a reactor build.

ここがもひとつ分からないのだけど、のことをいってるのかな?別モジュールでカスタマイズしてた場合の影響を受けなくなったってことなのかしら?

ファイルプロトコルはhttp、httpsのみのサポートに

scp、ftpなど使いたい場合はそれようのwagon系プラグインを利用しておくれとのこと。deploy-pluginのに限ってscpとかもは使えるご様子*3

エラーリポートの改善

ビルドエラー、テスト失敗などの際にmaven2ではそれしか情報がなかったけれども、maven3からはリアクターの情報も出るようになった*4。これもやんわり嬉しい改善点で壮大なマルチプロジェクト時に効果を発揮する!

*1:ビルドプロセスに関わるものを除く

*2:ライブラリが見つからないとか

*3:deploy-pluginの依存関係に含まれてるからって話と思われる

*4:モジュールのこと