web-dev-qa-db-ja.com

Gradleに2つの依存関係に同じバージョンを設定させるにはどうすればよいですか?

次の2つの依存関係を使用します。

compile 'com.google.guava:guava:14.0.1'
compile 'com.google.guava:guava-gwt:14.0.1'

正しく動作するには、両方が同じバージョンである必要があります。私の他の依存関係はより高いバージョンを使用しているため、Gradleは依存関係ごとに異なるバージョンを使用します。

gradle dependenciesを実行してこれを見つけました:

compile - Compile classpath for source set 'main'.
+--- com.google.guava:guava:14.0.1 -> 17.0
+--- com.google.guava:guava-gwt:14.0.1
|    +--- com.google.code.findbugs:jsr305:1.3.9
|    \--- com.google.guava:guava:14.0.1 -> 17.0 

Gradleにこれら2つの依存関係に同じバージョンを設定させるにはどうすればよいですか?

57
confile

依存関係の1つは、強制的にguavaバージョンを更新することです。 gradle dependenciesを使用して、バージョンを削除しているライブラリを見つけます。

問題は、14.0.1を使用するように強制すると、別のライブラリが正しく機能しない可能性があることです。 17.0バージョンを依存関係として使用することはできませんか?

Build.gradleで個々のバージョン番号を維持するのではなく、バージョン番号のマッピングを持つdependencies.gradleファイルを使用し、それをbuild.gradleに取り込みます。そうすれば、単一のグアババージョンを維持するだけで済みます。あなたの例は次のようになります:

dependencies.gradle

ext {
    ver = [
        guava: '14.0.1'
    ]
}

そして、build.gradleファイルに次のものを含めることができます:

apply from: "dependencies.gradle"

dependencies {
    compile group: 'com.google.guava', module: 'guava', version: ver.guava
    compile group: 'com.google.guava', module: 'guava-gwt', version: ver.guava
}

その後、17.0に移行する場合は、dependencies.gradleを変更するだけです。

私はまた、推移的な依存関係をfalseに設定する明確なファンです

configurations.compile { transitive = false }

この方法では、コンパイル時に一部の依存関係が排除されませんが、排除ライブラリに完全な下位互換性がない場合は実行時に問題が発生する可能性があります。コードを記述している場合は、使用するライブラリを知っておく必要があり、依存関係を明示する必要があります。依存関係のアップグレードや混乱を防ぐことができます。

8
Klunk

このセクションをdependencies.gradleファイルに追加します

configurations.all {
        resolutionStrategy { 
            force 'com.google.guava:guava:14.0.1'
            force 'com.google.guava:guava-gwt:14.0.1'
        }
    }
85
cmcginty
configurations.all {
  resolutionStrategy {  
    eachDependency { DependencyResolveDetails details ->
      if (details.requested.group == 'com.google.guava') {
        details.useVersion "14.0.1"
      }
    }
  }
}

dependencies {
  compile 'com.google.guava:guava'
  compile 'com.google.guava:guava-gwt'
}
47

依存関係の1つが破損したspring-web 4.2.4を使用する同様の状況がありました。必要な特定のライブラリバージョンを強制する必要があります。別のコメントで述べたように、互換性の問題を引き起こす可能性がありますが、時には必要です。

私が見つけたライブラリバージョンを強制する最も邪魔な方法は、代わりに使用することでした

compile "org.springframework:spring-web:4.2.3.RELEASE"

依存関係の構成を強制的に指定する:

compile("org.springframework:spring-web:4.2.3.RELEASE"){
    force = true
}

Springバージョンを一時的に(次のリリースまで)ダウングレードする必要があるときに使用しました。

32
Pijusn

または、dependencySets(または、BOM POMが利用可能な場合はmavenBomを使用できます) spring-dependency-managementGradleプラグインのサポート。このプラグインはspring-bootGradleプラグインでも自動的に適用されることに注意してください。詳細については、 here を参照してください。

plugins {
  id 'io.spring.dependency-management' version '1.0.1.RELEASE'
}

dependencyManagement {
  dependencies {
    dependencySet(group: 'com.google.guava', version: '14.0.1') {
      entry 'guava'
      entry 'guava-gwt'
    }
  }
}

dependencies {
  compile 'com.google.guava:guava'
  compile 'com.google.guava:guava-gwt'
}
2
Stevo Slavić

両方の依存関係に新しいバージョンを使用するだけでよい場合、問題を修正する最も簡単な方法は、依存関係を更新することです。

compile 'com.google.guava:guava:17.0'
compile 'com.google.guava:guava-gwt:17.0'

これにより、両方とも17.0になります。両方を古いバージョンに強制しようとするよりも簡単で、追加のボーナスとして(おそらく)バグ修正と新機能が付属する新しいバージョンを取得できます。

公平を期すために、@ Klunkは彼の答えで「依存関係として17.0バージョンを使用することはできませんか?」 。

1

transitive = falseを設定しないことをお勧めします。この時点から、手動で依存ツリーを解決する必要があります。

configurations.allを使用して目的のグアババージョンを強制するか、明示的に依存度を追加してforced = trueに設定できます。

ここの例: http://www.devsbedevin.com/Android-understanding-gradle-dependencies-and-resolving-conflicts/

1
Vaiden

別のオプションは、依存関係の制約を使用することです: https://docs.gradle.org/current/userguide/managing_transitive_dependencies.html#sec:dependency_constraints

dependencies {
    implementation 'org.Apache.httpcomponents:httpclient'
    constraints {
        implementation('org.Apache.httpcomponents:httpclient:4.5.3') {
            because 'previous versions have a bug impacting this application'
        }
        implementation('commons-codec:commons-codec:1.11') {
            because 'version 1.9 pulled from httpclient has bugs affecting this application'
        }
    }
}
0
sendon1982