Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to resolve duplicated gradle Dependency issues

Tags:

I have tried to test my code with robolectric. Problem is that it has duplicated References. e.g.

java.lang.RuntimeException: java.lang.RuntimeException: Duplicate class org.apache.maven.artifact.Artifact found in modules maven-ant-tasks-2.1.3.jar (org.apache.maven:maven-ant-tasks:2.1.3) and maven-artifact-2.2.1.jar (org.apache.maven:maven-artifact:2.2.1) 

I have used the gradel artifact app:dependencies to get the following report. Here the important parts:

+--- org.robolectric:robolectric:4.3 |    +--- org.robolectric:annotations:4.3 |    +--- org.robolectric:junit:4.3 |    |    +--- org.robolectric:annotations:4.3 |    |    +--- org.robolectric:sandbox:4.3 |    |    |    +--- org.robolectric:annotations:4.3 |    |    |    +--- org.robolectric:utils:4.3 |    |    |    |    +--- org.robolectric:annotations:4.3 |    |    |    |    +--- org.robolectric:pluginapi:4.3 |    |    |    |    |    +--- org.robolectric:annotations:4.3 |    |    |    |    |    +--- org.apache.ant:ant:1.8.0 |    |    |    |    |    |    \--- org.apache.ant:ant-launcher:1.8.0 |    |    |    |    |    \--- org.apache.maven:maven-ant-tasks:2.1.3 |    |    |    |    |         +--- org.apache.ant:ant:1.8.0 (*) |    |    |    |    |         +--- classworlds:classworlds:1.1-alpha-2 |    |    |    |    |         +--- org.codehaus.plexus:plexus-container-default:1.0-alpha-9-stable-1 |    |    |    |    |         |    +--- org.codehaus.plexus:plexus-utils:1.0.4 -> 1.5.15 |    |    |    |    |         |    \--- classworlds:classworlds:1.1-alpha-2 |    |    |    |    |         +--- org.codehaus.plexus:plexus-utils:1.5.15 |    |    |    |    |         +--- org.codehaus.plexus:plexus-interpolation:1.11 |    |    |    |    |         +--- org.apache.maven:maven-artifact:2.2.1 |    |    |    |    |         |    \--- org.codehaus.plexus:plexus-utils:1.5.15 |    |    |    |    |         +--- org.apache.maven:maven-artifact-manager:2.2.1 |    |    |    |    |         |    +--- org.apache.maven:maven-repository-metadata:2.2.1 |    |    |    |    |         |    |    \--- org.codehaus.plexus:plexus-utils:1.5.15 |    |    |    |    |         |    +--- org.codehaus.plexus:plexus-utils:1.5.15 |    |    |    |    |         |    +--- org.apache.maven:maven-artifact:2.2.1 (*) |    |    |    |    |         |    +--- org.codehaus.plexus:plexus-container-default:1.0-alpha-9-stable-1 (*) |    |    |    |    |         |    +--- org.apache.maven.wagon:wagon-provider-api:1.0-beta-6 |    |    |    |    |         |    |    \--- org.codehaus.plexus:plexus-utils:1.4.2 -> 1.5.15 |    |    |    |    |         |    \--- backport-util-concurrent:backport-util-concurrent:3.1 |    |    |    |    |         +--- org.apache.maven:maven-model:2.2.1 |    |    |    |    |         |    \--- org.codehaus.plexus:plexus-utils:1.5.15 |    |    |    |    |         +--- org.apache.maven:maven-project:2.2.1 |    |    |    |    |         |    +--- org.apache.maven:maven-settings:2.2.1 |    |    |    |    |         |    |    +--- org.apache.maven:maven-model:2.2.1 (*) |    |    |    |    |         |    |    +--- org.codehaus.plexus:plexus-interpolation:1.11 |    |    |    |    |         |    |    +--- org.codehaus.plexus:plexus-utils:1.5.15 |    |    |    |    |         |    |    \--- org.codehaus.plexus:plexus-container-default:1.0-alpha-9-stable-1 (*) |    |    |    |    |         |    +--- org.apache.maven:maven-profile:2.2.1 |    |    |    |    |         |    |    +--- org.apache.maven:maven-model:2.2.1 (*) |    |    |    |    |         |    |    +--- org.codehaus.plexus:plexus-utils:1.5.15 |    |    |    |    |         |    |    +--- org.codehaus.plexus:plexus-interpolation:1.11 |    |    |    |    |         |    |    \--- org.codehaus.plexus:plexus-container-default:1.0-alpha-9-stable-1 (*) |    |    |    |    |         |    +--- org.apache.maven:maven-model:2.2.1 (*) |    |    |    |    |         |    +--- org.apache.maven:maven-artifact-manager:2.2.1 (*) |    |    |    |    |         |    +--- org.apache.maven:maven-plugin-registry:2.2.1 |    |    |    |    |         |    |    +--- org.codehaus.plexus:plexus-utils:1.5.15 |    |    |    |    |         |    |    \--- org.codehaus.plexus:plexus-container-default:1.0-alpha-9-stable-1 (*) |    |    |    |    |         |    +--- org.codehaus.plexus:plexus-interpolation:1.11 |    |    |    |    |         |    +--- org.codehaus.plexus:plexus-utils:1.5.15 |    |    |    |    |         |    +--- org.apache.maven:maven-artifact:2.2.1 (*) |    |    |    |    |         |    \--- org.codehaus.plexus:plexus-container-default:1.0-alpha-9-stable-1 (*) |    |    |    |    |         +--- org.apache.maven:maven-error-diagnostics:2.2.1 |    |    |    |    |         |    \--- org.codehaus.plexus:plexus-container-default:1.0-alpha-9-stable-1 (*) |    |    |    |    |         +--- org.apache.maven:maven-settings:2.2.1 (*) |    |    |    |    |         +--- org.apache.maven.wagon:wagon-file:1.0-beta-6 |    |    |    |    |         |    \--- org.apache.maven.wagon:wagon-provider-api:1.0-beta-6 (*) |    |    |    |    |         +--- org.apache.maven.wagon:wagon-http-lightweight:1.0-beta-6 |    |    |    |    |         |    +--- org.apache.maven.wagon:wagon-http-shared:1.0-beta-6 |    |    |    |    |         |    |    +--- nekohtml:xercesMinimal:1.9.6.2 |    |    |    |    |         |    |    +--- nekohtml:nekohtml:1.9.6.2 |    |    |    |    |         |    |    \--- org.apache.maven.wagon:wagon-provider-api:1.0-beta-6 (*) |    |    |    |    |         |    \--- org.apache.maven.wagon:wagon-provider-api:1.0-beta-6 (*) |    |    |    |    |         \--- org.apache.maven.wagon:wagon-provider-api:1.0-beta-6 (*) |    |    |    |    +--- org.robolectric:utils-reflector:4.3 |    |    |    |    |    +--- org.ow2.asm:asm:7.0 |    |    |    |    |    +--- org.ow2.asm:asm-commons:7.0 |    |    |    |    |    |    +--- org.ow2.asm:asm:7.0 |    |    |    |    |    |    +--- org.ow2.asm:asm-tree:7.0 |    |    |    |    |    |    |    \--- org.ow2.asm:asm:7.0 |    |    |    |    |    |    \--- org.ow2.asm:asm-analysis:7.0 |    |    |    |    |    |         \--- org.ow2.asm:asm-tree:7.0 (*) |    |    |    |    |    \--- org.ow2.asm:asm-util:7.0 |    |    |    |    |         +--- org.ow2.asm:asm:7.0 |    |    |    |    |         +--- org.ow2.asm:asm-tree:7.0 (*) |    |    |    |    |         \--- org.ow2.asm:asm-analysis:7.0 (*) |    |    |    |    +--- com.google.auto.service:auto-service:1.0-rc4 |    |    |    |    |    +--- com.google.auto:auto-common:0.8 |    |    |    |    |    |    \--- com.google.guava:guava:19.0 -> 27.0.1-jre |    |    |    |    |    |         +--- com.google.guava:failureaccess:1.0.1 |    |    |    |    |    |         +--- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava |    |    |    |    |    |         +--- com.google.code.findbugs:jsr305:3.0.2 |    |    |    |    |    |         +--- org.checkerframework:checker-qual:2.5.2 |    |    |    |    |    |         +--- com.google.errorprone:error_prone_annotations:2.2.0 |    |    |    |    |    |         +--- com.google.j2objc:j2objc-annotations:1.1 |    |    |    |    |    |         \--- org.codehaus.mojo:animal-sniffer-annotations:1.17 |    |    |    |    |    \--- com.google.guava:guava:23.5-jre -> 27.0.1-jre (*) |    |    |    |    +--- javax.inject:javax.inject:1 |    |    |    |    \--- javax.annotation:javax.annotation-api:1.3.2 |    |    |    +--- org.robolectric:shadowapi:4.3 |    |    |    |    \--- org.robolectric:annotations:4.3 |    |    |    +--- org.robolectric:utils-reflector:4.3 (*) |    |    |    +--- javax.annotation:javax.annotation-api:1.3.2 |    |    |    +--- javax.inject:javax.inject:1 |    |    |    +--- org.ow2.asm:asm:7.0 |    |    |    +--- org.ow2.asm:asm-commons:7.0 (*) |    |    |    \--- com.google.guava:guava:27.0.1-jre (*) |    |    +--- org.robolectric:pluginapi:4.3 (*) |    |    +--- org.robolectric:shadowapi:4.3 (*) |    |    \--- org.robolectric:utils-reflector:4.3 (*) |    +--- org.robolectric:pluginapi:4.3 (*) |    +--- org.robolectric:resources:4.3 |    |    +--- org.robolectric:utils:4.3 (*) |    |    +--- org.robolectric:annotations:4.3 |    |    +--- org.robolectric:pluginapi:4.3 (*) |    |    \--- com.google.guava:guava:27.0.1-jre (*) |    +--- org.robolectric:sandbox:4.3 (*) |    +--- org.robolectric:utils:4.3 (*) |    +--- org.robolectric:utils-reflector:4.3 (*) |    +--- org.robolectric:plugins-maven-dependency-resolver:4.3 |    |    +--- org.robolectric:pluginapi:4.3 (*) |    |    +--- org.robolectric:utils:4.3 (*) |    |    +--- org.apache.ant:ant:1.8.0 (*) |    |    \--- org.apache.maven:maven-ant-tasks:2.1.3 (*) |    +--- javax.inject:javax.inject:1 |    +--- javax.annotation:javax.annotation-api:1.3.2 |    +--- org.robolectric:shadows-framework:4.3 |    |    +--- org.robolectric:annotations:4.3 |    |    +--- org.robolectric:resources:4.3 (*) |    |    +--- org.robolectric:pluginapi:4.3 (*) |    |    +--- org.robolectric:shadowapi:4.3 (*) |    |    +--- org.robolectric:utils:4.3 (*) |    |    +--- org.robolectric:utils-reflector:4.3 (*) |    |    +--- androidx.test:monitor:1.2.0 -> 1.3.0-alpha02 (*) |    |    +--- com.almworks.sqlite4java:sqlite4java:0.282 |    |    +--- com.ibm.icu:icu4j:53.1 |    |    +--- com.google.android.apps.common.testing.accessibility.framework:accessibility-test-framework:2.1 |    |    |    +--- org.hamcrest:hamcrest-core:1.3 |    |    |    +--- org.hamcrest:hamcrest-library:1.3 (*) |    |    |    \--- com.google.protobuf:protobuf-java:2.6.1 |    |    \--- androidx.annotation:annotation:1.0.0 |    +--- org.bouncycastle:bcprov-jdk15on:1.52 |    \--- androidx.test:monitor:1.2.0 -> 1.3.0-alpha02 (*) 

