2014-09-22 2 views
15

Я получаю эту ошибку, когда я RUN-> приложение для Android приложения в Android StudioAndroid Студия Multiple Dex файлы Gradle ошибка

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

А вот выход 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 Google, один раз в вашей собственной зависимости:

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

Я не могу гарантировать, что это не вызовет проблем для библиотеки Google API клиента (так как они являются два различных версии Guava), но стоит попробовать.

EDIT: Из ваших 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') 

в системе Google API-клиент-андроида библиотека фактически не содержит Guava - я Ждут» я понял, что у вас есть две одинаково названные зависимости.

+0

Благодаря kcoppock. Я думаю, вы, должно быть, правы, но как бы я ни старался, я не могу исключить модуль guava из комьюнита com.google.api-client. Почему это так? Я использую: compile (группа: 'com.google.api-client', имя: 'google-api-client', версия: '1.19.0') { исключить (группа: 'com.google.guava') }} и все остальные исключить возможность, о которой я могу думать, но он никогда не исключается. – aez

+0

Однако, kcoppock, я знаю, что вы правы, потому что я прокомментировал второй компилятор guava (14.0), и я могу его построить. Но тем не менее, я хочу, чтобы исключить первый модуль guava, но класс, похоже, не позволяет этого. Любые идеи почему? – aez

+0

Вы уверены, что изменили свою зависимость * точно *, как показано выше? Я просто пробовал это сам, и без моей линии исключения он не может собраться так же, как и ваш. С линией exclude она преуспевает. – kcoppock

5

Кажется, вы не можете использовать как guava, так и guava-jdk5 в том же проекте. Гуава-jdk5 по-прежнему сохраняется, так что рассмотреть вопрос об изменении ссылки гуавы вашего проекта в гуавы-jdk5:

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

Только этот soln работал для меня. Исключение guava-jdk5 из библиотеки конечных точек - как было предложено выше - звучало как более привлекательное решение, но не работало. – Tom

13

Для тех, кто использует Google Cloud Endpoints в Android приложения:

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

Где backend это имя вашего модуля с приложением AppEngine.

В любом другом случае просто найдите guava-jdk5 транзитивную зависимость и исключите ее.

+0

Большое вам спасибо, я искал это целую вечность. – danwms

+0

Это спасло меня. Спасибо – Matt

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

этот я не знал @Creos, спасибо :) – carlosavoy

+1

Спасибо за это, спасли меня пару часов. –

+1

возможно лучшее решение –