19

私のプロジェクトには、インターフェースを実装するクラスがあります。インターフェースは依存関係から来ています。より多くのメソッドを持つバージョンを除いて、それ自体が同じインターフェースを含むjarに依存している別の依存関係があります。同じpackage-interfaceを含む2つのjarは、同じgroupIdまたはartifactIdを持たないでください。
プロジェクトのクラスがすべてのメソッドを実装していないとコンパイラが文句を言うため、コンパイルが失敗します。コンパイラが間違ったjarからインターフェイス参照を取得しているためだと気づきました。私の質問は、なぜmavenは、プロジェクトPOMで明示的に言及したjarからのインターフェースではなく、推移的な依存関係からのインターフェースを使用するのですか?使用されているjarが定義の前半に表示されていることがわかります(クラスパスでも想像できます)が、これらの場合、Mavenは最短パスの依存関係から衝突するクラス/インターフェースを使用して解決したと思いました

これが依存関係ツリーの一部です。これはgrepさ​​れていますが、 (実際に使用されているもの)は(使用されるべきもの)javax.servlet:servlet-apiと比較してツリーの奥深くにあることがわかります。tomcat:servlet

[builder@ca-rd-build11 proj]$ mvn dependency:tree | grep servlet
[INFO] |  +- javax.servlet:servlet-api:jar:2.4:compile
[INFO] +- tomcat:servlet:jar:4.0.6:compile

私はMaven3.0.4を使用しています

4

3 に答える 3

20

プロジェクトPOMで明示的に言及したjarのインターフェイスではなく、推移的な依存関係のインターフェイスをmavenが使用しているのはなぜですか?

Maven にとって、この 2 つは互いに何の関係もないからです。Maven はクラス名やパッケージ名については認識していません。Maven は groupId と artifactId についてのみ認識しています。それらは同じではないため、maven には推移的な依存関係を省略する理由はありません。

私が正しければ、Maven は定義された順序で依存関係をクラスパスに配置します。つまり、依存関係の推移的な依存関係は、依存関係のa前に表示されbます。

于 2012-09-27T15:47:20.697 に答える
5

他の jar ファイルへの依存関係を宣言するときに、競合する jar ファイルへの推移的な依存関係を除外するように指示できます。

    <dependency>
        <groupId>group</groupId>
        <artifactId>artifact</artifactId>
        <version>1.0.0</version>
        <exclusions>
            <exclusion>
                <groupId>othergroup</groupId>
                <artifactId>ArtifactToExclude</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
于 2012-09-27T15:44:49.570 に答える