J'utilise les deux dépendances suivantes:
compile 'com.google.guava:guava:14.0.1'
compile 'com.google.guava:guava-gwt:14.0.1'
Les deux doivent être la même version pour fonctionner correctement. Comme mes autres dépendances utilisent une version supérieure, Gradle utilise des versions différentes pour chaque dépendance.
J'ai trouvé cela en exécutant 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
Comment puis-je forcer Gradle à définir la même version pour ces deux dépendances?
Une de vos dépendances force la mise à jour de la version de goyave. Utilisation gradle dependencies
pour localiser la bibliothèque qui expulse votre version.
Le problème que vous avez est que si vous le forcez à utiliser 14.0.1, une autre bibliothèque risque de ne pas fonctionner correctement. Ne pouvez-vous pas simplement utiliser la version 17.0 comme dépendance?
Plutôt que de conserver des numéros de version individuels dans le fichier build.gradle, j'utilise un fichier dependencies.gradle qui permet de mapper les numéros de version et de les extraire dans le fichier build.gradle. De cette façon, je n'ai besoin que de maintenir la version unique de goyave. Donc, votre exemple sera:
dependencies.gradle
ext {
ver = [
guava: '14.0.1'
]
}
puis dans le fichier build.gradle, vous pouvez avoir:
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
}
puis, lorsque je souhaite passer à 17.0, il ne me reste plus qu'à changer le fichier dependencies.gradle.
Je suis également un partisan inconditionnel de la définition de dépendances transitives à false avec
configurations.compile { transitive = false }
ainsi, certaines dépendances ne sont pas expulsées au moment de la compilation, bien que vous puissiez avoir un problème au moment de l'exécution si la bibliothèque qui expulse n'est pas totalement compatible avec les versions antérieures. Voyons les choses en face si vous écrivez le code, vous devriez savoir quelles bibliothèques vous utilisez et vous devriez être explicite à propos de vos dépendances. Il vous protège de l’une de vos dépendances lors de la mise à niveau et de la gâche.
Ajouter cette section au fichier dependencies.gradle
configurations.all {
resolutionStrategy {
force 'com.google.guava:guava:14.0.1'
force 'com.google.guava:guava-gwt:14.0.1'
}
}
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'
}
J'ai eu une situation similaire où l'une des dépendances a utilisé spring-web 4.2.4 qui était cassé. Vous devez forcer la version de la bibliothèque spécifique que vous voulez. Comme mentionné dans un autre commentaire, cela peut causer des problèmes de compatibilité mais est parfois nécessaire.
Le moyen le moins intrusif de forcer une version de la bibliothèque que j'ai trouvée était au lieu d'utiliser
compile "org.springframework:spring-web:4.2.3.RELEASE"
spécifiant la configuration de dépendance comme forcée:
compile("org.springframework:spring-web:4.2.3.RELEASE"){
force = true
}
Je l'ai utilisé lorsque j'avais besoin de rétrograder temporairement la version de Spring (jusqu'à la prochaine version).
Sinon, vous pouvez utiliser dependencySets (ou mavenBom lorsque le nom du produit est disponible) support dans source-dépendance-gestion Gradle plugin. Notez que ce plugin est aussi automatiquement appliqué avec spring-boot Gradle plugin. Pour plus de détails, voir 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'
}
Si vous pouvez simplement utiliser la version la plus récente pour les deux dépendances, le moyen le plus simple de résoudre votre problème consiste à mettre à jour vos dépendances:
compile 'com.google.guava:guava:17.0'
compile 'com.google.guava:guava-gwt:17.0'
Cela garantira que les deux sont sur 17.0. C'est plus simple que d'essayer de forcer les deux sur l'ancienne version et, en prime, vous obtenez une version plus récente, qui vient (probablement) avec des corrections de bugs et de nouvelles fonctionnalités.
Pour être honnête, @Klunk le mentionne dans sa réponse, en demandant "Ne pouvez-vous pas simplement utiliser la version 17.0 comme dépendance?" .
Je suggère de ne pas mettre transitive = false
, à partir de ce moment, vous devrez résoudre vous-même l’arbre de dépendance manuellement.
Vous pouvez soit forcer la version de goyave souhaitée via configurations.all
, ou ajouter explicitement la dépendance et la définir forced = true
.
Exemples ici: http://www.devsbedevin.com/Android-understanding-gradle-dependencies-and-resolving-conflicts/
Une autre option consiste à utiliser la contrainte de dépendance: 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'
}
}
}