web-dev-qa-db-ja.com

Gradle推移的な依存関係の除外が期待どおりに機能していません。 (com.google.guava:guava-jdk5:13.0を削除するにはどうすればよいですか?)

これが私のbuild.gradleのスニペットです:

compile 'com.google.api-client:google-api-client:1.19.0'
compile 'com.google.apis:google-api-services-oauth2:v2-rev77-1.19.0'
compile 'com.google.apis:google-api-services-plus:v1-rev155-1.19.0'
compile 'com.google.appengine.tools:appengine-gcs-client:0.4.1'
compile 'com.google.appengine.tools:appengine-mapreduce:0.8'

これは、dependencyInsightで確認できるように、複数のバージョンのguavaをインポートします。

com.google.guava:guava:15.0 (conflict resolution)

com.google.guava:guava:14.0.1 -> 15.0
+--- com.googlecode.objectify:objectify:4.1.3
|    \--- default
\--- net.eusashead.spring:spring-cache-gae:1.0.0.RELEASE
     \--- default

com.google.guava:guava:[15.0,15.99] -> 15.0
+--- com.google.appengine.tools:appengine-gcs-client:0.4.1
|    +--- default
|    +--- com.google.appengine.tools:appengine-mapreduce:0.8
|    |    \--- default
|    \--- com.google.appengine.tools:appengine-pipeline:0.2.10
|         \--- com.google.appengine.tools:appengine-mapreduce:0.8 (*)
+--- com.google.appengine.tools:appengine-mapreduce:0.8 (*)
\--- com.google.appengine.tools:appengine-pipeline:0.2.10 (*)

com.google.guava:guava-jdk5:13.0
\--- com.google.api-client:google-api-client:1.19.0
     +--- default
     +--- com.google.apis:google-api-services-oauth2:v2-rev77-1.19.0
     |    \--- default
     +--- com.google.apis:google-api-services-plus:v1-rev155-1.19.0
     |    \--- default
     +--- com.google.appengine.tools:appengine-gcs-client:0.4.1
     |    +--- default
     |    +--- com.google.appengine.tools:appengine-mapreduce:0.8
     |    |    \--- default
     |    \--- com.google.appengine.tools:appengine-pipeline:0.2.10
     |         \--- com.google.appengine.tools:appengine-mapreduce:0.8 (*)
     +--- com.google.api-client:google-api-client-appengine:1.17.0-rc
     |    \--- com.google.appengine.tools:appengine-gcs-client:0.4.1 (*)
     +--- com.google.apis:google-api-services-storage:v1-rev1-1.18.0-rc
     |    \--- com.google.appengine.tools:appengine-gcs-client:0.4.1 (*)
     +--- com.google.apis:google-api-services-bigquery:v2-rev154-1.19.0
     |    \--- com.google.appengine.tools:appengine-mapreduce:0.8 (*)
     \--- com.google.api-client:google-api-client-servlet:1.17.0-rc
          \--- com.google.api-client:google-api-client-appengine:1.17.0-rc (*)

(*) - dependencies omitted (listed previously)

:への依存関係を削除しようとしました:

compile ('com.google.api-client:google-api-client:1.19.0'){
        exclude group: 'com.google.guava', module: 'guava-jdk5'
    }
compile ('com.google.api-client:google-api-client:1.19.0'){
        exclude group: 'com.google.guava', 
    }

ただし、dependencyInsightは同じままです。私も試しました

compile ('com.google.guava:guava:15.0'){force = true}

しかし、ここでも依存関係の洞察は同じままです。 com.google.guava:guava-jdk5:13.0を削除するにはどうすればよいですか?

詳細:Windows8.1ボックスでgradle1.2と2.1を試しました

私がこれを試す理由は、この例外を取り除くためです。

Java.lang.NoSuchMethodError: com.google.common.base.Stopwatch.createStarted()Lcom/google/common/base/Stopwatch;
13
unify

Guava-jdk5はまだ維持されていることがわかりました。

だから私はこれを変更しました:

compile ('com.google.guava:guava:15.0'){force = true}

このため:

compile('com.google.guava:guava-jdk5:17.0') { force = true }

