使用 Robospice 和 Android Studio 的 Commons-Io 重复输入错误

Commons-Io Duplicate Entry Error Using Robospice and Android Studio

我已经在以下问题上工作了几个小时,但还没有想出解决问题的方法。我尝试了 Stack Overflow (Android Studio update to 1.0 corrupts MultiDex and Duplicate Zip Entry after Gradle Plugin v0.13.1) 中的以下修复程序,但没有一个有效。

我在尝试构建我的程序时遇到以下错误:

Execution failed for task ':app:packageAllDebugClassesForMultiDex'.
> java.util.zip.ZipException: duplicate entry: org/apache/commons/io/CopyUtils.class

错误似乎表明 commons-io 在构建过程中被包含了两次

我正在使用 Android Studio 和 Gradle 来包含多个 Robospice 依赖项。这是我的 Gradle 构建文件的依赖项部分:

dependencies {
    compile 'com.android.support:multidex:1.0.1'
    compile 'com.android.support:support-v4:21.0.3'
    compile 'com.google.android.gms:play-services:6.5.87'

    compile'com.google.api-client:google-api-client-android:1.19.0'


    // You must install or update the Google Repository through the SDK manager to use this dependency.
    // The Google Repository (separate from the corresponding library) can be found in the Extras category.
    //compile 'com.google.android.gms:play-services:4.3.23'
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile "com.jakewharton:butterknife:${butterknifeVersion}"
    compile 'com.sun.jersey:jersey-bundle:1.8'
    compile 'com.google.code.gson:gson:2.3'
    compile 'org.codehaus.jackson:jackson-core-asl:1.9.0'
    compile 'org.codehaus.jackson:jackson-mapper-asl:1.9.0'

    compile ('com.octo.android.robospice:robospice:1.4.14'){
        exclude module: 'commons-io'
        exclude group: 'commons-io'
    }

    compile ('com.octo.android.robospice:robospice-spring-android:1.4.14'){
        exclude group: 'org.apache.commons', module: 'commons-io'
    }

    compile 'com.squareup.okhttp:okhttp:2.1.0'

    compile ('com.octo.android.robospice:robospice-google-http-client:1.4.14'){
        exclude module: 'xpp3'
        exclude group: 'stax'
    }

    compile 'org.scribe:scribe:1.3.5'
    compile files("$buildDir/native-libs/native-libs.jar")

}

使用"gradlew -q dependencies app:dependencies"命令查看项目的依赖树发现com.octo.android.robospice:robospice:1.4.14依赖commons-io库。这是项目依赖关系树的相关片段:

+--- com.octo.android.robospice:robospice:1.4.14
|    \--- com.octo.android.robospice:robospice-cache:1.4.14
|         +--- org.apache.commons:commons-lang3:3.3.2
|         \--- org.apache.commons:commons-io:1.3.2
|              \--- commons-io:commons-io:1.3.2

尽管我在 gradle 构建文件中从所有与 Robospice 相关的依赖项中排除了 commons-io,但依赖项仍然列出。我还尝试将组名从 commons-io 更改为 org.apache.commons,但也没有用。

在我解决这个问题之前,我的项目处于停顿状态,如果能得到任何帮助,我将不胜感激。

这是 Robospice 中已知且已修复的问题,由潜在的 Gradle 2.1 问题引起:https://github.com/stephanenicolas/robospice/issues/365。该修复程序将在下一个版本中发布。

您可以通过从 所有 Robospice 依赖项中排除 org.apache.commons:commons-io 并手动包含 commons-io:commons-io:1.3.2 来解决此问题。像这样:

// workaround (https://github.com/stephanenicolas/robospice/issues/365)
// remove when robospice updates to 1.4.15+
compile ('com.octo.android.robospice:robospice-retrofit:1.4.14') {
    exclude group: 'org.apache.commons', module: 'commons-io'
}
compile ('com.octo.android.robospice:robospice-ormlite:1.4.14') {
    exclude group: 'org.apache.commons', module: 'commons-io'
}
compile 'commons-io:commons-io:1.3.2'

我想这个问题需要一种结构化的方法来解决上述两个答案都未能提供的问题。

第 1 步:找出导致重复 zip 条目的外部库。 运行 按照来自 Android Studio 终端的命令。 gradlew -q dependencies app:dependencies

在我的例子中,图像拾取库 ('net.yazeed44.imagepicker:imagepicker:1.3.0') 导致了重复条目。

第 2 步:添加代码以仅针对该库排除 commons-io

compile ('net.yazeed44.imagepicker:imagepicker:1.3.0'){
        exclude group: 'org.apache.commons', module: 'commons-io'
}  

第 3 步:包括更新的 commons-io 库。 compile 'commons-io:commons-io:1.3.2'

现在您可以开始了。