1. ホーム
  2. java

[解決済み] Maven の依存関係の解決 (コンフリクト)

2023-06-23 08:58:13

質問

4つのプロジェクトがあるとします。

  • プロジェクトA (BとDに依存している)
  • プロジェクト B (D に依存している)
  • プロジェクト C (D に依存)
  • プロジェクト D

このシナリオでは、プロジェクト A を実行すると、Maven は依存関係を D に正しく解決します。私がこれを正しく理解した場合、Maven は常に最短パスで依存関係を取ります。D は A の直接の依存関係であるため、B 内で指定された D よりも、D が使用されます。

しかし、今、この構造を仮定します。

  • プロジェクトA (BとCに依存している)
  • プロジェクト B (D に依存している)
  • プロジェクト C (D に依存)
  • プロジェクト D

この場合、Dを解決するためのパスは同じ深さを持っています。何が起こるかというと、Mavenが競合を起こすということです。依存関係を除外するようMavenに指示することが可能であることは知っています。しかし、私の質問は、このような問題に対処する方法です。私は、現実の世界のアプリケーションでは、多くの依存関係があり、おそらく多くの競合もあります。

ベストプラクティスの解決策は本当にものを除外することなのでしょうか、それとも他に可能な解決策があるのでしょうか。いくつかのバージョンが変更され、Maven が異なる依存関係を取るようになったため、突然 ClassNotFound Exception が発生した場合に対処するのが非常に困難であることがわかります。もちろん、この事実を知っていれば、問題が依存関係の衝突であることを推測するのは少し簡単になります。

私は maven 2.1-SNAPSHOT を使用しています。

どのように解決するのですか?

このような状況を解決するための maven の方法は、"maven "ディレクトリの中に <dependencyManagement> セクションをプロジェクトのルート pom に含め、そこでどのバージョンのライブラリが使用されるかを指定します。

EDITです。

<dependencyManagement>
  <dependencies>
    <dependency>
        <groupId>foo</groupId>
        <artifactId>bar</artifactId>
        <version>1.2.3</version>
    </dependency>
   </dependencies>
</dependencyManagement>

これで、依存関係によってどのバージョンのライブラリ foo:bar が要求されても、このプロジェクトとすべてのサブプロジェクトでは常にバージョン 1.2.3 が使用されることになります。

参照。