2013-06-05 48 views
6

Tôi đang cố gắng di chuyển một dự án IntelliJ cũ để sử dụng gradle. Tuy nhiên, assembleDebug không thành công trong bước dx:Gradle và nhiều dự án với sự phụ thuộc Roboguice

java.lang.IllegalArgumentException: already added: Lcom/google/inject/AbstractModule; 
    at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:123) 
    at com.android.dx.dex.file.DexFile.add(DexFile.java:163) 
    at com.android.dx.command.dexer.Main.processClass(Main.java:490) 
    at com.android.dx.command.dexer.Main.processFileBytes(Main.java:459) 
    at com.android.dx.command.dexer.Main.access$400(Main.java:67) 
    at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:398) 
    at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:245) 
    at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:131) 
    at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:109) 
    at com.android.dx.command.dexer.Main.processOne(Main.java:422) 
    at com.android.dx.command.dexer.Main.processAllFiles(Main.java:333) 
    at com.android.dx.command.dexer.Main.run(Main.java:209) 
    at com.android.dx.command.dexer.Main.main(Main.java:174) 
    at com.android.dx.command.Main.main(Main.java:91) 

Dự án của tôi được chia thành hai tiểu dự án: dự án chính và dự án thư viện. Cả hai dự án này đều có Roboguice và Guice là phụ thuộc.

Tôi đã thử cách giải quyết được đề xuất của Xav để bao gồm thư viện hỗ trợ trong nhiều dự án như đã đề cập in this answer. Cách giải quyết có thể thậm chí không cần thiết, cho rằng roboguice/guice đều được chọn từ trung tâm maven. Tôi tạo ra một dự án thư viện giả là dự án duy nhất phụ thuộc vào roboguice/guice. Tôi đã thực hiện nó để dự án chính của tôi và dự án thư viện (đúng) đều phụ thuộc vào dự án giả này. Tuy nhiên, tôi nhận được cùng một lỗi.

Làm cách nào để khắc phục sự cố này?

settings.gradle trong thư mục gốc:

include 'MainApp' 
include 'library' 
include 'common-library' 

build.gradle trong thư mục gốc:

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.4.2' 
    } 
} 

allprojects { 
    version = '1.0' 

    repositories { 
     mavenCentral() 
    } 
} 

apply plugin: 'android-reporting' 

build.gradle trong dự án chính và thực dự án thư viện:

apply plugin: 'android' 

android { 
    compileSdkVersion 15 
    buildToolsVersion "17.0" 
    sourceSets   { 
     main { 
      manifest.srcFile 'AndroidManifest.xml' 
      java.srcDirs = ['src'] 
      res.srcDirs = ['res'] 
     } 
    } 
} 

dependencies { 
    compile project(':library') // only in main, not in real library 
    compile project(':common-library') 
} 

build.gradle trong dự án thư viện giả:

apply plugin: 'android-library' 

android { 
    compileSdkVersion 15 
    buildToolsVersion "17.0" 
    sourceSets   { 
     main { 
      manifest.srcFile 'AndroidManifest.xml' 
      java.srcDirs = ['src'] 
      res.srcDirs = ['res'] 
     } 
    } 
} 

dependencies { 
    compile 'org.roboguice:roboguice:2.0' 
    compile 'com.google.inject:guice:3.0' 
} 

Trả lời

9

Bạn nói đúng rằng các thư viện giả là không cần thiết vì bạn đang sử dụng Maven. Nếu bạn nhìn vào số .pom for Roboguice, nó liệt kê Guice dưới dạng phụ thuộc với trình phân loại "no_aop". Tuy nhiên, bạn cũng liệt kê Guice một cách rõ ràng mà không có trình phân loại. Đoán của tôi là Maven đang kéo cả hai phiên bản, kết quả là xung đột hợp nhất dexing.

Thử xóa compile 'com.google.inject:guice:3.0' khỏi tệp xây dựng Gradle của bạn và xem tệp có được xây dựng hay không.

+0

Cảm ơn, mà làm việc. Không hoàn toàn nhớ tại sao tôi cảm thấy tôi cần phải thêm guice vào phụ thuộc. – Hrushikesh

0

Ok, những người tôi đã sáng lập! Để giải quyết vấn đề này, bạn đã sử dụng 'loại trừ mô-đun' trên build.gradle cho dự án thư viện.

Dưới đây là ví dụ của tôi: biên dịch ('oauth.signpost: biển hiệu-commonshttp4: 1.2.1.2') { loại trừ mô-đun: 'httpcore'}

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