21

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 installmoduleA:jarをローカルリポジトリにインストールするだけで簡単にできると主張する人もいるかもしれません。その後、実行mvn dependency:go-offlineは確実に機能します。しかし、その回避策は、このオフライン目標の目的を無効にします。このプラグインを使用すると、プロジェクト全体をビルドせずに、依存関係を解決してローカルリポジトリにプルできます。dependency:copy-dependencies別のケースでゴールを使用しましたが、同じ問題があります。

他のシナリオでも同様の問題が発生しました。「mvncleangenerate-source」は依存関係を解決できませんでした。を実行するとmvn clean compile、すべてが正常に機能しますが、実行mvn clean generate-sourceすると、Mavenがモジュール間の依存関係を解決できないため、失敗します。その場合、は@requiresDependencyResolutionantrunプラグインが原因でした。

antrunプラグインと依存関係プラグインの両方がMavenの世界で非常に人気があるため、この問題に遭遇したのは私だけではないと確信しています。誰かが解決策/回避策を見つけますか?

4

6 に答える 6

2

ここにサンプル プロジェクトを含む JIRA チケットを作成しました。

https://issues.apache.org/jira/browse/MDEP-516

投票してください。

于 2016-01-16T13:18:44.030 に答える
1

なぜそれが機能しないのかを説明したので、問題を理解します。あなたにとっての問題は、A.jarが見つからないときに停止することですが、それはBを構築するときにのみ発生します。したがって、ある種の、時には有用な戦略があります。

あなたはそれ自体でAを台無しにする必要があります。Aをビルドするだけです。依存関係をロードしてからビルドするという計画を使用してください。

ビルドしたら、B、Cの順に同じことを行うことができます。ステップバイステップ。

ここで覚えておくべきことの1つは、ローカルリポジトリにあるAの古いスナップショットを使用してBをビルドしても問題ない場合があるということです。Bが必要とする署名の変更または新しいものがある場合にのみ、リポジトリ内のAビルドの新しいスナップショットが必要です。

ここにもいくつかの議論があります:Mavenモジュール+単一の特定のモジュールの構築

最後に、ビルドに時間がかかりすぎると、通常、この種の質問が出てくるわけではありません。ビルドを高速化する方法はいくつかあります。

  1. より高速なハードウェアを入手してください。ビルドコンピューター、ディスクストレージ、またはネットワーク速度は、低速のビルドにかかる時間を無駄にするよりもアップグレードが安価な典型的なコンポーネントです。
  2. 再構築を必要としないものをビルドしないことで、ビルドを高速化します。(たとえば、生成されたすべてのコードを毎回再構築するビルドがありました。生成されたコードへの依存関係が変更された場合を除いて、ビルドにそれができないようにするものをいくつか追加しました。)
  3. テストをスピードアップします。これは、テストを2つの部分に分割することを意味する場合があります。パート1は高速テストで、パート2は低速テストです。コードのチェックインまたはアーティファクトのリリースの前に、すべてのビルドで高速テストを実行し、低速テストを実行します。
  4. マルチモジュールビルドを2つ以上の個別のビルドに分割し、人間の知性を使用して、いつ再構築するかを決定します。これは、一部のjarが安定していて、それ以上変更されない場合にうまく機能します。
  5. 独自のメソッドを入力して、ビルドを高速化します。
于 2013-02-04T20:34:56.250 に答える
0

そのような機能がMavenで可能になるとは思えません。プロジェクトは共通の親を共有し、相互に依存していますが、Mavenは、プロジェクトを構築するためにこれらのプロジェクトをどこで見つけるかを知ることができない可能性があります。また、プロジェクトをビルドするだけでよいのか、依存関係に間違ったバージョン番号を指定したのかを判断することもできません。

于 2013-02-04T20:35:11.710 に答える