在Android中,Dex异常多个dex文件定义。

3
在我的Android项目中,我使用了两个JAXB库jaxp-ri(用于XMLGregorianCalendarImpl类)和jaxb-api(用于对象到XML转换)。我已经在build.gradle文件中添加了这两个库。但是当我构建我的项目时,出现了以下错误提示。
Error:Error converting bytecode to dex:
Cause: com.android.dex.DexException: Multiple dex files define Ljavax/xml/stream/events/Namespace;
Error:com.android.dex.DexException: Multiple dex files define Ljavax/xml/stream/events/Namespace;
Error:  at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:661)
Error:  at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:616)
Error:  at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:598)
Error:  at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171)
Error:  at com.android.dx.merge.DexMerger.merge(DexMerger.java:198)
Error:  at com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCallable.java:61)
Error:  at com.android.builder.dexing.DexArchiveMergerCallable.call(DexArchiveMergerCallable.java:36)
Error:  at java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.java:1424)
Error:  at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
Error:  at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
Error:  at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
Error:  at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:157)
Error:Execution failed for task ':app:transformDexArchiveWithDexMergerForDebug'.
> com.android.build.api.transform.TransformException: com.android.dex.DexException: Multiple dex files define Ljavax/xml/stream/events/Namespace;

Build.gradle文件

dependencies {

    implementation fileTree(include: ['*.jar'], dir: 'libs')

    implementation 'com.android.support:appcompat-v7:26.0.0-beta1'

    implementation 'com.android.support.constraint:constraint-layout:1.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 group: 'com.sun.org.apache', name: 'jaxp-ri', version: '1.4'

    compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.1'

}

可以有人帮忙解决这个问题吗?我该怎么解决呢?
编辑
完整的build.gradle文件
android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "in.cdac.xmlparsing"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        multiDexEnabled true
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:26.0.0-beta1'
    implementation 'com.android.support.constraint:constraint-layout:1.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 group: 'com.sun.org.apache', name: 'jaxp-ri', version: '1.4'
    compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.1'
}

你的项目中只有这一个 build.gradle 文件吗? - Kelevandos
你的最低SDK版本是多少? - Asutosh Panda
@Kelevandos,这是app目录下的build.gradle文件,而项目目录中有一个常规的build.gradle文件。 - Sathish
@AsutoshPanda 最低 SDK 版本为 15,现在我已经在问题部分提供了完整的 Gradle 文件内容。 - Sathish
2个回答

5

只需在模块级别的build.gradle中声明multiDexEnabled true,仅适用于您的minSdkVersion设置为21或更高版本。

如果您的minSdkVersion低于21,则除了上述步骤外,还需要将multidex支持库作为依赖项。

dependencies {
  compile 'com.android.support:multidex:1.0.1'
}

你可以在这里阅读详细信息 - https://developer.android.com/studio/build/multidex.html

当我再次将所需的依赖项添加到build.gradle(模块应用程序)中时,它会抛出相同的DexException 编译组:'javax.xml.bind',名称:'jaxb-api',版本:'2.1' 和 编译组:'com.sun.org.apache',名称:'jaxp-ri',版本:'1.4' - Sathish
谢谢,这解决了使用JAR添加依赖项而不是使用Gradle脚本的问题。 - Sathish

2
使用以下build.gradle(Module:app)文件,您可以添加所需的依赖项。
apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.2"
    defaultConfig {
        applicationId "com.example.administrator.firstproject"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled = true
        dexOptions {
            javaMaxHeapSize "4g"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:26.+'

    implementation 'com.android.support.constraint:constraint-layout:1.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'
    // viewslider dependancies
    compile 'com.android.support:support-annotations:26.+'
    compile 'com.android.support:support-compat:26.+'
    compile 'com.android.support:support-core-ui:26.+'
    compile 'com.android.support:multidex:1.0.1'
    implementation files('libs/poi-3.7.jar')


}

当我再次将所需的依赖项添加到build.gradle(模块应用程序)中时,它仍会抛出相同的DexExceptioncompile group: 'javax.xml.bind',name:'jaxb-api',version:'2.1'和compile group: 'com.sun.org.apache',name:'jaxp-ri',version:'1.4' - Sathish
谢谢,这解决了使用JAR而非Gradle脚本添加依赖项的问题。 - Sathish

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接