commons-logging defines classes that conflict with classes now provided by Android after Android Studio Update

23,461

Solution 1

Add to build.gradle located in app module

configurations {
    all {
        exclude module: 'httpclient'
    }
}

Solution 2

If the problem is with commons-logging then it must be excluded too. Add the following code in app/build.gradle

configurations {
    all {
        exclude module: 'httpclient'
        exclude module: 'commons-logging'
    }
}

Solution 3

Got the same issue. I have done below changes

 configurations {
    all{
        exclude group: 'commons-logging', module: 'commons-logging'
        exclude group: 'org.apache.httpcomponents'
    }
}


packagingOptions {
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/NOTICE'
    exclude 'org/apache/http/version.properties'
    exclude 'org/apache/http/client/version.properties'
}

Solution 4

You should replace "compile" with "implementation" as it's deprecated in the latest gradle and exlude "org.apache.httpcomponents" from Google api client libraries:

implementation('com.google.api-client:google-api-client-android:1.23.0') {
    exclude group: 'org.apache.httpcomponents'
}
implementation('com.google.http-client:google-http-client-gson:1.23.0') {
    exclude group: 'org.apache.httpcomponents'
}

this solution was found here: https://developers.google.com/google-apps/activity/v1/quickstart/android

Solution 5

Run in terminal, inside project folder:

./gradlew app:dependencies > dependencies.txt

Then check dependencies.txt to find who is using conflictive dependencies and act accordingly (check for updates, get rid of it, or use exclude as suggested by @Silverstorm)

Share:
23,461
AndreaF
Author by

AndreaF

Updated on March 24, 2022

Comments

  • AndreaF
    AndreaF about 2 years

    I have updated Android Studio to version 3 and now seems unable to compile my project previously compiled without errors.

    The error message is the follow

    Error:Error: commons-logging defines classes that conflict with classes now provided by Android. Solutions include finding newer versions or alternative libraries that don't have the same problem (for example, for httpclient use HttpUrlConnection or okhttp instead), or repackaging the library using something like jarjar. [DuplicatePlatformClasses]

    The dependencies are

    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        testCompile 'junit:junit:4.12'
        compile 'com.android.support:appcompat-v7:27.0.0'
        compile 'com.android.support:design:27.0.0'
        compile 'com.google.api-client:google-api-client-android:1.23.0' exclude module: 'httpclient'
        compile 'com.google.http-client:google-http-client-gson:1.23.0' exclude module: 'httpclient'
        compile 'com.google.firebase:firebase-core:11.4.2'
    }
    

    and error seems caused by

    compile 'com.google.api-client:google-api-client-android:1.23.0' exclude module: 'httpclient'
    compile 'com.google.http-client:google-http-client-gson:1.23.0' exclude module: 'httpclient'
    

    I already use exclude module: 'httpclient' So why It doesn't compile? Is this a bug of Android Studio 3 and\or included com.android.tools.build:gradle:3.0.0 plugin or I'm missing something? With the previous version no problem to compile exactly the same project.

    • CommonsWare
      CommonsWare over 6 years
      "So why It doesn't compile?" -- your problem is with commons-logging, based on the error. Perhaps there are newer versions of those com.google dependencies that you should be using.
    • AndreaF
      AndreaF over 6 years
      @CommonsWareI haven't find any newer library these versions are latest October 2017 releases
    • Gabriele Mariotti
      Gabriele Mariotti over 6 years
      Do you have same jars in libs folder?
    • AndreaF
      AndreaF over 6 years
      @GabrieleMariotti absolutely not. I haven't any jars in libs folder. The libraries are only specified in dependencies section in build.gradle (otherwise also the previous Android studio would have refused to build). For this reason I cannot figure why after Android Studio update won't compile.
  • Ramesh sambu
    Ramesh sambu over 6 years
    I am not able to get release apk if exclude httpclient
  • Silverstorm
    Silverstorm over 6 years
    @RameshSambu Have you placed the above code in the inner build.gradle of the app module?
  • Ramesh sambu
    Ramesh sambu over 6 years
    Yes I added like that
  • scionoftech
    scionoftech over 6 years
    you can find release apk at app/release
  • Pkmmte
    Pkmmte over 6 years
    You have just saved me from a major release crisis. Thank you!
  • Vahe Gharibyan
    Vahe Gharibyan over 6 years
    compile: compile library for each which contain current module. implementation: compile library for current module, that's mean implemented library not visible for "parent" modules
  • Narendra Singh
    Narendra Singh over 6 years
    In which tag, do I need to put that?
  • Silverstorm
    Silverstorm over 6 years
    @NerendraJi in configurations. If It's missing just copy paste the code that I have posted.
  • Stevey
    Stevey over 6 years
    What if I'm using httpclient? My code used to compile before upgrading to Android Studio 3.0. I'm actually using httpclient in my code, and I don't want to switch to okhttp.
  • Pravinsingh Waghela
    Pravinsingh Waghela over 6 years
    @user3562927 I am also facing and having the same issue as you are having. Did You got any solution for it, as in older version it was working. but after upggading Android Studio and Gradle it is not.
  • gbansal
    gbansal about 6 years
    configurations { all { exclude module: 'httpclient' exclude module: 'commons-logging' exclude group: 'org.json', module: 'json' exclude group: 'org.apache.httpcomponents' exclude module: 'opengl-api' exclude module: 'xmlParserAPIs' exclude module: 'xpp3' } } this works for me
  • ARLabs
    ARLabs about 6 years
    Ok, but how libraries that use httpclient would work without it? LVL library of Google depends on org.apache.http
  • khammami
    khammami almost 6 years
    but compile is deprecated in the new Android Studio so you'll get a warning to replace it with "implementation" or " api' & that depends on your need
  • kibitzerCZ
    kibitzerCZ almost 5 years
    @ARLabs @user3562927 @Pravinsingh-Waghela You need to provide some different httpclient library/wrapper. You could try this one - I was in the same situation yesterday and this library is the only solution that worked for me. You will only have to change all org.apache.http imports in your code to cz.msebera.android.httpclient.
  • Kirill Karmazin
    Kirill Karmazin almost 5 years
    Note: app:dependencies - here app is the name of your app module, for example myAwesomeApp
  • Muhammad Saqib
    Muhammad Saqib about 4 years
    this will exclude org.apache.http.client.HttpClient what if our code is already using this library?
  • srs
    srs about 4 years
    then you need to find that specific library which is causing this duplicate httpclient import and need to remove the transitive httpclient dependency from that specific library.
  • Muhammad Saqib
    Muhammad Saqib about 4 years
    in my case, org.apache.http.client.HttpClient was causing the conflict since android is now itself providing this library. Luckily, I found a clone github repo of org.apache.http.client.HttpClient with different name space which solved my problem.
  • Muhammad Saqib
    Muhammad Saqib about 4 years
    here is the clone, just in case if anyone want to use implementation group: 'cz.msebera.android', name: 'httpclient', version: '4.4.1.2'
  • Alex Lipov
    Alex Lipov almost 4 years
    Those classes are not exposed as public API, though they are used as part of implementation. To see an example of such conflict, check this issue.
  • Pratik Saluja
    Pratik Saluja over 2 years
    Where to put this code? In App or Project Level Gradle? @Raja Peela
  • Raja Peela
    Raja Peela over 2 years
    @PratikSaluja App level inside android {}
  • Pratik Saluja
    Pratik Saluja over 2 years
    Weird for me it worked outside of the android block.