There's this library I created to report exceptions via email. It works well with the Android Java project but fails with Android Kotlin. When I add the compile script for the libary (compile 'com.theah64.bugmailer:bugmailer:1.1.9')
and tries to build the APK, am getting below error.
Error:Execution failed for task ':app:transformDexArchiveWithExternalLibsDexMergerForDebug'.
> com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex
This is my app's build.gradle file
apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' android { compileSdkVersion 27 defaultConfig { applicationId "com.theapache64.calculator" minSdkVersion 15 targetSdkVersion 27 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true } buildTypes { release { minifyEnabled false multiDexEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } dexOptions { preDexLibraries = false javaMaxHeapSize "4g" } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" implementation 'com.android.support:appcompat-v7:27.0.2' implementation 'com.android.support.constraint:constraint-layout:1.0.2' implementation 'com.android.support:design:27.0.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' compile 'com.theah64.bugmailer:bugmailer:1.2.0' }
I've googled a lot and tried the multiDexEnabled
solution. but it doesn't work.
The Kotlin compiler for JVM compiles Kotlin source files into Java class files. The command-line tools for Kotlin to JVM compilation are kotlinc and kotlinc-jvm . You can also use them for executing Kotlin script files.
What does Kotlin compile down to? When targeting the JVM, Kotlin produces Java compatible bytecode. When targeting JavaScript, Kotlin transpiles to ES5.
Kotlin is designed with Java interoperability in mind. Existing Java code can be called from Kotlin in a natural way, and Kotlin code can be used from Java rather smoothly as well.
Yes. Kotlin provides Java language interoperability. This is a design that allows Kotlin code to transparently call Java language methods, coupled with annotations that make it easy to expose Kotlin-only functionality to Java code.
The problem you are having is caused by conflicting dependencies, 2 of your dependencies are defining the same classes. If you try to compile with
./gradlew --stacktrace app:assembleDebug
You would see this error
Caused by: com.android.dex.DexException: Multiple dex files define Lorg/intellij/lang/annotations/MagicConstant;
Now, you can analyze all the dependency trees with
./gradlew app:dependencies
And see these (simplified here):
+--- com.theah64.bugmailer:bugmailer:1.2.0
| +--- org.jetbrains:annotations-java5:15.0
and
+--- org.jetbrains.kotlin:kotlin-stdlib:1.2.30
| \--- org.jetbrains:annotations:13.0
So, both Kotlin std lib and bugmailer are using org.jetbrains annotation, but from 2 different modules. This causes a problem because the same class (MagicConstant in that case) is being defined twice, I think that the duplicate entries would be even more.
The solution would be to exclude one of the 2 transitive dependencies, for instance
compile('com.theah64.bugmailer:bugmailer:1.2.0') {
exclude group: 'org.jetbrains', module: 'annotations-java5'
}
You will be able to compile the app, but, keep in mind that this solution is based on the assumption that bugmailer will work just fine with org.jetbrains:annotations:13.0
instead of org.jetbrains:annotations-java5:15.0
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With