2017-10-09 21 views
1

私は依存関係に問題があります。2つの異なる依存関係の問題の同じインタフェース

は私のプロジェクトでは、このように二つの依存関係しています

dependencies { 

    provided group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0' 

    compile files('path/to/ABC.jar') 

} 

ABC.jarは​​に、独自の依存関係を持っています。ここ

dependencies { 

    provided group: 'javax.servlet', name: 'servlet-api', version: '2.5' 

} 

は、私が取り扱っております問題です。私はServletContextインタフェースを使用する必要があります。このインタフェースはservlet-apiライブラリで提供されており、コンパイラは間違ったものを使います。

Gradleは、hereのようにバージョンの競合を自動解決します。

しかし、私の場合は、依存関係に2つの異なるバージョンがある場合にのみ機能するため、私の場合は役に立ちません。この場合;それは新しいバージョンの問題ですが、名前は​​からjavax.servlet:javax.servlet-apiに変更されました。したがって、バージョンの問題ではないようだから、gradleはこの競合を自動解決しません。

hereと記載されているように、過渡的な依存性を除いて使用していたことがありました。

compile files('path/to/ABC.jar') { 
    exclude group: 'javax.servlet' 
} 

しかし、うまくいきませんでした。excludeは、ローカルの 'jar'ファイルでは動作しません。

今、私は他に何をすべきか分かりません。

どのようにローカルファイルとして追加される依存関係の依存関係を除外できますか?

(最初の質問にまだ回答がない場合)正しいServletContextインターフェイスを使用するには、どのようにコンパイラに伝えますか?

答えて

3

compile files('path/to/ABC.jar')はファイル依存です。ファイル依存関係には依存関係の情報がないため、推移的な依存関係は導入されません。このABC.jarがJARに含まれている依存クラスを持つ "fat" jarの場合、Gradle、Maven、Ant/Ivyなどの依存関係を処理するはずです。適切に宣言された依存関係の適切な「シン」バージョンを使用するか、ビルドスクリプトでJARを「再パッケージ」して、取り込みたくない依存クラスを除外する必要があります。依存関係管理あなたのためにこれを行うことができます。

依存関係が本当にどこから来るのかを調べるには、gradlew dependencyInsight --configuration runtime --dependency javax.servlet:servlet-apiまたはgradlew dependencies --configuration runtimeを実行します。


実は、私はそれを正しく見る場合、それはおそらく

compile files('path/to/ABC.jar'), { 
    exclude group: 'javax.servlet' 
} 

または

compile(files('path/to/ABC.jar')) { 
    exclude group: 'javax.servlet' 
} 

する必要がありますので、あなたの例でも、コンパイルべきではありません。しかし、私は、ローカルファイルと、言ったように従属性は過渡的な依存性がないため、除外はとにかく意味をなさない。


Gradleのバージョン競合魔法の仕事をするために、あなたは、単にこれらのライブラリは

dependencies { 
    modules { 
     module('javax.servlet:servlet-api') { 
      replacedBy 'javax.servlet:javax.servlet-api' 
     } 
    } 
} 

のようなモジュールの交換を使用することにより、実際には異なる座標と同じライブラリですその後のGradleがそれらを見ているのGradleを伝えることができます同じライブラリとして、バージョン紛争解決の魔法を実行することができます。古いバージョンを必要とするライブラリが新しいバージョンとまだ動作しているかどうかは、確認したり、試したりする必要がある別のトピックです。これは常に、新しいバージョンが古いバージョンと下位互換性があるかどうかによって異なります。

1

これは現在テストする方法がありませんが、構文が間違っていると思います。

compile(files('path/to/ABC.jar')) { 
    exclude group: 'javax.servlet' 
} 

私は、今それをテストすることができますかどうかをチェックし、コメントを与えることができない、言うように:私はあなたの場合には、それは次のようになり、異なって見えるここにいくつかの例があります。

関連する問題