24

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

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

4

2 に答える 2

8

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 1.0 が使用されます。 Eは短いです。A で D 2.0 への依存関係を明示的に追加して、D 2.0 の使用を強制することができます。

バージョン 2.5 が別の依存関係によって推移的に含まれているようです。これにより、バージョン 4.3 と 2.5 の両方が同じ長さになります。

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

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

于 2012-10-25T23:19:18.003 に答える
6

一般に、クラスパスには一度に 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

于 2012-10-25T17:59:02.487 に答える