Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Gradle and multiple projects with Roboguice dependency

I'm trying to migrate an old IntelliJ project to use gradle. However, assembleDebug fails during the dx step:

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)

My project is split into two subprojects: a main project and a library project. Both these project have Roboguice and Guice as dependencies.

I tried Xav's suggested workaround for including the support library in multiple projects as mentioned in this answer. The workaround should probably not even be necessary, given that roboguice/guice are both picked up from maven central. I created a dummy library project that's the only project that depends on roboguice/guice. I made it so that my main project and the (true) library project both depend on this dummy project. However, I get the same error.

How can this be fixed?

settings.gradle in the root directory:

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

build.gradle in the root directory:

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 in the main project and the real library project:

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 in the dummy library project:

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'
}
like image 474
Hrushikesh Avatar asked Jun 05 '13 05:06

Hrushikesh


1 Answers

You're right that the dummy library isn't necessary since you're using Maven. If you look at the .pom for Roboguice, it lists Guice as a dependency with the "no_aop" classifier. However, you're also listing Guice explicitly without the classifier. My guess is that Maven is pulling in both versions, which results in the dexing merge conflict.

Try removing compile 'com.google.inject:guice:3.0' from your Gradle build file and see if it builds.

like image 176
Greg Avatar answered Sep 18 '22 22:09

Greg