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)を実行してもらいたいと思います。