ライブラリAの親pomでバージョン4.3を定義しましたが、子pomで指定されたプロジェクトモジュールでは、バージョン2.5のAが必要です。私が直面している問題は、両方のバージョンが保持されているため、競合が発生していることです。
問題の解決方法を教えてください。
一般に、クラスパスには、一度に1つのバージョンの依存関係のみを含めることをお勧めします。このようにすることで、実行時に使用されるクラスのバージョンを正確に知ることができます。
バージョンの競合を回避するには、次のように依存関係を指定してください。
<dependency>
<groupId>commons-daemon</groupId>
<artifactId>commons-daemon</artifactId>
<version>1.0.1</version>
<exclusions>
<exclusion>
<groupId>some_group</groupId>
<artifactId>some_artifact</artifactId>
</exclusion>
</exclusions>
</dependency>
バージョン2.5で競合するアーティファクトのgroupId
とartifactId
を指定する必要がある場合。
http://maven.Apache.org/guides/introduction/introduction-to-dependency-mechanism.html
依存関係のメディエーション-これは、アーティファクトの複数のバージョンが検出されたときに使用される依存関係のバージョンを決定します。現在、Maven 2.0は「最も近い定義」の使用のみをサポートしています。つまり、依存関係のツリーでプロジェクトに最も近い依存関係のバージョンを使用します。プロジェクトのPOMで明示的に宣言することにより、いつでもバージョンを保証できます。 2つの依存関係バージョンが依存関係ツリーの同じ深さにある場合、Maven 2.0.8まではどちらが勝つかは定義されていませんでしたが、Maven 2.0.9以降、重要なのは宣言の順序です。最初の宣言が勝ちます。
- 「最も近い定義」とは、使用されるバージョンが、依存関係のツリーでプロジェクトに最も近いバージョンになることを意味します。 A、B、およびCの依存関係がA-> B-> C-> D 2.0およびA-> E-> D 1.0として定義されている場合、AからDへのパスがEは短いです。 AのD 2.0に依存関係を明示的に追加して、D 2.0の使用を強制できます。
バージョン2.5が別の依存関係によって推移的に含まれているようです。これにより、バージョン4.3と2.5の両方が同じ長さになります。
プロジェクトでA2.5の依存関係を明示的に定義することにより、A 2.5が最も近くなり、他のバージョンをオーバーライドします。