2014-09-22 49 views
15

,当我运行 - 我得到这个错误>应用程序为Android Studio中Android Studio中多dex文件所gradle这个错误

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

而且这里的Android应用程序是gradlew -q的输出:应用:依赖

+--- 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') 
    } 
} 

回答

10

com.google.common.annotations包似乎是不相上下的依赖性块吨的番石榴。我看到它在依赖两次略有不同的变化:曾经为谷歌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客户端模块,添加排除规则的番石榴模块:

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

我不能保证这不会导致对谷歌API客户端库的问题(因为它们是两个不同番石榴的版本),但它是值得一试。

编辑:从您的depdencies,尝试改变这一点:

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') 

在谷歌的API客户端功能的Android库实际上并不包含番石榴 - 我没”意识到你在那里有两个类似命名的依赖关系。

+0

感谢kcoppock。我认为你一定是对的,但不管我如何尝试,我都无法从com.google.api-client编译中排除guava模块。为什么会这样?我使用: compile(group:'com.google.api-client',name:'google-api-client',version:'1.19.0'){ exclude(group:'com.google.guava' ) } 和其他排除的可能性我可以想到,但它永远不会被排除 – aez 2014-09-23 01:21:59

+0

然而,kcoppock,我知道你是正确的,因为我评论了第二番石榴编译(14.0),我可以建立。但是,我仍然希望能够排除第一个番石榴模块,但是评分似乎不允许。任何想法为什么? – aez 2014-09-23 01:26:11

+0

你确定你改变了你的依赖*完全*如上所示?我只是自己试了一下,没有我的排除路线,它没有像你的那样组装。使用排除行,它会成功。 – kcoppock 2014-09-23 01:35:04

5

看来你不能在同一个项目中同时使用番石榴和番石榴-jdk5。番石榴JDK5仍在维持,所以考虑改变项目的番石榴参考番石榴JDK5:

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

只有这个soln为我工作。从端点库中排除guava-jdk5 - 如上所述 - 听起来像是一个更有吸引力的解决方案,但没有奏效。 – Tom 2015-04-28 16:09:18

13

对于那些谁正在使用谷歌云端点在Android应用:

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

哪里backend是名您的模块与AppEngine应用程序。

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

+0

非常感谢,我一直在寻找这一点。 – danwms 2015-01-08 21:49:05

+0

这救了我。谢谢 – Matt 2016-05-04 19:55:35

5

这是正确的解决方案,为我工作。从每个单独的导入中排除guava-jdk5依赖项模块会适得其反(对我而言,它不起作用,因为我的应用程序依赖于我的后端来自某些内部依赖项,这暴露了此方法的实际问题)。

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

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

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

+1

这一个我不知道@克雷奥斯,谢谢:) – carlosavoy 2016-05-26 10:50:54

+1

谢谢你,为我节省了几个小时。 – 2017-03-23 12:51:46

+1

可能是最好的解决方案 – 2017-04-06 14:06:27

相关问题