首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有Roboguice依赖关系的分级和多个项目

具有Roboguice依赖关系的分级和多个项目
EN

Stack Overflow用户
提问于 2013-06-05 05:20:58
回答 2查看 4.4K关注 0票数 6

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

代码语言:javascript
复制
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

代码语言:javascript
复制
include 'MainApp'
include 'library'
include 'common-library'

根目录中的build.gradle

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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'
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-07 21:27:28

您是对的,因为您使用的是Maven,所以没有必要使用虚拟库。如果您查看.pom for Roboguice,它会将Guice作为一个具有"no_aop“分类器的依赖项。但是,您还显式地列出了没有分类器的Guice。我的猜测是,Maven使用了这两个版本,这导致了dexing合并冲突。

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

票数 9
EN

Stack Overflow用户

发布于 2014-05-15 14:54:45

好了,伙计们,我创立的!要解决这个问题,您必须在库项目的上使用“build.gradle排除模块”。

下面是我的示例:编译('oauth.signpost:signpost-commonshttp4:1.2.1.2') { exclude模块:'httpcore‘}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16932097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档