web-dev-qa-db-ja.com

親pomで定義されたライブラリバージョンをオーバーライドする

ライブラリAの親pomでバージョン4.3を定義しましたが、子pomで指定されたプロジェクトモジュールでは、バージョン2.5のAが必要です。私が直面している問題は、両方のバージョンが保持されているため、競合が発生していることです。

問題の解決方法を教えてください。

20
Rndm

一般に、クラスパスには、一度に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で競合するアーティファクトのgroupIdartifactIdを指定する必要がある場合。

8
Andrew Logvinov

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の両方が同じ長さになります。

  • プロジェクト->親-> A 4.3
  • プロジェクト->依存関係-> A 2.5

プロジェクトでA2.5の依存関係を明示的に定義することにより、A 2.5が最も近くなり、他のバージョンをオーバーライドします。

7
Adam Schreiner