【问题标题】:Duplicate Zip Entry after Gradle Plugin v0.13.1Gradle Plugin v0.13.1 后重复的 Zip 条目
【发布时间】:2014-11-21 11:33:02
【问题描述】:

我一直在使用 Gradle Android 插件 v0.12,但我决定升级到新版本,因为我需要新功能(而且提高的速度总是一个加分项)。

更新到新的 v0.13.1 后,我不断收到“重复的 Zip 条目”(来自 Proguard),而之前一切正常。完整的错误:

java.io.IOException: 无法写入 [/Users/.../classes-proguard/netherlands/release/classes.jar] (无法读取 [/Users/.../.gradle/caches /modules-2/files-2.1/org.apache.commons/commons-io/1.3.2/b6dde38349ba9bb5e6ea6320531eae969985dae5/commons-io-1.3.2.jar(;;;;;;!META-INF/MANIFEST.MF) ](重复的 zip 条目 [commons-io-1.3.2.jar:org/apache/commons/io/CopyUtils.class]))(CopyUtils 之前是 FileUtils)。

我正在使用以下打包选项:packagingOptions

{ 
   exclude 'AndroidManifest.xml' 
   exclude 'META-INF/DEPENDENCIES' 
   exclude 'META-INF/notice.txt' 
   exclude 'META-INF/license.txt' 
   exclude 'META-INF/LICENSE.txt' 
   exclude 'META-INF/NOTICE.txt' 
   exclude 'META-INF/MANIFEST.MF' 
   exclude '!META-INF/MANIFEST.MF' 
   exclude 'META-INF/services/javax.annotation.processing.Processor' 
}

如您所知,我排除了清单文件...

只是为了测试它,我改回 0.12.0 版本,一切都恢复正常,回到 0.13.* 并且它坏了(但我需要 0.13.*)!

此外,我正在使用以下库:

  1. Robospice
  2. 改造
  3. OkHttp
  4. 飞镖
  5. 冰镐
  6. 黄油刀
  7. 面包丁
  8. 平滑进度条
  9. NineoldsAndroid(在 BetterPickers 库中)

有人也遇到过这个问题吗?如果是这样,任何人都可以帮助我(现在已经在这个问题上打破了我的头脑 2 天!)?谢谢!

【问题讨论】:

  • 看来你不是唯一一个:github.com/stephanenicolas/robospice/issues/365
  • 删除主目录中的 .gradle 文件夹并重建是否有效?如果你清理你的项目并重建呢?
  • 我尝试删除 Gradle 缓存、.gradle 文件夹,... 没有任何效果,但 Gaëten 的回答确实有效!好像是构建工具出错了!
  • 您需要运行./gradlew -q app:dependencies,查看您的哪些重复依赖项符合排除条件。

标签: android gradle android-studio proguard


【解决方案1】:

我在更新到 Android Gradle 插件 0.13 时遇到了同样的问题。我设法通过在我的build.gradle 文件中包含retrofit 来修复它:

compile('com.squareup.retrofit:retrofit:1.6.1') {
    exclude group: 'commons-io', module: 'commons-io'
}

编辑:并且可以同时对所有 retrofitrobospice 依赖项执行此操作:

compile('com.octo.android.robospice:robospice-retrofit:1.4.14') {
    exclude group: 'commons-io', module: 'commons-io'
}

它将自动获取所有底层依赖项(retrofitrobospice-corerobospice-cache,...)。

【讨论】:

  • 部分解决了!不过我会给你答案。真正的解决方案是将排除组应用于:改造和所有 robospice 部件(robospice 核心、缓存和改造插件)。非常感谢!我给你一杯咖啡!
  • 感谢您的咖啡 :p 您只需一个依赖即可完成此操作。请参阅我的答案中的第二部分。
  • 我仍然必须定义所有“排除组”或 gradle 拒绝工作!
  • 这确实有效,但我认为根本原因是构建系统中的错误。在适用于 Android 的 Gradle 插件中进行了适当的修复后,这些变通办法就不是必需的了,这应该可以正常工作。问题是我在一个模拟项目上重现这个问题,所以很难向 Googles Gradle Android 插件团队推票。
【解决方案2】:

我遇到了同样的问题。在我的情况下,我几个月没有进行构建,发现依赖 compile 'org.apache.commons:commons-io:1.3.2' 不再有效(尽管我猜这些 jars 仍然在我的本地存储库中)。

将其更改为 compile 'commons-io:commons-io:1.3.2' 后,proGuard 运行良好。

【讨论】:

  • 这是唯一对我有用的修复方法。 Gaetlan 没有解决问题。
  • 同样的情况,同样的修复。不明白。
  • 来源:This artifact was moved。感谢您为我指明正确的方向!原来还有一个新版本,在撰写本文时,lib 是 2.5
  • @CJS,请问你是如何“改变它”来编译 'commons-io:commons-io:1.3.2' 的?
【解决方案3】:

通过使用 CjS 答案,我能够解决这个问题。甚至 Gaetan Answer 也有效。

添加到这个 如果您的 compileSdkVersion 为 19(在我的情况下),我通过使用此解决了问题

compile ('org.apache.httpcomponents:httpmime:4.3'){
    exclude group: 'org.apache.httpcomponents', module: 'httpclient'
}
compile ('org.apache.httpcomponents:httpcore:4.4.1'){
    exclude group: 'org.apache.httpcomponents', module: 'httpclient'
}
compile 'commons-io:commons-io:1.3.2'

否则,如果您的 compileSdkVersion 为 23 然后使用

android {
useLibrary 'org.apache.http.legacy'
packagingOptions {
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE.txt'
    }
}

【讨论】:

    【解决方案4】:

    问题出在您正在使用的库中。

    在 gradle 文件中添加:

    android {
        packagingOptions {
            exclude 'META-INF/DEPENDENCIES'
            exclude 'META-INF/notice.txt'
            exclude 'META-INF/LICENSE.txt'
            exclude 'META-INF/MANIFEST.MF'
            exclude 'META-INF/LICENSE'
            exclude 'META-INF/NOTICE'
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 2018-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-25
      相关资源
      最近更新 更多