これで問題が修正され、Google AppEngineプロジェクトの「com.google.common」パッケージのクラスを説明されているすべての依存関係で使用できるようになりました。

5
unify

除外せずに同じ依存関係を指す別の依存関係がどこかにある場合、依存関係は除外されないようです。

ただし、configurationを使用して依存関係を除外できます。

configurations {
  all*.exclude group: 'com.google.guava', module:'guava-jdk5'
}
29
thoutbeckers

@thoutbeckersの回答に基づいて、彼の回答が当てはまるとは思わなかった特別な場合がありましたが、実際には当てはまりました。うまくいけば、この答えが私の特別なケースの問題を共有した他の人を助けることができます。もともと、悪い推移的な依存関係はbuild.gradleファイル内の1つの依存関係によってのみ参照されていると思っていましたが、実際には2つの依存関係によって参照されていました。これは、悪い推移的な依存関係が参照された両方の依存関係に親子関係があったためですが、親依存関係ではなく、子依存関係との関係にのみ気づきました。

次の依存関係ツリー(コマンド gradle <my-project-name>:dependencies によって生成される)について考えてみます。

compileClasspath - Compile classpath for source set 'main'.
+--- my.org:com.my.pkg.parent:6.+ -> 6.0.4
|    +--- # misc. dependencies
|    +--- my.org:com.my.pkg.child:6.0.4
|    |    +--- # misc. dependencies
|    |    +--- other.org:bad.transitive.dependency:0.9.1 FAILED
|    |    +--- # misc. dependencies
|    |--- # misc. dependencies
+--- # misc. dependencies

依存関係ツリーから、other.org:bad.transitive:dependency:0.9.1はビルドファイル内の2つではなく、1つの依存関係によってのみ参照されているように見えます。ただし、Gradleファイルが次のようになっているとします。

// ... misc. ...
dependencies {
    // ... misc. dependencies ...
    compile 'my.org:com.my.pkg.parent:6.+'
    // ... misc. dependencies ...
    compile ('my.org:com.my.pkg.child:6.0.4') {
        exclude group: 'other.org', module: 'bad.transitive.dependency'
}

上記のようなGradleファイルの場合、除外したい推移的な依存関係が親の依存関係ではなく子の依存関係でのみ発生しても、エラーは持続します。ただし、親プロジェクトと子プロジェクトの両方がbuild.gradleファイルによって参照されるため、悪い推移的な依存関係は両方の依存関係から除外する必要があります。上記の@thoutbeckers。

(@thoutbeckersが回答に示したように)構成レベルで除外を追加したくない場合は、参照されている両方の依存関係から推移的な依存関係を明示的に除外することができます。

5
entpnerd

gradle dependenciesのこの奇妙な動作のいくつかの原因に遭遇しました。

  • gradle 4.10.xはデーモンにいくつかの中間結果をキャッシュするため、コマンドを実行するだけでは最新ではない可能性があります。したがって、Gradleデーモンを無効にします。
  • 独自の統合とプロジェクトビルドのためにGradleデーモンを実行できる他のツールとIDE(Eclipseなど)があります。したがって、他のデーモンプロセスを確認し、それらを強制終了します
  • デーモンが無効になっている場合でも、追加のキャッシュがあるようです。したがって、代わりにgradle clean dependenciesを実行してください。
  • キャッシュを回避するために環境変数GRADLE_OPTS=-Dorg.gradle.daemon=false -Dorg.gradle.caching=falseを設定するか、コマンドラインでこれらのオプションを提供することを検討してください
  • dependenciesレポート自体は、他のパスを介して到達した同じ不要な依存関係の次の発生を表示しない(表示しない)可能性があるため、欺瞞的です。次に、最初のパスから推移的な不要な依存関係を除外します機能しませんそして、別の(非表示の)パスを経由した場合でも、そのパスに表示されます。

識別すべてのパス不要な依存関係に到達し、それらすべてから除外します。

最初のパス/依存関係の実行gradle clean dependenciesをコメントアウトして、依存関係に到達する次のパスを見つけます。そのようなパスがすべて見つかるまで繰り返します。次に、コメントを解除して、識別されたすべてのパスから不要な依存関係を除外します。

0
Rusi Popov