Android Gradle DexException: несколько файлов dex определяют Lorg / hamcrest / Описание

Com.android.dex.DexException: несколько файлов dex определяют Lorg / hamcrest / Описание

При попытке выполнить отладочную сборку / тестирование либо через Android Studio, либо через Gradle в командной строке моего приложения.

hamcrest релиза (без тестов) работает нормально, но как только тестирование включено ( hamcrest является тестовой библиотекой), сборка завершается с ошибкой выше.

Я проверил свои зависимостей в модуле, и нет дублирующих требований, которые подтверждают зависимости gradle -q .


Настройки проекта.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 / Описание"

Robolectric 2.3 зависит от JUnit 4.8.1 (версия явно). Вы импортируете JUnit 4.10 (версия явно). Hamcrest, вероятно, просто первый из многих дубликатов, которые dex задыхается – попробуйте изменить свою версию требований JUnit на 4.8+ (или исключая JUnit из зависимости Robolectric).

Я решил ошибку, посмотрев в Android Studio для точного класса под названием «Описание». Он оказался в 3 баночках. Один из junit, один из прямой зависимости и один из mockito.

Введите описание изображения здесь

Оказывается, что junit вместо обычной зависимости включает классы Hamcrest в junit jar.

Введите описание изображения здесь

Чтобы решить эту проблему, используйте junit-dep вместо junit.

Поэтому измените

androidTestCompile ( 'JUnit: JUnit:. 4,8 +')

в

androidTestCompile ( 'JUnit: JUnit-отд:. 4,8 +')

Mockito имеет ту же проблему / решение: используйте mockito-core.1.9.5.jar вместо mockito-all.1.9.5.jar

Мой проект зависел от json-простой версии 1.1.1 , которая по какой-то причине имеет временную зависимость от junit версии 4.1.0, которая сама имеет зависимость от Hamcrest . Я мог видеть это, если бы gradle dependencies или, наоборот, проверяя json-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 

Исключение артефакта junit от json-simple позволило мне построить.

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

Исключить модуль: junit

Если вы используете json:simple зависимость