4

Я работаю над следующей проблемой в течение нескольких часов, но не придумал способ решить мою проблему. Я пробовал следующие исправления из Stack Overflow (Android Studio update to 1.0 corrupts MultiDex и Duplicate Zip Entry after Gradle Plugin v0.13.1), но ни один из них не работал.Ошибка записи в Commo-Io с использованием Robospice и Android Studio

Я получаю следующее сообщение об ошибке при попытке построить свою программу:

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

ошибка, кажется, указывает, что Обще-ю в настоящее время в два раза включается в процесс сборки

Я использую 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 

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

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

+0

Этот ответ может помочь решить вашу проблему [Reply_Link] (http://stackoverflow.com/a/43862686/2599596) –

ответ

11

Это известная проблема с 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' 
+0

Да, это сработало. Я видел, что это связано, но я думаю, что я никогда полностью не реализовал это решение. – reggie3

+0

@nekojsi Я получаю ** Метод Gradle DSL не найден: 'complie()' **, когда я это делаю. Мне нужна срочная помощь, пожалуйста! – Aerim

+0

См. Http://stackoverflow.com/questions/27617687/gradle-dsl-method-not-found-compile об этой проблеме. – nekojsi

0

Я думаю, что этот вопрос нуждается в структурированном подходе к решению проблемы, которую оба из вышеперечисленных ответов не дают.

Шаг 1: Узнайте, какая внешняя библиотека вызывает двойную запись ZIP. Выполните следующую команду с терминала Android Studio. gradlew -q dependencies app:dependencies

В моем случае библиотека для выбора изображений ('net.yazeed44.imagepicker: imagepicker: 1.3.0') вызывала дублируемую запись.

Шаг 2: Добавьте код, чтобы исключить Викисклада Io только для этой библиотеки

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

Шаг 3: Включить обновленный Викисклада И.О. библиотеку. compile 'commons-io:commons-io:1.3.2'

Теперь вы готовы к работе.