【问题标题】:Unable to exclude duplicate libraries in Gradle无法在 Gradle 中排除重复库
【发布时间】:2016-03-28 14:37:10
【问题描述】:

我正在尝试将库连接到我在 Gradle 中的项目:

compile 'com.balancedpayments:balancedpayments:1.4'

当我单击“立即同步”项目构建时没有错误,但是当我运行我的项目时,IDE 显示错误:

执行任务:[:app:assembleDebug]

按需配置是一项孵化功能。 :app:preBuild :app:compileDebugNdk UP-TO-DATE :app:preDebugBuild :app:checkDebugManifest :app:preReleaseBuild :app:prepareComAndroidSupportAppcompatV72103Library UP-TO-DATE :app:prepareComAndroidSupportSupportV42103Library UP-TO-DATE :app:prepareDebugDependencies :app:compileDebugAidl 最新 :app:compileDebugRenderscript UP-TO-DATE :app:generateDebugBuildConfig 最新:app:generateDebugAssets 最新:app:mergeDebugAssets 最新:app:generateDebugResValues 最新 :app:generateDebugResources 最新 :app:mergeDebugResources 最新:app:processDebugManifest 最新 :app:processDebugResources 最新 :app:generateDebugSources 最新:app:compileDebugJava 最新:app:preDexDebug UP-TO-DATE :app:dexDebug 意外的顶级异常: com.android.dex.DexException:多个 dex 文件定义 Lorg/apache/commons/codec/解码器;在 com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596) 在 com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554) 在 com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535) 在 com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171) 在 com.android.dx.merge.DexMerger.merge(DexMerger.java:189) 在 com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454) 在 com.android.dx.command.dexer.Main.runMonoDex(Main.java:303) 在 com.android.dx.command.dexer.Main.run(Main.java:246) 在 com.android.dx.command.dexer.Main.main(Main.java:215) 在 com.android.dx.command.Main.main(Main.java:106)

失败

FAILURE:构建失败并出现异常。

  • 出了什么问题:任务 ':app:dexDebug' 执行失败。

    com.android.ide.common.internal.LoggedErrorException:无法运行命令: C:\Users\zen_75\AppData\Local\Android\sdk\build-tools\21.1.2\dx.bat --dex --no-optimize --output C:\skip\TestPayment\app\build\intermediates\dex\debug --input-list=C:\skip\TestPayment\app\build\intermediates\tmp\dex\debug\inputList.txt 错误代码:2 输出:意外的顶级异常: com.android.dex.DexException:多个 dex 文件定义 Lorg/apache/commons/codec/解码器;在 com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:596)
    在 com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:554)
    在 com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:535)
    在 com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171) 在 com.android.dx.merge.DexMerger.merge(DexMerger.java:189) 在 com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:454) 在 com.android.dx.command.dexer.Main.runMonoDex(Main.java:303) 在 com.android.dx.command.dexer.Main.run(Main.java:246) 在 com.android.dx.command.dexer.Main.main(Main.java:215) 在 com.android.dx.command.Main.main(Main.java:106)

  • 尝试:使用 --stacktrace 选项运行以获取堆栈跟踪。使用 --info 或 --debug 选项运行以获得更多日志输出。

构建失败

我找到了问题的描述 - 这是库的冲突。为了解决这个问题,建议消除冲突库。为此,我这样做:

configurations {
    all*.exclude module: 'httpclient'
    all*.exclude module: 'commons-logging'
}

警告消失,但错误仍然存​​在。您能告诉我如何消除这些库吗?

谢谢。

【问题讨论】:

    标签: android android-gradle-plugin


    【解决方案1】:

    "com.android.dex.DexException: 多个dex文件定义"

    当一个 .class 文件或 jarfile 的内容的两个或多个副本被无意中包含到项目中时,会导致这个令人烦恼的错误。 (Gradle 和/或 Android Studio 的新手经常被这个阻止)。

    1. 尝试在应用的顶级 build.gradle 中排除它-

      android {
          ...
          packagingOptions {
              exclude('org/apache/commons/codec/*')
          }
      }
      
    2. 检查该库是否多次作为依赖项包含:检查您项目的所有 build.gradle 文件以确保它仅包含一次。

       compile 'org.apache.commons.code' ...
      
    3. 库或子项目还可能包含重复库或类文件的副本:您可以将其排除在库编译到您的应用程序中的位置,在您的 build.gradle 文件中查找其编译规范-

      dependencies {
          ...
          compile('com.googlecode.json-simple:json-simple:1.1.1') {
              exclude group: 'org.hamcrest'
          }
      }
      
    4. 如果这不起作用,请尝试将 ", module: 'library'" 附加到排除行,即-

          compile('com.googlecode.json-simple:json-simple:1.1.1') {
              exclude group: 'org.hamcrest', module: 'library'
          }
      
    5. 要准确确定哪个库或子项目包含重复的类文件,请尝试使用 --debug 运行 gradle 并查看控制台输出以跟踪该包含的来源-

      % gradle --debug release 2>&1 | less
      

    【讨论】:

      【解决方案2】:

      我在 api 23 中使用HttpClient 时遇到了类似的问题。我导入org.apache.http.legacy.jar 出现了问题。我用useLibrary 'org.apache.http.legacy'解决了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-05
        • 1970-01-01
        • 2015-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-29
        • 1970-01-01
        相关资源
        最近更新 更多