Mavenをしばらく使用した後、Mavenがビルドアーキテクチャにもたらす多くの機能、特に依存関係の管理にワクワクしています。しかし、私は何度も何度も1つの問題に遭遇しました。それは、Mavenがマルチモジュールプロジェクト間の依存関係をどのように解決するかです。これが現在のMaven実装の大きな欠陥であるかどうか、および/または満足のいく回避策があるかどうか疑問に思っています。
マルチモジュールのMavenプロジェクトがあるとしましょう。親pomには、moduleA(jar)、moduleB(jar)、およびmoduleC(war)の3つのモジュールが含まれています。BはAに依存し、CはBに依存します。mvn dependency:go-offline
ここで、すべての依存関係を解決し、それらをローカルの.m2ディレクトリに移動することになっている親プロジェクトでを実行したいと思います。MavenがmoduleBに作用しているときにmoduleAの依存関係を解決できないと文句を言うため、失敗します。これらのモジュールはすべて1つのgroupIdに属しているため-DexcludeGroupIds=x.y.z
、これらのモジュールの依存関係を除外するために使用しようとしていますが、それでも同じ時点で失敗します。
Mavenが文句を言っている理由を理解しています-moduleAはまだビルドされていないため、go-offlineゴールが実行されたときに、ローカルまたは内部リポジトリにmoduleA:jarアーティファクトがありません。しかし、IMHOプラグインは、これらのモジュール間の依存関係を異なる方法で処理する必要があります。この場合、それは単にそれを無視するべきです。mvn clean install
moduleA:jarをローカルリポジトリにインストールするだけで簡単にできると主張する人もいるかもしれません。その後、実行mvn dependency:go-offline
は確実に機能します。しかし、その回避策は、このオフライン目標の目的を無効にします。このプラグインを使用すると、プロジェクト全体をビルドせずに、依存関係を解決してローカルリポジトリにプルできます。dependency:copy-dependencies
別のケースでゴールを使用しましたが、同じ問題があります。
他のシナリオでも同様の問題が発生しました。「mvncleangenerate-source」は依存関係を解決できませんでした。を実行するとmvn clean compile
、すべてが正常に機能しますが、実行mvn clean generate-source
すると、Mavenがモジュール間の依存関係を解決できないため、失敗します。その場合、は@requiresDependencyResolution
antrunプラグインが原因でした。
antrunプラグインと依存関係プラグインの両方がMavenの世界で非常に人気があるため、この問題に遭遇したのは私だけではないと確信しています。誰かが解決策/回避策を見つけますか?