0

以下の親と子の pom を指定するとlib1lib2両方に class が含まれますfoo.bar.Test

親ポン

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>foo</groupId>
    <artifactId>foo-parent</artifactId>
    <version>1.0</version>
    <dependencies>
        <dependency>
            <groupId>my.transitive</groupId>
            <artifactId>lib1</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
</project>

子ポン

<project>
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>foo</groupId>
        <artifactId>foo-parent</artifactId>
        <version>1.0</version>
    </parent>
    <artifactId>foo-child</artifactId>
    <dependencies>
        <dependency>
            <groupId>my.transitive</groupId>
            <artifactId>lib2</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
</project>

foo-childに依存関係として含めてmyAppインスタンス化するとfoo.bar.Test、Maven はどのバージョンのクラスに解決されますか? なぜ?

私のアプリポン

<project>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>myApp</artifactId>
    <groupId>myApp</groupId>
    <version>1.0</version>
    <dependencies>
        <dependency>
            <groupId>foo</groupId>
            <artifactId>foo-child</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>
</project>
4

1 に答える 1

3

簡単に言えば、クラスパスでどちらが最初に見つかったかによって異なります。

2 つの同じクラスをアプリケーションにパッケージ化することは、デバッグが困難な多くのエラーにつながる可能性があるため、理想的ではありません... myApp プロジェクトが単に jar になる場合は、同じライブラリを使用してコンパイルするのが最善です。実行時に利用できるもの。

maven は pom に書き込まれた順序を使用してビルドすると思います。これを調べる 1 つの方法は、myApp に対して次のコマンドを実行することです。

mvn の依存関係:tree -Dverbose

これにより、仕様ごとにクラスパスに表示される順序で依存関係が出力されます。除外を使用して、不要な継承ライブラリをいつでも除外できます。お役に立てれば。

于 2016-09-22T20:20:57.433 に答える