J'utilise AndroidStudio et Gradle pour créer mon Android avec des tests dans le répertoire source 'androidTest'. J'ai ajouté une nouvelle dépendance et je reçois maintenant le problème suivant lors de l'exécution de Android Tests soit dans AndroidStudio, soit via './gradlew connectedCheck'. Quelle est la meilleure façon de résoudre ce problème?
'Avertissement: conflit avec la dépendance' org.somelibrary: library-core '. Les versions résolues pour l'application et l'application de test diffèrent. '
Depuis Android Gradle Plugin 1.1.1, l'erreur s'affiche comme ceci: "Avertissement: conflit avec la dépendance 'com.google.code.findbugs: jsr305'. Versions résolues pour l'application (1.3.9) et l'application de test (2.0.1) diffèrent. "
Lorsque vous créez et exécutez Android Tests pour votre application, le Android plugin Gradle crée deux APK (l'application et l'APK de test). Au cours de l'exécution de Gradle, les dépendances pour l'application et les versions de test sont comparées. Les dépendances qui existent dans les deux sont supprimées de la version de test lorsque les numéros de version sont identiques. Lorsque les mêmes dépendances sont utilisées, mais diffèrent par le numéro de version, vous devrez résoudre manuellement la dépendance conflit et cette erreur est présentée.
Pour résoudre le conflit, vous devez d'abord déterminer les deux versions qui sont en conflit. Si vous n'utilisez pas déjà le Android Gradle Plugin v1.1.1 +, alors si vous mettez à niveau vers cette version, le message d'erreur vous donnera les numéros de version en conflit. Choisissez celui dont vous avez besoin.
* Lorsque vous choisissez entre les numéros de conflit, il peut être important de garder à l'esprit qu'à moins que vous n'ayez remplacé la stratégie de résolution de dépendance par défaut Gradle ( failOnVersionConflict ), les conflits internes à l'application et les versions de test (séparément) seront être résolu en choisissant la version supérieure.
Vous devez maintenant décider comment résoudre le conflit. Si vous devez forcer l'utilisation de la version inférieure (1.2) de la bibliothèque, vous devrez forcer la dépendance à résoudre pour les builds d'application et de test vers une version spécifique de la bibliothèque comme ceci:
// Needed to resolve app vs test dependencies, specifically, transitive dependencies of
// libraryq and libraryz. Forcing the use of the smaller version after regression testing.
configurations.all {
resolutionStrategy.force 'org.somelibrary:library-core:1.2'
}
Si vous devez utiliser la version 2.1 de la dépendance, vous pouvez également utiliser l'extrait ci-dessus, mais vous ne commencerez jamais à utiliser une version plus récente de la bibliothèque, que les mises à jour des dépendances transitives l'exigent ou non. Alternativement, vous pouvez également ajouter une nouvelle dépendance normale à l'application ou aux versions de test (selon la tentative d'utilisation de la version 1.2 de la dépendance). Cela forcera l'application ou la version de test à dépendre de la stratégie de résolution de dépendance de gradle (mentionnée précédemment) et donc à utiliser la version 2.1 de la bibliothèque pour cette version.
// Force the use of 2.1 because the app requires that version in libraryq transitively.
androidTestCompile 'org.somelibrary:library-core:2.1'
ou
// Force the use of 2.1 because the Android Tests require that version in libraryz.
compile 'org.somelibrary:library-core:2.1'
Dans cette solution, l'erreur pourrait refaire surface, si par exemple la version 3.3, commençait à être utilisée dans une seule des versions de test ou d'application, mais cela est généralement OK car vous serez averti d'une autre incompatibilité au moment de la génération et pourrez prendre des mesures .
Mise à jour: quelques nouvelles solutions à cette question répertorient désormais également l'exclusion d'une dépendance transitive particulière d'une dépendance déclarée. Il s'agit d'une solution valable, mais qui impose plus de fardeau aux développeurs. De la même manière que la suggestion de résolution de dépendance forcée ci-dessus code dur une version dans la build, la solution exclude-transitive-dependency remplace spécifiquement les exigences déclarées d'une bibliothèque. Parfois, les développeurs de bibliothèques ont des bogues ou contournent des bogues dans diverses autres bibliothèques, donc lorsque vous implémentez ces solutions, vous risquez d'avoir à chasser des bogues très obscurs.
Eu un problème similaire. Tout d'abord - je mets à niveau le plugin gradle vers 1.1.1 (dans le gradle du projet):
classpath 'com.Android.tools.build:gradle:1.1.1'
ce qui m'a aidé à réaliser que le problème était l'application faisant référence à:
com.Android.support:support-annotations:21.0.3
alors que l'application de test faisait référence à:
com.Android.support:support-annotations:20.0.0
(en raison de la spécification de androidTestCompile 'com.squareup.assertj:assertj-Android-appcompat-v7:1.0.0'
)
l'a résolu en spécifiant:
androidTestCompile 'com.Android.support:support-annotations:21.0.3'
Alternativement, on peut exclure la dépendance conflictuelle (par exemple la bibliothèque d'annotations de support) tirée par la dépendance de l'application de test (par exemple assertj-Android), en utilisant ce qui suit:
testCompile('com.squareup.assertj:assertj-Android:1.0.0') { exclude group: 'com.Android.support', module: 'support-annotations' }
Gradle a mécanisme de stratégie de résolution .
Vous pouvez résoudre ce conflit en ajoutant des lignes ci-dessous au fichier build.gradle au niveau de l'application:
configurations.all {
resolutionStrategy {
force 'com.google.code.findbugs:jsr305:1.3.9', 'com.google.code.findbugs:jsr305:2.0.1'
}
}
Si vous regardez le (s) fichier (s) (généré (s)), vous pouvez voir les numéros de version en conflit assez facilement. Dans mon cas:
<orderEntry type="library" exported="" scope="TEST" name="support-annotations-20.0.0" level="project" />
<orderEntry type="library" exported="" name="support-annotations-21.0.3" level="project" />
Revenir à la version 1.0.1 du plugin gradle résout le problème.