【问题标题】:dexDebug error when building with gradle使用 gradle 构建时出现 dexDebug 错误
【发布时间】:2015-11-17 22:48:38
【问题描述】:

我正在构建 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 没有)

乙:

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

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

谢谢!!

【问题讨论】:

  • 请运行此./gradlew assemble 并向我们展示结果
  • 我添加的异常来自调用 dexDebug 的任务组装

标签: android gradle dex


【解决方案1】:

正如异常消息所示,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 版本。确保您使用的是 commons-collections 3.2.2 或更高版本。

【讨论】:

    【解决方案2】:

    首先,感谢大家的努力。

    我收到此错误是因为我有两次相同的符号。它来自两个不同的依赖项。

    我运行了 gradle dependencies 来获取依赖树来找到那些 jars。

    之后,我在 build.gradle 文件的依赖项下将“排除”添加到其中之一。

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

    再次感谢大家。你帮了大忙

    【讨论】:

      猜你喜欢
      • 2020-04-22
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 2015-09-03
      • 2017-12-22
      • 2020-06-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多