Ошибка ввода-записи Commons-Io при использовании Robospice и Android Studio

Я работал над следующей проблемой в течение нескольких часов, но не нашел способа решить мою проблему. Я попробовал следующие исправления из Stack Overflow ( обновление Android Studio до 1.0 повреждает MultiDex и Duplicate Zip Entry после 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 зависимые приложения: зависимости" для просмотра дерева зависимостей проекта указывает, что 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

Зависимость по-прежнему указана, хотя я исключил commons-io из всех зависимостей, связанных с Robospice, в файле сборки gradle. Я также попытался изменить имя группы с commons-io на org.apache.commons, но это тоже не сработало.

Мой проект остановлен, пока я не решу эту проблему, и я был бы признателен за любую помощь, которую я могу получить.

2 ответа

Решение

Это известная и исправленная проблема в Robospice, вызванная основной проблемой Gradle 2.1: https://github.com/stephanenicolas/robospice/issues/365. Исправление будет выпущено в следующей версии.

Вы можете обойти это, исключив org.apache.commons:commons-io от всех зависимостей Robospice, и включают в себя 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'

Теперь вы готовы идти.

Другие вопросы по тегам