Hi, I’m currently running into a gradle/runtime cl...
# multiplatform
b
Hi, I’m currently running into a gradle/runtime classpath/dependency problem and I hope you can shed some light on this, please. When running the task shared:connectedAndroidTest it fails due to duplicate classes:
Copy code
Execution failed for task `:shared:checkDebugAndroidTestDuplicateClasses`
> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable
   > Duplicate class com.sun.jna.AltCallingConvention found in modules jna-5.8.0 (net.java.dev.jna:jna:5.8.0) and jna-5.8.0-runtime (net.java.dev.jna:jna:5.8.0)
     Duplicate class com.sun.jna.Callback found in modules jna-5.8.0 (net.java.dev.jna:jna:5.8.0) and jna-5.8.0-runtime (net.java.dev.jna:jna:5.8.0)
... (more lines like these follow) A scan reveals that on debugAndroidTestRuntimeClasspath the same dependency is present twice: net.java.dev.jnajna5.8.0 net.java.dev.jnajna{strictly 5.8.0} The dependency in question comes into play in 
build.gradle.kts (:shared)
Copy code
kotlin {
    android()
    sourceSets {
        val commonMain by getting {
            dependencies {
                ...
                api("io.github.matrixkt:olm:$matrix_kt_version") {
                   // android target will pick up "aar" version instead (see below)
                        exclude(group = "net.java.dev.jna", module = "jna")
                }
            }
        }
        val androidMain by getting {
            dependencies {
                    ...
                    
                    implementation("net.java.dev.jna:jna:5.8.0@aar")
            }
        }
...
This can be resolved by
Copy code
kotlin {
    android()
    sourceSets {
        val commonMain by getting {
            dependencies {
...
                // have this on the compile classpath only and let the final targets take care of the runtime classpath
                compileOnly("io.github.matrixkt:olm:$matrix_kt_version")
            }
        }
        val androidMain by getting {
            dependencies {
...
                if (isConnectedAndroidTest() == false) {
                    api("io.github.matrixkt:olm:$matrix_kt_version") {
                        exclude(group = "net.java.dev.jna", module = "jna")
                    }
                    implementation("net.java.dev.jna:jna:5.8.0@aar")
                }
            }
        }
        val androidTest by getting {
            dependencies {
...
                if (isConnectedAndroidTest()) {
                    api("io.github.matrixkt:olm:$matrix_kt_version") {
                        exclude(group = "net.java.dev.jna", module = "jna")
                    }
                    implementation("net.java.dev.jna:jna:5.8.0@aar")
                }
            }
...

fun isConnectedAndroidTest(): Boolean {
    val tasks = gradle.startParameter.taskNames
    val instrumentedTests = listOf("connectedAndroidTest", "connectedCheck", "connectedDebugAndroidTest")
    return !tasks.intersect(instrumentedTests).isEmpty()
}
But this does not feel right at all. Please help.