Reputation:
My build.gradle:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.stanfy.spoon:spoon-gradle-plugin:0.10.0'
}
}
apply plugin: 'android-sdk-manager'
apply plugin: 'android'
apply plugin: 'spoon'
apply plugin: 'robolectric'
android {
compileSdkVersion 19
buildToolsVersion '20.0.0'
defaultConfig {
minSdkVersion 14
targetSdkVersion 19
testInstrumentationRunner 'com.google.android.apps.common.testing.testrunner.GoogleInstrumentationTestRunner'
}
buildTypes {
debug {
}
release {
}
}
productFlavors {
first {
//just version codes and packages
}
second {
//just version codes and packages
}
third {
//just version codes and packages
}
}
}
spoon {
debug = true
}
dependencies {
compile project(':app:libs:facebookSDK')
compile 'com.google.android.gms:play-services:5.0.89'
compile 'com.android.support:support-v4:20.0.0+'
compile 'com.google.code.gson:gson:2.2.4'
compile fileTree(dir: 'libs', include: '*.jar')
androidTestCompile fileTree(dir: 'libsTest', include: '*.jar')
androidTestCompile 'com.squareup.spoon:spoon-client:1.1.0'
androidTestCompile 'junit:junit:4.+'
androidTestCompile 'org.robolectric:robolectric:2.3'
}
libsTest: espresso-contrib-1.1-bundled.jar
Now, my error is following:
Error Code:
2
Output:
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lorg/hamcrest/SelfDescribing;
at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
at com.android.dx.command.dexer.Main.run(Main.java:230)
at com.android.dx.command.dexer.Main.main(Main.java:199)
at com.android.dx.command.Main.main(Main.java:103)
More detailed log available here:
How do I fix this issue?
UPD:My question now is basically how do I hunt those duplicated parts?
Upvotes: 2
Views: 1227
Reputation: 1
One trick to hunt those errors is using Android Studio "Navigate > Class..." option.
Given you have this error:
Lorg/hamcrest/SelfDescribing;
then you can search "org.hamcrest.SelfDescribing" so you can have an idea of the .jars using it.
Upvotes: 0
Reputation: 3689
My question now is basically how do I hunt those duplicated parts?
You do this using the log. The log you pasted says:
com.android.dex.DexException: Multiple dex files define
This is most probably due to the conflicting libraries. The log continues with:
Lorg/hamcrest/SelfDescribing;
Here is the conflicting library, hamcrest.
After adding dependencies to your project, if there are common sub-libraries used by your libraries (or as your libraries), this error occurs. So it seems like hamcrest is being used by not only one of your libraries.
We'll learn about this conflict by inspecting dependencies. Of course an efficient inspection needs to be both intuitive and rational at the same time.
Let's start with hamcrest itself. (I'll assume you haven't heard of hamcrest before.)
Let's take a look at Hamcrest project page. Hamcrest defines itself as library of matchers for building test expressions. And the definition says Typical scenarios include testing frameworks, mocking libraries... This is illuminating because you have some dependencies about testing like JUnit, Espresso and Robolectric.
Now we should continue with JUnit dependencies. Seems like JUnit makes use of hamcrest-core. Here is our first hamcrest as a sub-dependency.
Let's continue with Espresso, as you have espresso-contrib-1.1-bundled.jar
in libsTest
folder.
When we check out espresso-contrib project dependencies, we can see that Espresso makes use of hamcrest heavily.
We probably get the conflicting library in your project, the last step is excluding hamcrest-core
from one of our dependencies while adding this dependency. You can achieve this with:
androidTestCompile('junit:junit:4.+') {
exclude module: 'hamcrest-core'
}
Upvotes: 1
Reputation: 5151
Inspired from the deckard-gradle sample project, I suggest trying something like this:
androidTestCompile 'org.hamcrest:hamcrest-integration:1.1'
androidTestCompile 'org.hamcrest:hamcrest-core:1.1'
androidTestCompile 'org.hamcrest:hamcrest-library:1.1'
androidTestCompile('junit:junit:4.11') {
exclude module: 'hamcrest-core'
}
androidTestCompile('org.robolectric:robolectric:2.3') {
exclude module: 'classworlds'
exclude module: 'commons-logging'
exclude module: 'httpclient'
exclude module: 'maven-artifact'
exclude module: 'maven-artifact-manager'
exclude module: 'maven-error-diagnostics'
exclude module: 'maven-model'
exclude module: 'maven-project'
exclude module: 'maven-settings'
exclude module: 'plexus-container-default'
exclude module: 'plexus-interpolation'
exclude module: 'plexus-utils'
exclude module: 'wagon-file'
exclude module: 'wagon-http-lightweight'
exclude module: 'wagon-provider-api'
}
Upvotes: 0
Reputation: 139
I had a similar issue a while ago and if I remember correctly, I fixed it by adding an exclude statement as follows:
androidTestCompile('junit:junit:4.+') {
exclude module: 'hamcrest-core'
}
Upvotes: 0