6

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

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 建议的解决方法,将支持库包含在此答案中提到的多个项目中。考虑到 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'
}
4

2 回答 2

9

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

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

于 2013-06-07T21:27:28.947 回答
0

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

这是我的例子: compile ('oauth.signpost:signpost-commonshttp4:1.2.1.2') { exclude module: 'httpcore' }

于 2014-05-15T14:54:45.207 回答