【问题标题】:Gradle and multiple projects with Roboguice dependencyGradle 和多个具有 Roboguice 依赖项的项目
【发布时间】:2013-06-05 05:20:58
【问题描述】:

我正在尝试迁移旧的 IntelliJ 项目以使用 gradle。但是,在 dx 步骤中 assembleDebug 失败:

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)

我的项目分为两个子项目:一个主项目和一个库项目。这两个项目都有 Roboguice 和 Guice 作为依赖项。

我尝试了 Xav 建议的解决方法,将支持库包含在多个项目中,如 in this answer 所述。考虑到 roboguice/guice 都是从 maven central 获取的,这种解决方法可能甚至都不是必需的。我创建了一个虚拟库项目,它是唯一依赖于 roboguice/guice 的项目。我这样做是为了让我的主项目和(真正的)库项目都依赖于这个虚拟项目。但是,我得到了同样的错误。

如何解决这个问题?

settings.gradle在根目录:

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

build.gradle在根目录:

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在主项目和真实库项目中:

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 在虚拟库项目中:

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

【问题讨论】:

    标签: android gradle roboguice


    【解决方案1】:

    您是对的,因为您使用的是 Maven,所以不需要虚拟库。如果您查看.pom for Roboguice,它会将 Guice 列为具有“no_aop”分类器的依赖项。但是,您也在没有分类器的情况下明确列出 Guice。我的猜测是 Maven 正在拉入两个版本,这会导致 dexing 合并冲突。

    尝试从您的 Gradle 构建文件中删除 compile 'com.google.inject:guice:3.0' 并查看它是否构建。

    【讨论】:

    • 谢谢,成功了。不太记得为什么我觉得我需要为依赖项添加 guice。
    【解决方案2】:

    好的,我创立的伙计们! 为了解决这个问题,您在 build.gradle 上为 library-project 使用了“exclude module”。

    这是我的例子: 编译('oauth.signpost:signpost-commonshttp4:1.2.1.2'){ 排除模块:'httpcore' }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-10
      • 2015-08-22
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      相关资源
      最近更新 更多