使用gradle构建时出现dexDebug错误

时间:2015-11-17 22:48:39

标签: android gradle dex

我有3个模块正在构建。

A(没有依赖项的android库) B(依赖于A的android库) C(依赖于B和A的android应用程序)

首先,我想在C中声明只有B,并且有A传递 第二,我一直得到dex错误:

Unknown source file : UNEXPECTED TOP-LEVEL EXCEPTION:
Unknown source file : com.android.dex.DexException: Multiple dex files define Lorg/apache/commons/collections/Buffer;
Unknown source file :   at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596)
Unknown source file :   at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)
Unknown source file :   at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535)
Unknown source file :   at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
Unknown source file :   at com.android.dx.merge.DexMerger.merge(DexMerger.java:189)
Unknown source file :   at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:502)
Unknown source file :   at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)
Unknown source file :   at com.android.dx.command.dexer.Main.run(Main.java:277)
Unknown source file :   at com.android.dx.command.dexer.Main.main(Main.java:245)
Unknown source file :   at com.android.dx.command.Main.main(Main.java:106)

:app:dexDebug FAILED

我提供模块B,C(A没有任何)

中声明的依赖项

B:

dependencies {
    compile 'com.me.project:project-base:1.0.0'
    compile 'org.apache.httpcomponents:httpcore:4.3'
    compile 'org.apache.httpcomponents:httpmime:4.3'
    compile 'commons-io:commons-io:2.4'
}

C:

dependencies {
    compile 'com.android.support:appcompat-v7:+'
    compile 'com.android.support:design:23.1.0'
    compile 'com.android.support:recyclerview-v7:23.1.0'
    compile 'com.android.support:gridlayout-v7:23.1.0'
    compile ('B')
    compile 'com.android.support:support-v4:23.1.0'
    compile 'commons-validator:commons-validator:1.4.1'
    compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.4'

    // TODO: check how to make it transitive somehow
    compile 'com.me.project:project-base:1.0.0'

    // only simbols to compile time
    provided 'org.apache.httpcomponents:httpcore:4.3'
    provided 'org.apache.httpcomponents:httpmime:4.3'
    provided 'commons-io:commons-io:2.4'
}

请帮我解释如何正确配置项目并解决错误

谢谢!

2 个答案:

答案 0 :(得分:0)

正如异常消息所示, commons-collections 依赖关系被添加两次。

从快速查看,我发现commons-validator库取决于commons-collections。您必须找到commons-collections是否由另一个依赖项传递添加。

可以帮助您的工具是:

打印所有编译依赖项(从项目的根目录开始,其中app是应用程序模块的名称):
./gradlew app:dependencies --configuration compile

使用依赖性洞察报告:
./gradlew app:dependencyInsight --configuration compile --dependency commons-collections

如果上述选项无效,则可能将commons-collections类打包在fat-jar中。使用以下任务打印所有编译依赖项,并检查其中一个jar是否包含commons-collections类(使用./gradlew app:printDependencies运行):

task printDependencies << {
    configurations.compile.each { println it.name }
}

作为旁注,commons-validator v1.4.1依赖于vulnerable commons-collections 3.2.1版本。确保你使用的是3.2.2或更高版本的公共收藏品。

答案 1 :(得分:0)

首先,感谢大家的努力。

我收到了这个错误,因为我有两次相同的符号。它来自两个不同的依赖。

我运行gradle依赖项以获取dependecies树来查找这些jar。

之后我在其依赖项下的build.gradle文件中为其中一个添加了'exludes'。

解决了我的问题,因为现在dex进程只有一个符号。

再次感谢大家。你非常乐于助人