Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Kotlin fails to compile a library

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.

like image 406
theapache64 Avatar asked Mar 17 '18 03:03

theapache64


People also ask

Which compiler is used for Kotlin?

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?

What does Kotlin compile down to?  When targeting the JVM, Kotlin produces Java compatible bytecode. When targeting JavaScript, Kotlin transpiles to ES5.

Is Kotlin interoperable with Java?

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.

Is Kotlin compatible with Java libraries?

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.


1 Answers

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

like image 151
lelloman Avatar answered Oct 07 '22 01:10

lelloman