2013-06-05 14 views
6

Próbuję przeprowadzić migrację starego projektu IntelliJ do użycia gradle. Jednak assembleDebug zawiedzie podczas etapu dx:Gradle i wiele projektów z zależnością 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) 

Mój projekt jest podzielony na dwa podprojekty: głównego projektu i projektu biblioteki. Oba te projekty mają Roboguice i Guice jako zależności.

Próbowałem Xav sugerowane obejście dla włączenia biblioteki wsparcia w wielu projektach, jak wspomniano in this answer. Obejście problemu prawdopodobnie nie musi być nawet konieczne, biorąc pod uwagę, że roboguice/guice są zbierane z maven central. Stworzyłem fałszywy projekt biblioteczny, który jest jedynym projektem, który zależy od roboguice/guice. Zrobiłem to, aby mój główny projekt i projekt (prawdziwy) biblioteki zależały od tego fałszywego projektu. Jednak pojawia się ten sam błąd.

Jak można to naprawić?

settings.gradle w katalogu:

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

build.gradle w katalogu:

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 w głównym projektu i prawdziwy projekt biblioteki:

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 w projekcie biblioteki manekina:

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

Odpowiedz

9

Masz rację, że manekin biblioteka nie jest konieczne, ponieważ używasz Maven. Jeśli spojrzysz na .pom for Roboguice, wymieni on Guice jako zależność z klasyfikatorem "no_aop". Jednak wpisujesz Guice jawnie bez klasyfikatora. Domyślam się, że Maven przyciąga obie wersje, co skutkuje konfliktem z dexingiem.

Spróbuj usunąć compile 'com.google.inject:guice:3.0' z pliku kompilacji Gradle i sprawdzić, czy kompiluje.

+0

Dzięki, że pracował. Nie bardzo pamiętam, dlaczego czułem, że potrzebuję dodać guice do zależności. – Hrushikesh

0

Ok, ludzie, których założyłem! Aby rozwiązać ten problem, należy użyć "wykluczyć moduł" na build.gradle dla projektu biblioteki.

Oto moje przykłady: kompilacji ('oauth.signpost: drogowskaz-commonshttp4: 1.2.1.2') { wyłączyć moduł: 'httpcore'}

Powiązane problemy