编译我的应用程序时,出现以下错误(路径的敏感部分已编辑出来)
Execution failed for task ':app:proguardDebug'.
> java.io.IOException: Can't write [/projects/app/build/intermediates/classes-proguard/debug/classes.jar] (Can't read [/.gradle/caches/modules-2/files-2.1/commons-codec/commons-codec/1.4/4216af16d38465bbab0f3dff8efa14204f7a399a/commons-codec-1.4.jar(;;;;;;!META-INF/MANIFEST.MF)] (Duplicate zip entry [commons-codec-1.4.jar:org/apache/commons/codec/binary/Base64.class]))
这向我表明编译器会看到应用程序尝试使用commons.codec.binary.Base64.class作为依赖项的两个位置。我再次检查并检查了我的库,但只有一个库(亚马逊AWS)正在尝试使用它。
在这个错误之上,我收到了一些警告,这些警告也为我引起了一个红旗:
Warning:can't write resource [META-INF/LICENSE.txt] (Duplicate zip entry [commons-lang3-3.1.jar:META-INF/LICENSE.txt])
Warning:can't write resource [META-INF/NOTICE.txt] (Duplicate zip entry [commons-lang3-3.1.jar:META-INF/NOTICE.txt])
Warning:can't write resource [META-INF/LICENSE.txt] (Duplicate zip entry [commons-codec-1.4.jar:META-INF/LICENSE.txt])
Warning:can't write resource [META-INF/NOTICE.txt] (Duplicate zip entry [commons-codec-1.4.jar:META-INF/NOTICE.txt])
我根本没有明确地在我的应用程序中使用commons-codec-1.4或commons-lang3-3.1,以为我以后在删除之前使用lang3。为什么在编译日志中引用它们?我的一个maven图书馆可以使用它们吗?我将在gradle文件中包含下面的maven库列表。
以下是我的proguard和gradle文件供参考:
ProGuard的
-keep class org.w3c.dom.bootstrap.** { *; }
-keep class org.joda.time.** { *; }
-keep class com.facebook.** { *; }
-keep class org.apache.commons.** { *; }
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable
-dontwarn org.codehaus.jackson.map.ext.**
-dontwarn oauth.**
-dontwarn com.amazonaws.**
-dontwarn org.joda.time.**
-dontwarn org.apache.commons.codec.**
-dontwarn com.fasterxml.jackson.databind.ext.**
摇篮
apply plugin: 'com.android.application'
android {
compileSdkVersion 20
buildToolsVersion '20.0.0'
defaultConfig {
applicationId 'com.my.package'
minSdkVersion 14
targetSdkVersion 20
versionCode 9
versionName '1.2'
}
buildTypes {
release {
debuggable false
runProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
debug {
debuggable true
runProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
lintOptions {
checkReleaseBuilds false
}
packagingOptions {
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/MANIFEST.MF'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
//noinspection GradleDependency
compile 'com.google.android.gms:play-services:5.0.89'
compile 'com.nineoldandroids:library:2.4.0'
compile 'com.viewpagerindicator:library:2.4.1@aar'
compile 'se.emilsjolander:StickyScrollViewItems:1.1.0'
compile 'se.emilsjolander:stickylistheaders:2.5.0'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.2'
compile project(':facebook')
compile 'com.tumblr:jumblr:0.0.10'
compile 'com.android.support:support-v4:20.0.0'
}
我最好的猜测是这些库中的一个或多个使用apache lang3和codec作为它们自己的依赖项,这在编译应用程序时会导致冲突。这个问题只发生在我将亚马逊作为必需的jar包含时,所以我知道这在某种程度上是罪魁祸首,但我不知道还有什么与之相冲突。
我读了一些关于在proguard中使用-injars的内容,但根据他们的文档,Android不需要你使用它。
非常感谢任何建议,谢谢!
答案 0 :(得分:2)
我不确定这是否会对您有所帮助,但我会在此处发布我的答案以防其他人认为这有用。我的问题是我的依赖项声明中有2个引用。我使用的是Universal Image Loader库,我的陈述看起来像这样:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.1.1'
compile 'com.android.support:support-v4:22.1.1'
compile 'uk.co.chrisjenx:calligraphy:2.0.2'
/* UIL was the failing reference */
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3'
compile 'com.google.android.gms:play-services:7.3.0'
}
我意识到这个问题(在头颅之后)是我已经通过libs
文件夹引用了UIL(即它已经被语句compile fileTree(dir: 'libs', include: ['*.jar'])
编译了。所以它是通过libs
编译一次,然后通过显式调用编译对UIL的引用。我删除了显式调用并清除了错误。也许你在libs
目录中调用的东西也包含对违规库的引用然后当它尝试编译AWS服务时,它已经有了一个版本的公共库和pukes。
答案 1 :(得分:0)
此问题的原因是jar文件的重复。
在项目目录中,尝试查找和删除
/projects/app/build/intermediates/classes-proguard/debug/classes.jar](无法阅读[/。gradle / caches / modules-2 / files-2.1 / commons-codec / commons-codec / 1.4 / 4216af16d38465bbab0f3dff8efa14204f7a399a /公地编解码器-1.4.jar
此jar文件,看看是否有任何变化。此外,如果在相同或更高的目录中存在commons-lang3-3.1.jar,请尝试删除并重建。
希望它有所帮助!