Android Gradle DexException:多个dex文件定义Lorg / hamcrest / Description

com.android.dex.DexException:多个dex文件定义Lorg / hamcrest / Description

在尝试通过Android Studio或通过应用程序上的Gradle命令行进行debugging构build/testing时发生。

发布版本(没有testing)工作正常,但只要包含testing( hamcrest是一个testing库),构build失败,出现上述错误。

我检查了我的模块依赖关系,并没有重复的要求,哪些gradle -q依赖关系 corroborates。


项目settings.gradle

 include ':[library module]' include ':[main module]' 

项目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() } } 

[库模块] 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+' } 

[主模块] 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:+' } 

Solutions Collecting From Web of "Android Gradle DexException:多个dex文件定义Lorg / hamcrest / Description"

Robolectric 2.3依赖于JUnit 4.8.1(版本明确)。 您正在导入JUnit 4.10(版本显式)。 Hamcrest可能仅仅是dex扼杀的许多重复项中的第一个 – 尝试将您的JUnit需求版本更改为4.8+(或者将Robolectric依赖项中的JUnit排除在外)。

我通过在Android Studio中查找名为“Description”的确切类来解决错误。 原来是在3jar。 一个来自junit,一个来自直接依赖,另一个来自mockito。

在这里输入图像说明

事实certificate,junit,而不是一个正常的依赖,包括Hamitrest类在junitjar。

在这里输入图像说明

为了能够解决这个问题,包括junit-dep而不是junit。

所以改变

androidTestCompile( '的junit:4.8 +:junit的。')

androidTestCompile( '的junit:4.8 +:的junit-DEP。')

Mockito有相同的问题/解决scheme:使用mockito-core.1.9.5.jar而不是mockito-all.1.9.5.jar

我的项目依赖于json-simple版本1.1.1 ,由于某些原因,junit版本4.1.0具有运行时依赖性,它本身依赖于Hamcrest 。 如果我运行了gradle dependencies或者通过检查json简单的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 

json-simple中排除junit神器允许我构build。

 dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile ('com.googlecode.json-simple:json-simple:1.1.1') { exclude module: 'junit' } } 

排除模块: junit

如果你正在使用json:simple依赖