【问题标题】:Android Studio Multiple dex files gradle errorAndroid Studio 多个 dex 文件 gradle 错误
【发布时间】:2014-11-17 00:43:00
【问题描述】:

当我在 Android Studio 中为 Android 应用程序运行->应用程序时出现此错误

UNEXPECTED TOP-LEVEL EXCEPTION:
    com.android.dex.DexException: Multiple dex files define Lcom/google/common/annotations/Beta;
...

这是 gradlew -q :app:dependencies 的输出

+--- project :shared
+--- com.google.api-client:google-api-client:1.19.0
|    +--- com.google.oauth-client:google-oauth-client:1.19.0
|    |    +--- com.google.http-client:google-http-client:1.19.0
|    |    |    +--- com.google.code.findbugs:jsr305:1.3.9
|    |    |    \--- org.apache.httpcomponents:httpclient:4.0.1
|    |    |         +--- org.apache.httpcomponents:httpcore:4.0.1
|    |    |         +--- commons-logging:commons-logging:1.1.1
|    |    |         \--- commons-codec:commons-codec:1.3
|    |    \--- com.google.code.findbugs:jsr305:1.3.9
|    +--- com.google.http-client:google-http-client-jackson2:1.19.0
|    |    +--- com.google.http-client:google-http-client:1.19.0 (*)
|    |    \--- com.fasterxml.jackson.core:jackson-core:2.1.3
|    \--- com.google.guava:guava-jdk5:13.0
+--- com.google.http-client:google-http-client-gson:1.19.0
|    \--- com.google.code.gson:gson:2.1
+--- com.google.api-client:google-api-client-android:1.19.0
|    +--- com.google.api-client:google-api-client:1.19.0 (*)
|    \--- com.google.http-client:google-http-client-android:1.19.0
|         \--- com.google.http-client:google-http-client:1.19.0 (*)
+--- com.google.http-client:google-http-client-android:1.19.0 (*)
+--- com.google.guava:guava:14.0.+ -> 14.0.1
+--- project :backend-appengine
|    \--- com.google.api-client:google-api-client-android:1.19.0 (*)
+--- com.android.support:appcompat-v7:20.0.0
|    \--- com.android.support:support-v4:20.0.0
|         \--- com.android.support:support-annotations:20.0.0
+--- com.google.android.gms:play-services:5.0.89
\--- com.google.maps.android:android-maps-utils:0.3.+ -> 0.3.1

这是来自 build.gradle 的依赖块

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':shared')
    // Add the Google API client library.
    compile(group: 'com.google.api-client', name: 'google-api-client', version: '1.19.0') {
        // Exclude artifacts that the Android SDK/Runtime provides.
        exclude(group: 'com.google.guava')     //-- !!! this does not seem to work !!!
        exclude(group: 'xpp3', module: 'xpp3')
        exclude(group: 'org.apache.httpcomponents', module: 'httpclient')
        exclude(group: 'junit', module: 'junit')
        exclude(group: 'com.google.android', module: 'android')
        exclude(group: 'com.google.http-client', module: 'google-http-client')
    }

    compile('com.google.http-client:google-http-client-gson:1.19.0') {
        exclude module: 'httpclient'
        exclude(group: 'com.google.http-client', module: 'google-http-client')
    }

    compile(group: 'com.google.api-client', name: 'google-api-client-android', version: '1.19.0') {
        exclude(group: 'com.google.android.gms', module: 'play-services')
        exclude group: 'com.google.guava', module: 'guava-jdk5'
    }

   compile(group: 'com.google.http-client', name: 'google-http-client-android', version: '1.19.0') {
        exclude(group: 'com.google.android', module: 'android')
    }

    // This is used by the Google HTTP client library.
    compile(group: 'com.google.guava', name: 'guava', version: '14.0.+')

    //-- endpoints
    dependencies {
        compile project(path: ':backend-appengine', configuration: 'android-endpoints')
    }

    compile 'com.android.support:appcompat-v7:20.0.0'
    compile ('com.google.android.gms:play-services:5.0.89') {
        exclude(group: 'com.android.support', module: 'support-v4')
    }
    compile ('com.google.maps.android:android-maps-utils:0.3.+') {
        exclude(group: 'com.google.android.gms', module: 'play-services')
    }   
}

