2014-09-22 27 views
15

tôi nhận được lỗi này khi tôi run-> ứng dụng cho một ứng dụng Android trong Android StudioAndroid Studio Nhiều dex gradle lỗi

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

Và đây là sản phẩm của -q gradlew: Ứng dụng: phụ thuộc

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

đây là khối phụ thuộc từ 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') 
    } 
} 

Trả lời

10

gói com.google.common.annotations có vẻ là mệnh t của ổi. Tôi nhìn thấy nó trong sự phụ thuộc hai lần trong biến thể hơi khác nhau: một lần như một phần của Google API Client, một lần như sự phụ thuộc của riêng bạn:

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

Vì vậy, nguyên nhân của lỗi này là bạn có cùng các lớp được định nghĩa trong nhiều tệp dex (trong các biến thể khác nhau của thư viện ổi) được bao gồm bởi các phụ thuộc khác của bạn. Bạn cần phải tìm cách loại trừ các phụ thuộc trùng lặp này hoặc có thể chỉ đảm bảo rằng bạn sử dụng cùng một phiên bản trên tất cả các phụ thuộc.

Một điều bạn có thể thử là loại trừ mô-đun ổi khỏi một trong các phụ thuộc. Vì vậy, nơi bạn có các module ứng dụng khách API xác định, thêm một quy tắc loại trừ cho các mô-đun ổi:

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

tôi không thể đảm bảo điều này sẽ không gây ra vấn đề cho các thư viện API của Google Khách hàng (vì chúng là hai khác nhau phiên bản của ổi) nhưng nó đáng để thử.

EDIT: Từ depdencies của bạn, hãy thử thay đổi này:

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

tới:

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

Thư viện google-api-client-android không thực sự chứa Ổi - tôi didn' Tôi nhận ra bạn có hai phụ thuộc có tên tương tự trong đó.

+0

Cảm ơn kcoppock. Tôi nghĩ bạn phải đúng, nhưng dù tôi có cố gắng thế nào đi chăng nữa, tôi cũng không thể loại trừ mô-đun ổi từ bản dịch com.google.api-client. Tại sao thế giới trở nên như vậy? Tôi sử dụng: biên dịch (nhóm: 'com.google.api-client', tên: 'google-api-client', phiên bản: '1.19.0') { loại trừ (nhóm: 'com.google.guava') } và mọi loại trừ khả năng khác mà tôi có thể nghĩ nhưng không bao giờ bị loại trừ – aez

+0

Tuy nhiên, kcoppock, tôi biết bạn là chính xác, bởi vì tôi đã nhận xét biên dịch ổi thứ hai (14.0) và tôi có thể xây dựng. Nhưng vẫn còn, tôi muốn có thể loại trừ các mô-đun ổi đầu tiên, nhưng lớp dường như không cho phép nó. Bất kỳ ý tưởng tại sao? – aez

+0

Bạn có chắc chắn đã thay đổi mức độ phụ thuộc * chính xác * như được hiển thị ở trên không? Tôi chỉ thử bản thân mình, và không có dòng trừ của tôi, nó không thể lắp ráp giống như của bạn. Với dòng trừ, nó thành công. – kcoppock

5

Có vẻ như bạn không thể sử dụng cả ổi và ổi-jdk5 trong cùng một dự án. Ổi-jdk5 vẫn đang được duy trì, vì vậy xem xét thay đổi tài liệu tham khảo ổi của dự án của bạn để ổi-jdk5:

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

Chỉ có soln này làm việc cho tôi. Loại trừ guava-jdk5 khỏi thư viện điểm cuối - như đã đề xuất ở trên - nghe như một giải pháp hấp dẫn hơn nhưng không hoạt động. – Tom

13

Đối với những người đang sử dụng Google Cloud thiết bị đầu cuối trong ứng dụng Android:

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

đâu backend là tên của mô-đun của bạn với ứng dụng AppEngine.

Trong mọi trường hợp khác, chỉ cần tìm guava-jdk5 phụ thuộc transitive và loại trừ nó.

+0

Cảm ơn bạn rất nhiều, tôi đã tìm kiếm điều này cho các lứa tuổi. – danwms

+0

Điều này đã lưu tôi. Cảm ơn – Matt

5

Đây là giải pháp giải pháp chính xác, phù hợp với tôi. Việc loại trừ mô-đun phụ thuộc của guava-jdk5 khỏi mỗi lần nhập riêng lẻ là phản tác dụng (đối với tôi nó không hoạt động vì tôi có một số phụ thuộc nội bộ đến từ chương trình phụ trợ mà ứng dụng của tôi phụ thuộc và điều này cho thấy vấn đề thực sự với cách tiếp cận này).

Sau đây giải quyết vấn đề và là cách tiếp cận đề nghị:

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

Nguồn: https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.Configuration.html

+1

cái này tôi không biết @Creos, cảm ơn :) – carlosavoy

+1

Cảm ơn vì điều này, đã lưu tôi một vài giờ. –

+1

có lẽ là giải pháp tốt nhất –

Các vấn đề liên quan