com.android.dex.DexException: Múltiples archivos dex definen Lorg / hamcrest / Descripción
que ocurre al intentar hacer una comstackción / prueba de depuración, ya sea a través de Android Studio o a través de la línea de comandos de Gradle en mi aplicación.
La versión de lanzamiento (sin pruebas) funciona bien, pero tan pronto como se incluyen las pruebas ( hamcrest
es una biblioteca de prueba), la construcción falla con el error anterior.
Revisé las dependencias de mi módulo y no hay requisitos duplicados que las dependencias gradle -q corroboren.
Proyecto settings.gradle
include ':[library module]' include ':[main module]'
Proyecto build.gradle
buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.9.+' classpath 'org.robolectric.gradle:gradle-android-test-plugin:0.9.+' } } allprojects { repositories { mavenCentral() } }
[módulo de biblioteca] build.gradle
apply plugin: 'android-library' android { compileSdkVersion 19 buildToolsVersion "19.0.0" defaultConfig { minSdkVersion 14 targetSdkVersion 19 } packagingOptions { exclude 'META-INF/LICENSE.txt' exclude 'META-INF/NOTICE.txt' } } dependencies { compile 'com.google.zxing:core:3.0.+' compile 'com.bugsnag:bugsnag-android:2.1.1+' }
[módulo principal] build.gradle
apply plugin: 'android' android { signingConfigs { release { [...] } } sourceSets { main { manifest.srcFile 'src/main/AndroidManifest.xml' res.srcDirs = ['src/main/res'] } androidTest { setRoot('src/test') } instrumentTest { } } compileSdkVersion 19 buildToolsVersion '19.0.0' defaultConfig { minSdkVersion 14 targetSdkVersion 19 testPackageName "[main.packageName].tests" } buildTypes { release { runProguard false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' } } packagingOptions { exclude 'META-INF/LICENSE.txt' exclude 'META-INF/NOTICE.txt' } } apply plugin: 'android-test' androidTest { // configure the set of classes for JUnit tests include '**/*Test.class' // configure max heap size of the test JVM maxHeapSize = "2048m" } repositories { maven { url 'https://repo.commonsware.com.s3.amazonaws.com' } maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } } dependencies { androidTestCompile 'junit:junit:4.10' androidTestCompile 'org.robolectric:robolectric:2.3-SNAPSHOT' androidTestCompile 'com.squareup:fest-android:1.0.+' compile project(':[library module]') compile 'com.github.gabrielemariotti.changeloglib:library:1.4.+' compile 'com.google.code.gson:gson:2.2.4' compile 'com.google.android.gms:play-services:+' compile 'com.android.support:appcompat-v7:+' compile ('de.keyboardsurfer.android.widget:crouton:1.8.+') { exclude group: 'com.google.android', module: 'support-v4' } compile files('libs/CWAC-LoaderEx.jar') compile 'com.squareup.okhttp:okhttp:1.5.+' compile 'com.octo.android.robospice:robospice:1.4.11' compile 'com.octo.android.robospice:robospice-cache:1.4.11' compile 'com.octo.android.robospice:robospice-retrofit:1.4.11' compile 'com.commonsware.cwac:security:0.1.+' compile 'com.readystatesoftware.sqliteasset:sqliteassethelper:+' }
Robolectric 2.3 depende de JUnit 4.8.1 (versión explícita). Está importando JUnit 4.10 (versión explícita). Es probable que Hamcrest sea simplemente el primero de muchos duplicados que dex se está ahogando: intente cambiar su versión de requisito de JUnit a 4.8+ (o excluyendo a JUnit de la dependencia de Robolectric).
Resolví el error buscando en Android Studio la clase exacta llamada ‘Descripción’. Resultó estar presente en 3 jarras. Uno de junit, uno de una dependencia directa y el otro de mockito.
Resulta que junit, en lugar de una dependencia normal, incluye las clases de Hamcrest en junit jar.
Para poder resolver el problema, incluya junit-dep en lugar de junit.
así que cambia
androidTestCompile (‘junit: junit: 4.8. +’)
a
androidTestCompile (‘junit: junit-dep: 4.8. +’)
Mockito tiene el mismo problema / solución: use mockito-core.1.9.5.jar en lugar de mockito-all.1.9.5.jar
Mi proyecto dependía de la versión 1.1.1 de json-simple , que por alguna razón tiene una dependencia en tiempo de ejecución en la versión 4.1.0 de junit, que a su vez depende de Hamcrest . Podría ver esto si gradle dependencies
o, alternativamente, inspeccionando el joma-simple POM.xml .
// compile - Classpath for compiling the main sources. \--- com.googlecode.json-simple:json-simple:1.1.1 \--- junit:junit:4.10 \--- org.hamcrest:hamcrest-core:1.1
Excluir el artefacto junit de json-simple me permitió construir.
dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile ('com.googlecode.json-simple:json-simple:1.1.1') { exclude module: 'junit' } }
excluir módulo: junit
si está usando json:simple
dependencia json:simple