2014-09-22 2 views
15

ottengo questo errore quando ho Esegui-> app per un'applicazione Android in Android StudioStudio Android dex multipla errore Gradle

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

Ed ecco l'output del -q gradlew: app: dipendenze

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

Ecco il blocco di dipendenza da 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') 
    } 
} 

risposta

10

il pacchetto com.google.common.annotations sembra essere il par t di Guava. Lo vedo nelle dipendenze due volte in leggermente diverse varianti: una volta come parte di Google API Client, una volta come la propria dipendenza:

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

e

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

Quindi la causa di questo errore è che si avere le stesse classi definite in più file dex (in diverse varianti della libreria Guava) incluse dalle altre dipendenze. Dovrai trovare un modo per escludere queste dipendenze duplicate o semplicemente assicurarti di utilizzare la stessa versione su tutte le dipendenze.

Una cosa che si potrebbe provare è escludere il modulo guava da una delle dipendenze. Allora, dove si ha il modulo client API definita, aggiungere una regola di esclusione per il modulo guava:

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

non posso garantire questo non causare problemi per la libreria di Google API client (dal momento che sono due diversi versioni di Guava), ma vale la pena provare.

EDIT: Dalla tua depdencies, provare a cambiare questo:

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 !!! 

a:

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

La biblioteca google-api-client-android in realtà non contiene Guava - I didn' Mi rendo conto che tu avevi due dipendenze di nome simile lì dentro.

+0

Grazie kcoppock. Penso che tu abbia ragione, ma non importa come ci provo, non posso escludere il modulo guava dalla compilazione com.google.api-client. Perché dovrebbe essere così? Utilizzo: compile (gruppo: 'com.google.api-client', nome: 'google-api-client', versione: '1.19.0') { escludi (gruppo: 'com.google.guava' } e ogni altra possibilità di esclusione a cui riesco a pensare ma non viene mai esclusa – aez

+0

Tuttavia, kcoppock, so che hai ragione, perché ho commentato la seconda compilazione di guava (14.0) e posso creare. Ma ancora, voglio essere in grado di escludere il primo modulo guava, ma il voto non sembra consentirlo. Qualche idea, perché? – aez

+0

Sei sicuro di aver cambiato la dipendenza * esattamente * come mostrato sopra? L'ho appena provato, e senza la mia linea di esclusione, non riesce a montare come il tuo. Con la riga di esclusione, ha successo. – kcoppock

5

Sembra che non sia possibile utilizzare sia guava che guava-jdk5 nello stesso progetto. Guava-jdk5 è ancora in fase di manutenzione, in modo da pensare di cambiare di riferimento guava del progetto di guava-jdk5:

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

Solo questa soln ha funzionato per me. Escludendo guava-jdk5 dalla libreria degli endpoint - come suggerito sopra - sembrava una soluzione più interessante ma non funzionava. – Tom

13

Per coloro che utilizzano Google Cloud endpoint in Android:

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

Dove backend è il nome del tuo modulo con l'app AppEngine.

In ogni altro caso, è sufficiente cercare la dipendenza transitiva guava-jdk5 ed escluderla.

+0

Grazie mille, ho cercato questo per secoli. – danwms

+0

Questo mi ha salvato. Grazie – Matt

5

Ecco la soluzione soluzione corretta, ha funzionato per me. Escludere il modulo di dipendenza guava-jdk5 da ogni singola importazione è controproducente (per me non ha funzionato perché avevo alcune dipendenze interne provenienti dal mio back-end da cui dipende la mia app, e questo espone il vero problema con questo approccio).

Di seguito risolto il problema ed è l'approccio consigliato:

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

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

+1

questo non sapevo @Creos, grazie :) – carlosavoy

+1

Grazie per questo, mi ha salvato un paio d'ore. –

+1

probabilmente la soluzione migliore –