5

Mavenが一貫性のないバージョンの間接依存関係を選択する状況に遭遇しました。その理由と、将来これを防ぐ方法を理解したいと思います。

pom.xmlファイルには次の依存関係がありました。

<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-jpa</artifactId>
  <version>1.1.0.RELEASE</version>
</dependency> 
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-web</artifactId>
  <version>3.1.2.RELEASE</version>
</dependency>

ただし、スプリングコアに直接依存することはありません。

どちらもspring-coreに依存します。spring-web3.1.2.RELEASEはspring-core3.1.2.RELEASEに依存し(pom-fileを参照)、spring-data-jpa1.1.0.RELEASEは任意の3に依存します。 xバージョンのspring-core(正確には[3.0.7.RELEASE、4.0.0.RELEASE)、そのpomファイルを参照してください)。

両方を組み合わせると、Mavenがスプリングコアバージョン3.1.2.RELEASEを選択することを期待します。ただし、そうではありません。代わりに、範囲[3.0.7.RELEASE、4.0.0.RELEASE)から最も高いものを選択します。これは現在3.2.0.RELEASEです。

(再現シナリオ:上記のpom.xmlファイル(要点)を独自のディレクトリーに置き、実行しますmvn dependency:tree -Dverbose=true:私にとって結果はこのツリー(要点)です。Linux上のMaven2.2.1とMaven3.0の両方で同じ結果が得られます。 Windowsでは4。)

一貫性がないため、これは間違っているようです。spring-webのpom-fileで許可されていないバージョンのspring-coreが使用されています。

(これは、spring-core 3.2.0.RC1が利用可能になったときに発生しました。次のアップデートで突然選択され、spring-core3.1と3.2の間の互換性のない変更のためにビルドエラーが発生したのは幸運でした。しかし次回はそれほど幸運ではなく、追跡が非常に難しいランタイムエラーが発生する可能性があります。)

うーん:宣言の順序が重要であることに気づきました<dependency>。spring -webを最初に配置すると、spring-core3.1.2.RELEASE選択されます。何が得られますか?

質問: Mavenに間接依存関係の一貫したバージョンを選択させるにはどうすればよいですか、または少なくともpomファイルで指定されたバージョンに反する選択をした場合に警告することができますか?

更新:私はここで一般的な解決策を求めています。この特定のケースでは、に依存関係を追加して、<dependencyManagement>常にスプリングコア3.1.2.RELEASEが必要であることを指定することで、正しい動作を得ることができることを知っています。ただし、Mavenには、そのような特定の宣言なしでRight Thing(TM)を実行してもらいたいと思います。

4

2 に答える 2

7

あなたが期待することは論理のようですが、Mavenにはこれを行う機会がありません。spring-data-jpaと関係があるかもしれない知識がなくても、依存関係を解決するだけspring-coreです。

依存関係の解決は、ここで説明されているように機能し、すでに説明した方法です。

依存関係のメディエーション-これは、アーティファクトの複数のバージョンが検出されたときに使用される依存関係のバージョンを決定します。現在、Maven 2.0は「最も近い定義」の使用のみをサポートしています。これは、依存関係のツリーでプロジェクトに最も近い依存関係のバージョンを使用することを意味します。プロジェクトのPOMで明示的に宣言することにより、いつでもバージョンを保証できます。2つの依存関係バージョンが依存関係ツリーの同じ深さにある場合、Maven 2.0.8まではどちらが勝つかは定義されていませんでしたが、Maven 2.0.9以降は、宣言の順序が重要になります。最初の宣言が勝ちます。

したがって、この状況を防ぐ唯一の方法は、それを認識し、必要なバージョンを自分のpomに明示的に設定することだと思います。

ちなみに、なぜ「これは一貫性がないので間違っているようです。spring-webのpom-fileで許可されていないバージョンのspring-coreが使用されています。」と思いますか?

のバージョン仕様は、このバージョンを使用するための推奨事項にすぎません(ここ<version>x.y</version>の「注」を参照)。このバージョンを強制的に使用する場合は、を設定する必要があります。<version>[x.y]</version>

于 2013-01-24T13:39:01.110 に答える
0

依存関係の宣言で、この依存関係をインポートしないように間接的な依存関係を定義する部分を追加できます。

于 2013-01-24T08:09:27.963 に答える