maven3互換性まとめ
maven3がリリースされましたね。気が向いたのでこんぱちのーつでもざーっと眺めてみました。@shin1ogawaさんに1000万の人が喜んでくれると言われたのでものっそい久しぶりに書いてみた!間違ってたりしたらご指摘ください〜。不安な箇所もあるので。。。
元ネタ: https://cwiki.apache.org/MAVEN/maven-3x-compatibility-notes.html
profiles.xmlが廃止
Site、Reportingなどのドキュメント系機能はCoreには含まれなくなった
個人的にはあまり興味のないところ。というかお世話になるほどの大規模プロジェクトはやったことがない。。。
詳しくは->https://cwiki.apache.org/MAVEN/maven-3x-and-site-plugin.html
依存解決時のエラーをキャッシュするように
パフォーマンス向上のために依存解決時のエラー*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。