Gradle Plugin v0.13.1 后重复的 Zip 条目

Posted

技术标签:

【中文标题】Gradle Plugin v0.13.1 后重复的 Zip 条目【英文标题】:Duplicate Zip Entry after Gradle Plugin v0.13.1 【发布时间】: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.*)!

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

    Robospice 改造 OkHttp 飞镖 冰镐 黄油刀 面包丁 平滑进度条 NineoldsAndroid(在 BetterPickers 库中)

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

【问题讨论】:

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

【讨论】:

以上是关于Gradle Plugin v0.13.1 后重复的 Zip 条目的主要内容,如果未能解决你的问题,请参考以下文章

gradle上的cordova-plugin-googlemap后出错

gradle重复依赖终极方案解决办法

gradle-aws-plugin elasticbeanstalk 如何部署上传的版本

gradle docker plugin bmuschko 将 build.gradle 拆分为两个文件会出错

迁移到 Android Gradle Plugin 3.0 | 中文教学视频

破解Gradle Gradle Plugin技术及玩转transform