0

依存関係ツリーに競合がある場合(アーティファクトは同じですがバージョンが異なります)、AFAIK、Mavenは依存関係の最も高いバージョンを選択することで競合を解決し、「古い」バージョンを省略します。

ただし、新しいバージョンがSNAPSHOTの場合は、SNAPSHOTよりも古い安定バージョンが選択されるようです。

私の場合:some-artifact:0.5.0-SNAPSHOTS(0.4.0との競合のために省略)=>バージョン0.4.0は、必要な0.5.0-SNAPSHOTよりも選択されます。

これは設計通りに機能すると思いますが、その理由がわかりません。その次に、MavenにSNAPSHOTを安定版に引き継ぐように指示する方法があるかどうか考えてみてください。

4

3 に答える 3

2

Mavenが常に最高のバージョンを選択するというあなたの仮定は正確ではありません。アーティファクトは、ツリー内の依存関係の深さ、ツリー内の順序、依存関係がスナップショットかリリースか、依存関係管理など、他のすべてをほぼオーバーライドする多くの要因に基づいて選択されます。

残念ながら、Mavenの依存関係解決アルゴリズムに関する決定的な情報源は誰も知りません。あなたはそれの断片がいたるところに散らばっているのを見つけるでしょう。いくつかの便利なリファレンス:

  • 依存関係メカニズムの概要では、トピックの概要と、推移的な依存関係に関する短いセクションと、依存関係ツリーからの選択方法について説明します。
  • Sonatype Mavenの本には、プロジェクトの依存関係全般に関するより詳細なセクションがあり、この主題に関する知識に多くのことが追加されます。
  • その同じ本の前のセクションでは、プロジェクトバージョンについて説明しています。これは、この問題に強く関連しており、SNAPSHOTバージョンに関する優れたセクションがありますが、依存関係の解決にどのように役立つかについては、私が望むほどではありません。
  • プロジェクトの関係では、座標系と、プロジェクトの継承がどの依存関係が含まれるかにどのように影響するかについて説明します。
  • 最後に、POMリファレンスは、pomに関係するほとんどすべてのことの出発点として適しています。より多くの情報を効果的に検索し始めることができるように十分に理解するのに役立つすべてのpom要素の少なくとも簡単な説明があります。

いくつかの実用的なアドバイスとして、の出力はmvn dependency:tree、依存関係の特定のバージョンが選択された理由を発見するのに非常に役立ちます。「foo:bar:1.2(以前は1.1)」のようなことさえよく言われます。誤ったバージョンがどこから来ているのかを把握したら、特定の依存関係バージョンがプロジェクトに使用されていることを確認する方法がいくつかあります。

于 2012-05-25T03:26:41.400 に答える
1

0.4.0バージョンが、POM内の別の依存関係を介して推移的な依存関係として取り込まれている場合は、それを除外できるはずです。dependency:tree目標は、これが起こっているかどうかを確認するのに役立つはずです。

于 2012-05-25T01:15:15.553 に答える
0

Mavenは、スナップショットバージョンよりもリリースバージョンを優先するように設計されています。同じPOMに2つの依存関係があり、1つを削除しても競合を解決できない理由がわからないため、依存関係の1つが親pomから継承されていると想定します。この場合、継承された依存関係をとして設定できます。バージョンが低い場合でも、子POMがそれをオーバーライドできるようにする必要がある<optional>true</optional>と思います。

それが機能しない場合の悪い/ハッキーな解決策-0.5.0バージョンがスナップショットであると認識しないようにローカルリポジトリを編集します(または、能力がある場合はプライベートネクサスリポジトリを編集します)

于 2012-05-24T18:43:14.040 に答える