que - Android Gradle DexException: Múltiples archivos dex definen Lorg/hamcrest/Descripción
smali que es (4)
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''
}
}
com.android.dex.DexException: Múltiples archivos dex definen Lorg / hamcrest / Descripción
que ocurre al intentar hacer una compilació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:+''
}
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
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).
excluir módulo: junit
si está usando json:simple
dependencia json:simple