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'
编辑:并且可以同时对所有 retrofit
和 robospice
依赖项执行此操作:
compile('com.octo.android.robospice:robospice-retrofit:1.4.14')
exclude group: 'commons-io', module: 'commons-io'
它将自动获取所有底层依赖项(retrofit
,robospice-core
,robospice-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-aws-plugin elasticbeanstalk 如何部署上传的版本
gradle docker plugin bmuschko 将 build.gradle 拆分为两个文件会出错