【问题讨论】:

    标签: android android-studio android-gradle-plugin build.gradle


    【解决方案1】:

    对于在 Android 应用中使用 Google Cloud Endpoints 的用户:

    compile(project(path: ':backend', configuration: 'android-endpoints')) {
        exclude(module: 'guava-jdk5')
    }
    

    backend 是您的 AppEngine 应用模块的名称。

    在所有其他情况下,只需查找 guava-jdk5 传递依赖并排除它。

    【讨论】:

    • 非常感谢,我找这个很久了。
    • 这救了我。谢谢
    【解决方案2】:

    com.google.common.annotations 包似乎是 Guava 的一部分。我在依赖项中看到了两次略有不同的变化:一次作为 Google API 客户端的一部分,一次作为您自己的依赖项:

    +--- com.google.api-client:google-api-client:1.19.0
    |    \--- com.google.guava:guava-jdk5:13.0
    

    +--- com.google.guava:guava:14.0.+ -> 14.0.1
    

    所以这个错误的原因是你在多个 dex 文件(在 Guava 库的不同变体中)中定义了相同的类,这些类被你的其他依赖项包含。您需要找到一种方法来排除这些重复的依赖项,或者可能只是确保您在所有依赖项中使用相同的版本。

    您可以尝试的一件事是从依赖项之一中排除 guava 模块。因此,在您定义了 API 客户端模块的地方,为 guava 模块添加排除规则:

    compile ('com.google.api-client:google-api-client:1.19.0') {
        exclude group: 'com.google.guava', module: 'guava-jdk5'
    }
    

    我不能保证这不会导致 Google API 客户端库出现问题(因为它们是 Guava 的两个不同版本),但值得一试。

    编辑:从你的依赖,尝试改变这个:

    compile(group: 'com.google.api-client', name: 'google-api-client', version: '1.19.0') {
        // Exclude artifacts that the Android SDK/Runtime provides.
        exclude(group: 'com.google.guava')     //-- !!! this does not seem to work !!!
    

    到:

    compile(group: 'com.google.api-client', name: 'google-api-client', version: '1.19.0') {
        exclude(group: 'com.google.guava', module: 'guava-jdk5')
    

    google-api-client-android 库实际上并不包含 Guava —— 我没有意识到您在其中有两个名称相似的依赖项。

    【讨论】:

    • 谢谢克科波克。我认为您一定是对的,但是无论我如何尝试,我都无法从 com.google.api-client 编译中排除 guava 模块。为什么会这样?我使用: compile(group: 'com.google.api-client', name: 'google-api-client', version: '1.19.0') { exclude(group: 'com.google.guava') } 和我能想到的所有其他排除可能性,但它永远不会被排除
    • 但是,kcoppock,我知道你是对的,因为我注释掉了第二个番石榴编译(14.0)并且我可以构建。但是,我仍然希望能够排除第一个番石榴模块,但等级似乎不允许它。任何想法为什么?
    • 你确定你改变了你的依赖exactly如上所示?我自己试过了,没有我的排除线,它不能像你的那样组装。使用 exclude 行,就成功了。
    • 据我所知,您将排除项与 google-api-client-ANDROID 模块一起使用,但我们试图排除的 guava 模块与早期的 google-api-client 模块一起使用在顶部。因此,当我完全按照您所显示的编译放置排除项时,它什么也不做,因为该特定编译没有番石榴。确实,它无法再次组装。
    • 你能发布你的整个依赖块吗?
    【解决方案3】:

    这是正确的解决方案,对我有用。从每个单独的导入中排除 guava-jdk5 依赖模块会适得其反(对我来说,它不起作用,因为我的应用程序所依赖的后端有一些内部依赖,这暴露了这种方法的真正问题)。

    以下解决了问题,是推荐的方法:

    configurations {
        all*.exclude group: 'com.google.guava', module: 'guava-jdk5'
    }
    

    来源https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.Configuration.html

    【讨论】:

    • 谢谢你,为我节省了几个小时。
    • 可能是最好的解决方案
    • 谢谢,如果这有帮助,请点赞,我认为这是正确的解决方案,并且比公认的答案更好
    【解决方案4】:

    看来你不能在同一个项目中同时使用 guava 和 guava-jdk5。 Guava-jdk5 仍在维护中,因此请考虑将项目的 guava 引用更改为 guava-jdk5:

    compile 'com.google.guava:guava-jdk5:17.0'
    

    【讨论】:

    • 只有这个解决方案对我有用。从端点库中排除 guava-jdk5 - 如上所述 - 听起来是一个更有吸引力的解决方案,但没有奏效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    • 2015-02-03
    • 1970-01-01
    相关资源
    最近更新 更多