当我在Android设备上尝试run
我的Android应用程序时,gradle控制台会报告以下错误:
Error:Execution failed for task ':app:transformClassesWithJarMergingForDebug'.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: com/loopj/android/http/AsyncHttpClient$1.class
当我搜索“AsyncHttpClient”类时,我发现它确实存在于两个不同的位置:
/Users/Afflatus/.gradle/caches/modules-2/files-2.1/com.loopj.android/android-async-http/1.4.9/5d171c3cd5343e5997f974561abed21442273fd1/android-async-http-1.4.9-sources.jar!/com/loopj/android/http/AsyncHttpClient.java
/Users/Afflatus/.ideaLibSources/android-async-http-1.4.9-sources.jar!/com/loopj/android/http/AsyncHttpClient.java
第一条路径似乎暗示它是一个“缓存”文件...所以我尝试了invalidating & restarting my cache
,但是在重建gradle之后这两个文件仍然存在,我尝试run
应用。我已经在备用posts中读到它可以通过删除其中一个文件来解决...所以我去了缓存位置并删除了在“1.4.9”文件夹中找到的所有文件...不幸重新打开Android Studio后,会创建一个新的缓存文件,我会收到同样的错误。
其他帖子(here,here,here和here)建议如果我将“./gradlew clean”添加到根目录,它会重建gradle再次只是为了运行(据我所知)。所以我也尝试过这样做:
这使我的应用程序的文件夹看起来像这样:
但不幸的是,这对我仍然得到同样错误的事情没有帮助。我究竟做错了什么?我该怎么办?
答案 0 :(得分:1)
因为你在libs
文件夹中添加了两次库,所以当libs
文件夹中有相同库的多个版本时,有时会发生这种情况。检查并删除任何重复的jar文件。
和第二个选项可能是您还在gradle.build
中添加了依赖项,并且在libs
文件夹中也有jar。
因此请检查这两个位置并删除重复的条目,然后再清除并再次构建APK
。
希望有所帮助
答案 1 :(得分:1)
删除libs
文件夹中具有重复jar扩展名的文件。但是,如果没有重复文件并且仍然存在"Duplicate classes"
错误,请在错误部分的“重复类....”子句的其余部分中查找名称。例如,"duplicated classes 'dagger' bla bla"
。从'dagger'
文件夹中删除名为libs
的文件。 (请注意不要通过shift删除它。)
答案 2 :(得分:0)
在我的情况下,我在我的gradle中使用了sensorocloud.jar
和compile 'com.loopj.android:android-async-http:1.4.9'
,这导致了与您相同的错误。因为sensoro cloud SDK使用了loopj' s async-http
。
我设法通过手动删除jar文件中的重复.class
文件来解决它。 (即
com.loopj.android
.class
个文件)(P.S。我试图通过网络搜索,看看我是否可以在gradle中排除某个类的jar,但没有成功,例如我引用了this SO post)
答案 3 :(得分:0)
有时重复类异常意味着您的一个依赖项隐式使用了您还在项目中使用的某些库的旧版本或更新版本(带有+),
要解决此问题,您可以将以下代码块(在'force'
之后放入库版本)添加到build.gradle
文件(Module:app)中:
configurations {
all {
resolutionStrategy {
// do not upgrade above 3.12.0 to support API < 21 while server uses
// COMPATIBLE_TLS, or okhttp3 is used in project
force 'com.squareup.okhttp3:okhttp:3.12.0'
force 'com.squareup.okhttp3:logging-interceptor:3.12.0'
}
}
}
您还可以从依赖项中排除某些组。 对于单个依赖项,您可以这样写:
dependencies {
// example
implementation('log4j:log4j:1.2.15') {
exclude group: 'javax.jms', module: 'jms'
}
}
经过测试,可以在具有Gradle插件版本3.4.2
和Gradle版本5.4.1
的Android Studio上使用。
感谢gradle org讨论组的Dimitar Dimitrov和SchalkCronjé
答案 4 :(得分:0)
检查您的项目是否 build.gradle。可能有一些 Maven 重复依赖
答案 5 :(得分:0)
此错误可能由多种原因引起;
答案 6 :(得分:0)
我将此行添加到我的 gradle.properties 文件并且我的应用程序运行了
android.enableJetifier=true