Reputation: 2452
When I try to run
my android application on an Android device, the gradle console reports the following error:
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
When I search for the "AsyncHttpClient" class, I see that it's indeed being found in two separate locations:
/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
The first path seems to suggest it's a "cache" file... so I've tried invalidating & restarting my cache
, but both files are still there after the gradle gets rebuilt and I try to run
the application. I've read in alternate posts that it can be resolved by deleting one of the files... So I went to the cache location and deleted all the files found in the "1.4.9" folder... unfortunantly after reopening Android Studio, a new cache file gets created and I get the same error.
Other posts (here, here,here, and here) suggest if I add "./gradlew clean" to the root directory it would rebuild the gradle again just for the run (as far as I understand). So I tried doing that as well:
Which made my app's folder look like this:
But unfortunantly, that didn't help things I still get the same error. What am I doing wrong? What should I be doing?
Upvotes: 35
Views: 155349
Reputation: 37
For me, I hadn't updated the dependencies, after I updated my gradle version. The IDE was suggesting I do it for most of them in the build.gradle (app) and it fixed it. (I hover over the suggestion and in the prompt I select the automatic update for all of the dependencies.
Upvotes: 0
Reputation: 527
I added this line to my gradle.properties
file and my app worked
android.enableJetifier=true
Upvotes: 36
Reputation: 14835
That's because you have added some library two times in libs
folder, this could happen sometimes when you have multiple versions of the same library in the libs
folder. Check it and remove any duplicate jar files.
And the second option could be you have also added the dependency in gradle.build
and also have a jar in libs
folder.
So check both places and remove duplicate entries and then clean and build APK
again.
Upvotes: 10
Reputation: 1702
Here's another situation that can cause duplicate class during the mergeDexClasses task. This can happen with later versions of android gradle.
If your build.gradle.kts script has a dependency in the form:
implementation(project(":mylib", configuration="default"))
that can cause duplicate classes. The correction is simple. Just change it to:
implemenation(project(:mylib"))
In an older version of AGP, I ran into a problem where adding the configuration value "default" fixed some issue I was having. Well that no longer works, and adding the "default" configuration you can get duplicate classes.
Upvotes: -1
Reputation: 15
This error can be caused by several things;
Upvotes: 0
Reputation: 320
Check if your project build.gradle. There it might be some maven duplicate dependency
Upvotes: -1
Reputation: 308
Delete files with duplicate jar extensions in the libs
folder. However, if there are no duplicate files and there is still a "Duplicate classes"
error, look for the name in the rest of the "Duplicate classes ...." clause in the error section. For example, "duplicated classes 'dagger' bla bla"
. Delete the file named 'dagger'
from the libs
folder. (Be careful not to delete it with shift.)
Upvotes: 3
Reputation: 1751
Sometimes duplicate classes exception means that one of your dependencies uses implicitly the older or newer (with +) version of some library you also use in your project,
To resolve this issue you may add such block of code (put your library version after 'force'
) to your build.gradle
file (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'
}
}
}
You may also exclude some group from your dependencies. For a single dependency you way write:
dependencies {
// example
implementation('log4j:log4j:1.2.15') {
exclude group: 'javax.jms', module: 'jms'
}
}
Tested to work on Android Studio with Gradle Plugin version 3.4.2
and Gradle version 5.4.1
.
Credits go to Dimitar Dimitrov and Schalk Cronjé from gradle org discussion group
Upvotes: 21
Reputation: 6011
In my case, I am using sensorocloud.jar
and the compile 'com.loopj.android:android-async-http:1.4.9'
in my gradle which caused the same error as yours. Because sensoro cloud SDK used loopj's async-http
.
I managed to solve it by manually removing the duplicate .class
files in the jar file. (i.e.
com.loopj.android
.class
files)(P.S. I have tried to search through the web to see if I could exclude certain class of a jar in gradle, but not succeed, e.g. I referenced this SO post)
Upvotes: 2