我的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
现在,我的错误如下:
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)
此处提供更详细的日志:
如何解决此问题?
UPD :我现在的问题基本上是如何捕获这些重复的部分?
答案 0 :(得分:1)
我现在的问题基本上是如何捕获那些重复的部分?
您可以使用日志执行此操作。你粘贴的日志说:
com.android.dex.DexException:多个dex文件定义
这很可能是由于冲突的库造成的。日志继续:
Lorg / hamcrest /自描述;
这是冲突的库, hamcrest 。
在向项目添加依赖项之后,如果库(或库)使用了公共子库,则会发生此错误。所以似乎 hamcrest 不仅被你的一个库使用了。
我们通过检查依赖关系来了解这种冲突。当然,有效的检查需要同时具有直观性和合理性。
让我们从 hamcrest 本身开始。 (我假设你以前没有听说过hamcrest。)
让我们来看看Hamcrest project page。 Hamcrest将自己定义为用于构建测试表达式的匹配器库。定义说典型场景包括测试框架,模拟库 ......这很有启发性,因为你对JUnit,Espresso和Robolectric等测试有一些依赖性。
现在我们应该继续使用JUnit dependencies。似乎JUnit使用 hamcrest-core 。 Here是我们的第一个作为子依赖的锤子。
让我们继续使用Espresso,因为espresso-contrib-1.1-bundled.jar
文件夹中有libsTest
。
当我们查看espresso-contrib项目dependencies时,我们可以看到Espresso大量使用hamcrest。
我们可能会在您的项目中获得冲突的库,最后一步是在添加此依赖项时从我们的某个依赖项中排除hamcrest-core
。您可以通过以下方式实现此目的:
androidTestCompile('junit:junit:4.+') {
exclude module: 'hamcrest-core'
}
答案 1 :(得分:0)
我前一段时间遇到过类似的问题,如果我没记错的话,我通过添加一条排除声明修复了它,如下所示:
androidTestCompile('junit:junit:4.+') {
exclude module: 'hamcrest-core'
}
答案 2 :(得分:0)
受到deckard-gradle sample project的启发,我建议尝试这样的事情:
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'
}
答案 3 :(得分:0)
捕获这些错误的一个技巧是使用Android Studio"导航>类..."选项。
鉴于您有此错误:
Lorg/hamcrest/SelfDescribing;
然后你可以搜索" org.hamcrest.SelfDescribing"所以你可以了解使用它的.jars。