Java Android测试生成错误:多个dex文件定义Landroid/support/test/BuildConfig
我正在尝试将Espresso 2添加到我的项目中(该项目还具有许多其他依赖项),但在尝试运行测试时遇到了以下错误:Java Android测试生成错误:多个dex文件定义Landroid/support/test/BuildConfig,java,android,android-gradle-plugin,build.gradle,android-espresso,Java,Android,Android Gradle Plugin,Build.gradle,Android Espresso,我正在尝试将Espresso 2添加到我的项目中(该项目还具有许多其他依赖项),但在尝试运行测试时遇到了以下错误: UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexException: Multiple dex files define Landroid/support/test/BuildConfig; at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.jav
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Landroid/support/test/BuildConfig;
at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596)
at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)
at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535)
...
非测试构建工作正常
有人对调试这个的最佳方法有什么建议吗?
我试过运行/gradlew-q::dependencies
,但我看不到任何明显的问题(尽管我对解释其输出不太了解):
更新:当我从com.android.tools.build:gradle:1.0.0
更新到com.android.tools.build:gradle:1.1
时,我收到以下警告:
Warning:Conflict with dependency 'com.android.support:support-annotations'. Resolved versions for app (22.1.0) and test app (22.0.0) differ.
尝试从浓缩咖啡中排除以下内容(一次一个):
可能需要对runner执行相同的操作,我在尝试设置浓缩咖啡时也遇到了此错误。试用
espresso contrib:2.1
,而非2.0
更新(2015年7月9日):
如果使用以下排除项,则可以继续使用22.2.1:
androidTestCompile ('com.android.support.test.espresso:espresso-core:2.2') {
exclude group: 'com.android.support', module: 'support-annotations'
}
androidTestCompile ('com.android.support.test:runner:0.3') {
exclude group: 'com.android.support', module: 'support-annotations'
}
androidTestCompile ('com.android.support.test:rules:0.3') {
exclude group: 'com.android.support', module: 'support-annotations'
}
如果您依赖于意式浓缩咖啡
,则还需要排除
更新(8/03/2015):
在支持库22.2.1中,依赖关系再次被打破;在发布新的runner之前,请不要升级到22.2.1
更新(6/04/2015):
在最新版本的runner 0.3和rules 0.3中,不再需要这个答案。你可以简单地使用
androidTestCompile 'com.android.support.test:runner:0.3'
androidTestCompile 'com.android.support.test:rules:0.3'
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2'
使用最新的支持库。(22.2.0
撰写本文时)
更新(5/30/2015):
…这一个也将如此(没有'com.android.support.test:runner:0.2'
):
原始答复:
与此相反,您应该删除此依赖项:
androidTestCompile'com.android.support.test:runner:0.2'
因为它是库版本冲突的原因
您还应该更新到Android gradle插件1.1.1,因为该版本将告诉您确切的版本冲突,这在本例中非常有用。另一个有用的提示是如何强制将依赖项解析为特定版本 这里有一个方法:
configurations.all {
resolutionStrategy.force 'com.android.support:support-annotations:22.0.0'
}
…还有一个:
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
if (details.requested.group == 'com.android.support') {
details.useVersion '22.0.0'
}
}
}
在com.android.support.test.espresso:espresso-core:2.1
中使用这两个选项中的任何一个都可以
有关详细信息,请参阅中的强制一组库的一致版本部分。我的解决方案:
compile 'com.android.support:appcompat-v7:22.1.0'
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.1'
androidTestCompile 'com.android.support:support-annotations:22.1.0'
androidTestCompile 'com.android.support.test:runner:0.2'
+
我最近在启用增量gradle构建后遇到了这个错误
dexOptions {
javaMaxHeapSize "2g"
incremental true
}
这可以通过禁用预先退出库来解决
dexOptions {
javaMaxHeapSize "2g"
incremental true
preDexLibraries = false
}
根据,您还可以使用解决方案策略
:
allprojects {
repositories {
mavenCentral()
maven {
url 'http://download.crashlytics.com/maven'
}
}
configurations.all {
resolutionStrategy.force 'com.android.support:support-annotations:22.2.0'
}
}
这是一个适合我的解决方案,允许我使用最新版本的appcompat-v7和appcompat-v4。发布您的
build.gradle。
还记得错误之前添加的最后一个依赖项吗?你有这么多。我们也不知道什么是编译文件树(dir:'libs',包括:'*.jar')
,编译项目(':CookbriteJava')
和编译项目(':camera')
。我认为Gradle依赖项任务的输出显示了你需要的一切?我也会用build.gradle更新这个问题。我最近在Espresso列表中添加了最后两个,为了克服一个非常类似的错误,我不得不更新我的支持库和Google Play Services依赖项,并删除AssertJ。espresso contrib:2.1包含对android支持库22.0.0的引用,在本例中,它与22.1.1冲突。不完全是,Gradle通常很聪明,可以使用新版本。为什么espresso core
vsespresso contrib
?@IgorGanapolsky espresso contrib 2.1用于包含test runner 0.2 jar文件,该文件与支持库22.1也存在兼容性问题。关于何时应该使用espresso contrib的更一般性讨论,请检查您是否需要使用removingcom.android.support.test:testing support lib:0.1
dependency解决了我的问题中列出的任何类。谢谢有什么消息吗compile'com.android.support:support annotations:22.2.1'
也被破坏了:-/I在使用espresso contrib:2.0
时仍然会遇到这种情况。如何修复此问题?使用preDexLibraries=false
的缺点是什么?这对我来说是可行的,但是我会遇到性能问题吗?
configurations.all {
resolutionStrategy.force 'com.android.support:support-annotations:22.0.0'
}
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
if (details.requested.group == 'com.android.support') {
details.useVersion '22.0.0'
}
}
}
compile 'com.android.support:appcompat-v7:22.1.0'
androidTestCompile 'com.android.support.test.espresso:espresso-core:2.1'
androidTestCompile 'com.android.support:support-annotations:22.1.0'
androidTestCompile 'com.android.support.test:runner:0.2'
android {
packagingOptions {
exclude 'LICENSE.txt'
}
}
dexOptions {
javaMaxHeapSize "2g"
incremental true
}
dexOptions {
javaMaxHeapSize "2g"
incremental true
preDexLibraries = false
}
allprojects {
repositories {
mavenCentral()
maven {
url 'http://download.crashlytics.com/maven'
}
}
configurations.all {
resolutionStrategy.force 'com.android.support:support-annotations:22.2.0'
}
}