How to resolve the reference error? It seems to me that robolectric has the same class in diffrent dependencies?

I use the following build script: apply plugin: 'com.android.application'

apply plugin: 'idea'  idea {     module {         downloadJavadoc = true         downloadSources = true     } } android {     compileSdkVersion 28     buildToolsVersion '28.0.3'     useLibrary 'org.apache.http.legacy'     useLibrary 'android.test.runner'      useLibrary 'android.test.base'     useLibrary 'android.test.mock'      defaultConfig {         applicationId "com.example.sampleapp"         minSdkVersion 16         targetSdkVersion 28         testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"     }      testOptions {         unitTests {             includeAndroidResources = true         }     } }  dependencies {     androidTestImplementation 'androidx.test:rules:1.2.0'     androidTestImplementation 'androidx.test:core:1.2.1-alpha02'     androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'     androidTestImplementation 'org.robolectric:robolectric:4.3'      // Mail-Versand     implementation 'com.sun.mail:android-mail:1.6.2'     implementation 'com.sun.mail:android-activation:1.6.2'      implementation 'androidx.appcompat:appcompat:1.0.2'//     implementation 'com.github.woxthebox:draglistview:1.6.6' } 

How to fix that?

Issue on github is open: https://github.com/robolectric/robolectric/issues/5235

like image 490
finder2 Avatar asked Aug 21 '19 14:08

finder2


People also ask

Where does Gradle get its dependencies?

Gradle can consume dependencies available in the local Maven repository. Declaring this repository is beneficial for teams that publish to the local Maven repository with one project and consume the artifacts by Gradle in another project. Gradle stores resolved dependencies in its own cache.

How do I override the dependency version of Child Gradle?

To override the version of a transitive dependency in Gradle, exclude it from the declared dependency that pulls it in, and then explicitly declare the version that you prefer to use in your build. gradle.


2 Answers

Finally get the test running. I've excluded all libs with duplicated classes:

testImplementation ("org.robolectric:robolectric:4.3"){     exclude group: 'org.apache.maven', module: 'maven-artifact'     exclude group: 'org.apache.maven', module: 'maven-artifact-manager'     exclude group: 'org.apache.maven', module: 'maven-model'     exclude group: 'org.apache.maven', module: 'maven-plugin-registry'     exclude group: 'org.apache.maven', module: 'maven-profile'     exclude group: 'org.apache.maven', module: 'maven-project'     exclude group: 'org.apache.maven', module: 'maven-settings'     exclude group: 'org.apache.maven', module: 'maven-error-diagnostics'     exclude group: "org.apache.maven.wagon" } 

Not all possibilities tested but a simple test worked already.

like image 51
finder2 Avatar answered Oct 24 '22 13:10

finder2


This probably could be written in more general way:

testImplementation ("org.robolectric:robolectric:4.3") {     exclude group "org.apache.maven.wagon"     exclude group "org.apache.maven" } 

or even:

testImplementation ("org.robolectric:robolectric:4.3") {     exclude group: "org.apache.maven", name: "maven-ant-tasks" } 

because it is maven-ant-tasks of pluginapi, which pulls in org.apache.maven dependencies.

like image 25
Martin Zeitler Avatar answered Oct 24 '22 14:10

Martin Zeitler