studio - Error de conflicto de dependencia en mi aplicación de Android que tiene pruebas de Android
problemas con gradle en android studio (5)
Estoy usando AndroidStudio y Gradle para construir mi aplicación de Android con pruebas en el directorio de origen ''androidTest''. Agregué una nueva dependencia y ahora recibo el siguiente problema cuando ejecuto Android Tests en AndroidStudio o mediante ''./gradlew connectedCheck''. ¿Cuál es la forma preferida de resolver esto?
''Advertencia: Conflicto con la dependencia'' org.somelibrary: library-core ''. Las versiones resueltas para aplicación de prueba y aplicación son diferentes.
A partir de Android Gradle Plugin 1.1.1, el error se muestra así: "Advertencia: Conflicto con la dependencia ''com.google.code.findbugs: jsr305''. Las versiones resueltas para la aplicación (1.3.9) y la aplicación de prueba (2.0.1) difieren "
Alternativamente, se puede excluir la dependencia conflictiva (por ejemplo, la biblioteca de anotaciones de soporte) atraída por la dependencia de la aplicación de prueba (por ejemplo, assertj-android), utilizando lo siguiente:
testCompile(''com.squareup.assertj:assertj-android:1.0.0'') { exclude group: ''com.android.support'', module: ''support-annotations'' }
Cuando compila y ejecuta pruebas de Android para su aplicación, el complemento Android Gradle crea dos APK (la aplicación y la prueba APK). Durante la ejecución de Gradle, se comparan las dependencias para la aplicación y compilaciones de prueba. Las dependencias que existen en ambos se eliminan de la compilación de prueba cuando los números de versión son los mismos. Cuando las mismas dependencias están en uso, pero difieren según el número de versión, deberá resolver manualmente el conflicto de dependencia y se presentará este error.
Para resolver el conflicto, primero necesita averiguar las dos versiones que están en conflicto. Si aún no está utilizando el complemento Gradle de Android v1.1.1 +, si actualiza a esa versión, el mensaje de error le dará los números de la versión conflictiva. Elija cuál necesita
* Al elegir entre los números de conflictos, puede ser importante tener en cuenta que a menos que haya reemplazado la estrategia de resolución de dependencia de failOnVersionConflict ( failOnVersionConflict ), los conflictos dentro de la aplicación y las compilaciones de prueba (por separado) se resolverán eligiendo la versión mayor .
Ahora debe decidir cómo resolver el conflicto. Si necesita forzar el uso de la versión inferior (1.2) de la biblioteca, deberá forzar que la dependencia se resuelva tanto para la aplicación como para las versiones de prueba a una versión específica de la biblioteca de esta manera:
// 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 necesita usar la versión 2.1 de la dependencia, puede usar también el fragmento anterior, pero nunca comenzará a usar una versión más nueva de la biblioteca, independientemente de si las actualizaciones de dependencia transitiva lo requieren. De forma alternativa, también puede agregar una nueva dependencia normal a la aplicación o las compilaciones de prueba (lo que sea que esté tratando de usar la versión 1.2 de la dependencia). Esto obligará a la aplicación o versión de prueba a depender de la estrategia de resolución de dependencia gradle (anteriormente mencionada) y, por lo tanto, utilizará la versión 2.1 de la biblioteca para esa compilación.
// Force the use of 2.1 because the app requires that version in libraryq transitively.
androidTestCompile ''org.somelibrary:library-core:2.1''
o
// Force the use of 2.1 because the Android Tests require that version in libraryz.
compile ''org.somelibrary:library-core:2.1''
En esta solución, el error podría resurgir, si dijera la versión 3.3, comenzó a usarse solo en una de las compilaciones de prueba o de aplicación, pero esto normalmente es correcto porque se le notificará otra incompatibilidad en el momento de la compilación y podrá tomar medidas .
Actualización: Algunas nuevas soluciones a esta pregunta ahora también listan excluyendo una dependencia transitiva particular de una dependencia declarada. Esta es una solución válida, pero pone más responsabilidad en los desarrolladores. De la misma manera que la sugerencia de resolución de dependencia forzada anterior codifica una versión en la compilación, la solución exclude-transitive-dependency anula específicamente los requisitos establecidos de una biblioteca. A veces, los desarrolladores de bibliotecas tienen errores o trabajan con errores en otras bibliotecas, por lo que cuando implemente estas soluciones correrá el riesgo de tener que buscar errores muy oscuros.
Gradle tiene un Mecanismo de Estrategia de Resolución .
Puede resolver este conflicto agregando las siguientes líneas al archivo build.gradle del nivel de la aplicación:
configurations.all {
resolutionStrategy {
force ''com.google.code.findbugs:jsr305:1.3.9'', ''com.google.code.findbugs:jsr305:2.0.1''
}
}
Si observas el (los) archivo (s) .iml (generado), puedes ver los números de la versión conflictiva con bastante facilidad. En mi caso:
<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" />
Volviendo a la versión 1.0.1 del plugin de gradle se resuelve el problema.
Tenía un problema similar. Primero: actualizo el plugin de gradle a 1.1.1 (en el gradle del proyecto):
classpath ''com.android.tools.build:gradle:1.1.1''
lo que me ayudó a darme cuenta de que el problema era que la aplicación se refería a:
com.android.support:support-annotations:21.0.3
mientras que la aplicación de prueba se refería a:
com.android.support:support-annotations:20.0.0
(debido a que especifica androidTestCompile ''com.squareup.assertj:assertj-android-appcompat-v7:1.0.0''
)
lo resolvió especificando:
androidTestCompile ''com.android.support:support-annotations:21.0.3''