Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Duplicated classes found in modules classes.jar

Working with "Cxense SDK for Android", I'm getting the message of duplicated class:

Duplicate class android.support.v4.app.INotificationSideChannel found in modules classes.jar (**com.android.support:support-compat:27.1.1**) and classes.jar (**com.android.support:support-v4:22.2.0**)
Duplicate class android.support.v4.app.INotificationSideChannel$Stub found in modules classes.jar (com.android.support:support-compat:27.1.1) and classes.jar (com.android.support:support-v4:22.2.0) 
Duplicate class android.support.v4.app.INotificationSideChannel$Stub$Proxy found in modules classes.jar (com.android.support:support-compat:27.1.1) and classes.jar (com.android.support:support-v4:22.2.0) 
Duplicate class android.support.v4.app.ListFragment found in modules classes.jar (com.android.support:support-fragment:27.1.1) and classes.jar (com.android.support:support-v4:22.2.0) 
Duplicate class android.support.v4.app.ListFragment$1 found in modules classes.jar (com.android.support:support-fragment:27.1.1) and classes.jar (com.android.support:support-v4:22.2.0) 
Duplicate class android.support.v4.app.ListFragment$2 found in modules classes.jar (com.android.support:support-fragment:27.1.1) and classes.jar (com.android.support:support-v4:22.2.0) 
Duplicate class android.support.v4.app.LoaderManager found in modules classes.jar (com.android.support:support-fragment:27.1.1) and classes.jar (com.android.support:support-v4:22.2.0) 

This is my app level build.gradle configuration:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "com.tototita.cxensetestapp"
        minSdkVersion 15
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }


    packagingOptions {
        exclude 'META-INF/LICENSE'
    }
    compileOptions {
        sourceCompatibility = '1.8'
        targetCompatibility = '1.8'
    }


}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.1.1' 
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

     //**CXsense
     implementation 'com.cxpublic:cxense-android:1.0.1'
}

How could I avoid this duplicated classes that are surely contained in Cxense SDK?

like image 537
Jorgesys Avatar asked Jun 20 '19 23:06

Jorgesys


People also ask

What does duplicate class mean?

The "duplicate class" error can also occur when the class is named the same with the same package naming hierarchy, even if one of the classes exists in a directory structure with directory names different than the package names.


2 Answers

There are two ways to fix your issue.

  1. Excluding duplicated dependencies while implementation individually,

  2. Excluding duplicated dependencies from every implementations in generic way.

Let's first understand the problem :

Here, in your case artifact com.android.support is duplicated, because your app module uses version : 27.1.1 while your artifact com.cxpublic:cxense-android:1.0.1 is having internal dependency of com.android.support uses version : 22.2.0.

So, you should remove one of them manually (removing older or lower version is recommended). Let's try to remove it !


By first approach:

implementation ('com.cxpublic:cxense-android:1.0.1') {
    exclude group: "com.android.support", module: "support-v4"
}

Putting exclude for group com.android.support in our artifact com.cxpublic:cxense-android:1.0.1 will not get imported for support-v4 libraries when we use our implementation on this artifact.

So, issue would be resolved by manually putting this block to every artifact having this conflict.

By Second way:

We can remove included dependencies and replace them with one package with latest number. In our case, it is support-v4 with different version. So, go to the android block of app level build.gradle and put below block there to remove duplicated support-v4 from all artifacts, so that we can have distinct dependency.

android {
    // Some other stuffs
    configurations {
        all*.exclude module: 'support-v4' // This removes all other versions of `support-v4` if gets duplicated from all the artifacts.
    }
    // Rest of other stuffs
}
like image 78
Jeel Vankhede Avatar answered Oct 12 '22 14:10

Jeel Vankhede


If there are duplicates, use exclude:

implementation ('com.cxpublic:cxense-android:1.0.1') {
    exclude group: "com.android.support", module: "support-v4"
}

Or remove implementation 'com.android.support:appcompat-v7:27.1.1' in favour of support-v4.

See: https://discuss.gradle.org/t/how-do-i-exclude-specific-transitive-dependencies-of-something-i-depend-on/17991

like image 22
aucd29 Avatar answered Oct 12 '22 14:10

aucd29