2012-03-21 17 views
15

私は、私のMavenプロジェクトに2つの異なるバージョンの特定の推移的依存関係がある2つの直接の依存関係のケースを経験しました。Maven - 同じ依存関係の複数のバージョンを検出する

は、私は次のように直接的な依存関係を持っていた私の特定のケースでは:ジャージー:

<dependency> 
     <groupId>org.jclouds.driver</groupId> 
     <artifactId>jclouds-sshj</artifactId> 
     <version>${jclouds.version}</version> 
    </dependency> 

<dependency> 
     <groupId>org.mule.modules</groupId> 
     <artifactId>mule-module-jersey</artifactId> 
     <version>${mule.version}</version> 
    </dependency> 

これらの依存関係の両方がcom.sun.jersey上の(深い)推移依存関係を持っていました-coreではなく、それぞれ異なるバージョンがあります。 Mavenはこれで失敗しなかったし、警告しました(もしそうなら、私はそれを見たことはありませんでした!)そのようなことが起こっていたことは...ジャージー・バージョンのバージョンが、 jcloudsの依存関係によってもたらされたコアは、いくつかのものを破壊しました。

この種のディープ推移依存性のオーバーライドを検出し、少なくともそのような衝突を検出した場合、ユーザーに警告する(または、Mavenの実行に失敗する)ツールが存在する他のツールがありますか?デフォルトの動作は、依存関係を解決する際に表示される最初のバージョンを選択することですか?

答えて

24

依存関係エンフォーサプラグインを使用します。依存関係が適切に収束しない場合、ビルドは停止します。

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-enforcer-plugin</artifactId> 
    <version>1.0.1</version> 
    <executions> 
     <execution> 
     <id>enforce</id> 
     <configuration> 
      <rules> 
      <DependencyConvergence /> 
      </rules> 
     </configuration> 
     <goals> 
      <goal>enforce</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 
+0

これはまさに私が探していたものと思われます。私はこのために執行者のプラグインをチェックするとは思わなかった。 – whaley

3

あなたはdepenencyレポートを実行したり、依存関係ツリーを使用することができます。

MVNの依存関係:ツリー-dverbose -Dincludes =コモンズ・コレクション

2

あなたは自分のdependency hiercharchy概要を見ている可能性があります。これにより警告は表示されませんが、同じライブラリの新しいバージョンで特定のバージョンが破棄されているかどうかを確認できます。

+0

あなたは実行依存関係を参照していますか?@DmitryBを指定して詳細を指定したツリー? – whaley

1

不要なバージョンを適切な依存関係から除外することで、バージョンの競合を解決できます。例:

<dependency> 
    <groupId>org.jclouds.driver</groupId> 
    <artifactId>jclouds-sshj</artifactId> 
    <version>${jclouds.version}</version> 
    <exclusions> 
     <exclusion> 
     <groupId>com.sun.jersey</groupId> 
     <artifactId>jersey-core</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

または、必要なバージョンのcom.sun.jersey:jersey-coreを依存関係に追加します。 Mavenは、依存関係のルートに最も近い依存関係をサポートすることによって、バージョンのconfilictsを解決します。

+0

私はこの問題を解決する方法を知っています。私が望むのは、まずは潜在的な*問題があると教えてくれることです。 – whaley

4

@ClementPは完全に良い答えをあなたに提供しました。ただし、マルチモジュールプロジェクトでは不十分な場合があります。

enforcerプラグインのdepedndencyconvergenceゴールは推移的依存性の衝突を検出する方法を知っていますが、衝突は別の方法で隠れることがあります。

マルチモジュールプロジェクトがあるとします。ルートはAであり、2つのサブモジュールB1およびB2を有する。

B1がアーティファクトの依存性を宣言:B:C:1.1、B2はアーティファクトの依存性を宣言しながら、A:B:C:この場合2.0

、両方の場合モジュールは、依存関係を持って構築され、デプロイされます。衝突が発生しますが、それはエンフォーサプラグインが検出方法を知らない種類です。プロジェクトAはそのサブモジュールに依存しない(できない)からです。

私たちの組織でこの問題を克服するために、dependency:listプラグインを使用し、その出力を手動で分析しました。

プロセスの概要:この目標を実行すると、プロジェクト階層内のすべてのプロジェクトの推移的な依存関係の一覧が表示されます。出力を解析し、依存関係をソートし、バージョンIDだけが異なるアーティファクトのみを検索します。これはあなたのCI envでいくつかのスクリプティングを必要としますが、これは全体像を得るための唯一の方法です。

関連する問題