10

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.

2

1 Answer 1

7
+50

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

Sign up to request clarification or add additional context in comments.

3 Comments

Wonderful explanation. (y)
@theapache64 I just realized that you are the owner of bugmailer isn't it? I might have dropped you an email then loool :)
haha :D, yeah that's one of my projects. I've fixed the library. Thank you so much.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.