Android Gradle DexException: Múltiples archivos dex definen Lorg / hamcrest / Descripción

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.

enter image description here

Resulta que junit, en lugar de una dependencia normal, incluye las clases de Hamcrest en junit jar.

enter image description here

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