2014-09-22 16 views
15

जब मैं रन मैं इस त्रुटि मिलती है> एंड्रॉयड स्टूडियोएंड्रॉयड स्टूडियो एकाधिक डेक्स फ़ाइलें 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 पैकेज बराबर हो रहा है पर निर्भरता को ब्लॉक है अमरूद के टी। मैं थोड़ा अलग रूपों में दो बार निर्भरता में देख: एक बार 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 

तो यह त्रुटि का कारण यह है कि आप कई अन्य डीएक्स फाइलों (गुवा पुस्तकालय के विभिन्न रूपों में) में परिभाषित एक ही कक्षाएं हैं जो आपकी अन्य निर्भरताओं द्वारा शामिल की जा रही हैं। आपको इन डुप्लिकेट निर्भरताओं को बाहर करने का एक तरीका ढूंढना होगा, या संभवतः यह सुनिश्चित करना होगा कि आप सभी निर्भरताओं में एक ही संस्करण का उपयोग करें।

एक चीज जो आप कोशिश कर सकते हैं वह है कि अमरूदों में से एक से अमरूद को बाहर निकालना है। तो, जहां एपीआई क्लाइंट मॉड्यूल परिभाषित किया गया है, अमरूद मॉड्यूल के लिए एक अपवर्जन नियम जोड़ने:

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

मैं गारंटी नहीं दे सकते तो इसे Google API क्लाइंट पुस्तकालय के लिए समस्या पैदा नहीं होगा (क्योंकि वे दो अलग हैं अमरूद के संस्करण) लेकिन यह एक कोशिश के लायक है।

संपादित करें:

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-ग्राहक-एंड्रॉयड पुस्तकालय वास्तव में अमरूद शामिल नहीं है अपने depdencies से, इस से बदल कर देखें टी एहसास नहीं है कि आपके पास दो समान नामित निर्भरताएं थीं।

+0

धन्यवाद kcoppock। मुझे लगता है कि आपको सही होना चाहिए, लेकिन कोई फर्क नहीं पड़ता कि मैं कैसे कोशिश करता हूं, मैं com.google.api-client संकलन से guava मॉड्यूल को बाहर नहीं कर सकता। ऐसा क्यों होगा? मैं उपयोग करता हूं: संकलन (समूह: 'com.google.api-client', नाम: 'google-api-client', संस्करण: '1.1 9.0') { बहिष्कृत (समूह: 'com.google.guava') } और हर दूसरे संभावना को छोड़कर मैं सोच सकता हूं लेकिन इसे कभी भी – aez

+0

को बाहर नहीं किया जाता है हालांकि, केकोपॉक, मुझे पता है कि आप सही हैं, क्योंकि मैंने दूसरे अमरूद संकलन (14.0) पर टिप्पणी की और मैं निर्माण कर सकता हूं। लेकिन फिर भी, मैं पहले अमरूद मॉड्यूल को बाहर करने में सक्षम होना चाहता हूं, लेकिन ग्रेड इसे अनुमति नहीं देता है। कोई विचार क्यों? – aez

+0

क्या आप वाकई ऊपर दिखाए गए अनुसार अपनी निर्भरता * बिल्कुल * बदल चुके हैं? मैंने बस इसे स्वयं करने की कोशिश की, और बिना किसी लाइन के बाहर, यह आपके जैसा ही इकट्ठा करने में विफल रहता है। लाइन को बाहर करने के साथ, यह सफल होता है। – kcoppock

5

ऐसा लगता है कि आप एक ही प्रोजेक्ट में अमरूद और अमरूद-जेडीके 5 दोनों का उपयोग नहीं कर सकते हैं। अमरूद-jdk5 अभी भी बनाए रखा जा रहा है, इसलिए अमरूद-jdk5 को अपने प्रोजेक्ट की अमरूद संदर्भ बदलने पर विचार:

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

केवल इस सोलन ने मेरे लिए काम किया है। एंडपॉइंट्स लाइब्रेरी से अमरूद-जेडीके 5 को छोड़कर - ऊपर सुझाए गए अनुसार - एक अधिक आकर्षक समाधान की तरह लग रहा था लेकिन काम नहीं किया। – Tom

13

जो लोग एंड्रॉयड ऐप्स में Google मेघ अंतिम बिंदु का उपयोग कर रहे के लिए:

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

शायद सबसे अच्छा समाधान –

संबंधित मुद्दे