2013-06-05 17 views
6

Sto provando a migrare un vecchio progetto IntelliJ per usare gradle. Tuttavia, assembleDebug fallisce durante la fase di dx:Gradle e più progetti con dipendenza 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) 

Il mio progetto è suddiviso in due sottoprogetti: un progetto principale e un progetto di libreria. Entrambi questi progetti hanno Roboguice e Guice come dipendenze.

Ho provato la soluzione suggerita da Xav per includere la libreria di supporto in più progetti come indicato in this answer. Probabilmente la soluzione non dovrebbe nemmeno essere necessaria, dato che roboguice/guice vengono entrambi prelevati da Maven Central. Ho creato un progetto di libreria fittizio che è l'unico progetto che dipende da roboguice/guice. Ho fatto in modo che il mio progetto principale e il (vero) progetto della biblioteca dipendessero entrambi da questo progetto fittizio. Tuttavia, ottengo lo stesso errore.

Come può essere risolto?

settings.gradle nella directory principale:

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

build.gradle nella directory principale:

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 nel progetto principale e la vera progetto di biblioteca:

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 nel progetto libreria di manichino:

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

risposta

9

hai ragione che la libreria manichino non è necessario dal momento che si sta utilizzando Maven. Se guardi lo .pom for Roboguice, elenca Guice come una dipendenza con il classificatore "no_aop". Tuttavia, stai anche elencando Guice esplicitamente senza il classificatore. La mia ipotesi è che Maven stia tirando in entrambe le versioni, il che si traduce nel conflitto di unione dexing.

Provare a rimuovere compile 'com.google.inject:guice:3.0' dal file di build Gradle e vedere se si costruisce.

+0

Grazie, che ha funzionato. Non ricordo bene perché ho sentito di dover aggiungere guizzi alle dipendenze. – Hrushikesh

0

Ok ragazzi, ho fondato! Per risolvere questo problema è necessario 'escludere il modulo' su build.gradle per il progetto di libreria.

Ecco i miei esempi: compilazione ('oauth.signpost: cartello-commonshttp4: 1.2.1.2') { esclude modulo: 'httpcore'}

Problemi correlati