Benjamin Helbig
11/29/2021, 1:40 PMExecution 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)
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
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.