我正在尝试迁移一个旧的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建议的解决办法,将支持库包括在多个项目中,如前面提到的in this answer。考虑到机器人/guice都是从maven中心获取的,解决方法可能甚至不需要。我创建了一个虚拟库项目,这是唯一依赖于机器人/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'
}发布于 2013-06-07 21:27:28
您是对的,因为您使用的是Maven,所以没有必要使用虚拟库。如果您查看.pom for Roboguice,它会将Guice作为一个具有"no_aop“分类器的依赖项。但是,您还显式地列出了没有分类器的Guice。我的猜测是,Maven使用了这两个版本,这导致了dexing合并冲突。
尝试从Gradle构建文件中删除compile 'com.google.inject:guice:3.0',并查看它是否生成。
发布于 2014-05-15 14:54:45
好了,伙计们,我创立的!要解决这个问题,您必须在库项目的上使用“build.gradle排除模块”。
下面是我的示例:编译('oauth.signpost:signpost-commonshttp4:1.2.1.2') { exclude模块:'httpcore‘}
https://stackoverflow.com/questions/16932097
复制相似问题