Eine Ihrer Abhängigkeiten besteht darin, die Guavenversion zum Aktualisieren zu zwingen. Verwenden Sie gradle dependencies
diese Option, um zu ermitteln, welche Bibliothek Ihre Version entfernt.
Das Problem ist, dass eine andere Bibliothek möglicherweise nicht ordnungsgemäß funktioniert, wenn Sie die Verwendung von 14.0.1 erzwingen. Können Sie nicht einfach die Version 17.0 als Ihre Abhängigkeit verwenden?
Anstatt einzelne Versionsnummern im build.gradle zu verwalten, verwende ich eine dependencies.gradle-Datei, die eine Zuordnung der Versionsnummern enthält, und ziehe diese in das build.gradle. Auf diese Weise muss ich nur die einzelne Guavenversion pflegen. Ihr Beispiel wird also sein:
dependencies.gradle
ext {
ver = [
guava: '14.0.1'
]
}
und dann in der build.gradle-Datei können Sie haben:
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
}
Wenn ich dann zu 17.0 wechseln möchte, muss ich nur die dependencies.gradle ändern.
Ich bin auch ein definitiver Fan davon, transitive Abhängigkeiten mit false auf false zu setzen
configurations.compile { transitive = false }
Auf diese Weise werden zur Kompilierungszeit einige Abhängigkeiten nicht entfernt, obwohl zur Laufzeit möglicherweise ein Problem auftritt, wenn die Räumungsbibliothek nicht vollständig abwärtskompatibel ist. Seien wir ehrlich, wenn Sie den Code schreiben, sollten Sie wissen, welche Bibliotheken Sie verwenden, und Sie sollten Ihre Abhängigkeiten explizit angeben. Es schützt Sie vor einer Ihrer Abhängigkeiten, die Sie aktualisieren und durcheinander bringen.
Execution failed for task ':transformClassesWithJarMergingForDebug'. > com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: com/google/android/gms/gcm/GoogleCloudMessaging$1.class
dependencies.gradle
Dateiconfigurations.all { resolutionStrategy.eachDependency { 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' }
quelle
Ich hatte eine ähnliche Situation, in der eine der Abhängigkeiten Spring-Web 4.2.4 verwendete, das defekt war. Sie müssen eine bestimmte Bibliotheksversion erzwingen, die Sie möchten. Wie in einem anderen Kommentar erwähnt, kann dies zu Kompatibilitätsproblemen führen, ist jedoch manchmal erforderlich.
Die am wenigsten aufdringliche Möglichkeit, eine von mir gefundene Bibliotheksversion zu erzwingen, war die Verwendung
compile "org.springframework:spring-web:4.2.3.RELEASE"
Angeben der Abhängigkeitskonfiguration als erzwungen:
compile("org.springframework:spring-web:4.2.3.RELEASE"){ force = true }
Ich habe es verwendet, als ich die Spring-Version vorübergehend (bis zur nächsten Version) herunterstufen musste.
quelle
Eine weitere Option ist die Verwendung der Abhängigkeitsbeschränkung: https://docs.gradle.org/current/userguide/dependency_constraints.html
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' } } }
quelle
Alternativ können Sie die Unterstützung von dependencySets (oder mavenBom, wenn BOM POM verfügbar ist) im Gradle-Plugin für das Spring-Dependency-Management verwenden . Beachten Sie, dass dieses Plugin auch automatisch mit dem Spring-Boot- Gradle-Plugin angewendet wird . Weitere Details finden Sie hier .
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' }
quelle
Ich würde gegen das Setzen vorschlagen
transitive = false
, da dieser Ansatz Sie zwingen würde, den Abhängigkeitsbaum manuell selbst aufzulösen.Sie können entweder die gewünschte Guavenversion über erzwingen
configurations.all
oder die Abhängigkeit explizit hinzufügen und festlegenforced = true
.Beispiele hier: http://www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/
quelle
Wenn es in Ordnung ist, nur die neuere Version für beide Abhängigkeiten zu verwenden, können Sie Ihr Problem am einfachsten beheben, indem Sie Ihre Abhängigkeiten aktualisieren:
compile 'com.google.guava:guava:17.0' compile 'com.google.guava:guava-gwt:17.0'
Dadurch wird sichergestellt, dass beide auf 17.0 sind. Es ist einfacher als zu versuchen, beide der älteren Version aufzuzwingen, und als zusätzlichen Bonus erhalten Sie eine neuere Version, die (wahrscheinlich) Fehlerbehebungen und neue Funktionen enthält.
Um fair zu sein, erwähnt @Klunk dies in seiner Antwort mit der Frage "Können Sie nicht einfach die 17.0-Version als Ihre Abhängigkeit verwenden?", Aber es ist nur nebenbei und leicht zu übersehen, daher hielt ich es für sinnvoll, als separate Antwort zu posten .
quelle