Android Studio + Gradle: java.lang.IllegalArgumentException

У меня есть проект с Gradle и объявляю мои зависимости от build.gradle:

dependencies {
compile 'com.android.support:support-v4:18.0.0'
compile 'org.springframework.android:spring-android-rest-template:1.0.1.RELEASE'
compile 'org.springframework.android:spring-android-auth:1.0.1.RELEASE'
compile 'org.springframework.android:spring-android-core:1.0.1.RELEASE'
compile 'org.roboguice:roboguice:2.0'

}

Сборка с Gradle работает нормально, но при запуске моего проекта выдается следующая ошибка на этапе компиляции:

Gradle: UNEXPECTED TOP-LEVEL EXCEPTION:
Gradle: java.lang.IllegalArgumentException: already added: Lorg/springframework/util/FileCopyUtils;
Gradle: at com.android.dx.dex.file.ClassDefsSection.add(ClassDefsSection.java:122)
Gradle: at com.android.dx.dex.file.DexFile.add(DexFile.java:161)

Я использую Gradle 1.8.

2 ответа

Решение

Похоже, что несколько библиотек включают файлы основных библиотек; Я получаю немного другое исключение, когда делаю пример, но это та же причина. Если я открою вкладку " Внешние библиотеки ", чтобы посмотреть, какие jar-файлы используются, я вижу spring-android-core и spring-core, и если я открою их, чтобы увидеть, какие классы в них, я вижу, что оба содержат org.springframework.core.ErrorCoded (который является дублирующим классом в моем тестовом примере).

Представление проекта, показывающее добавленные библиотеки Spring

Вы не включаете пружинный стержень напрямую; он приходит как транзитивная зависимость из библиотеки spring-android-auth (если я включу только эти две библиотеки и опущу spring-android-rest-template, я все равно получу ошибку). Я попытался покопаться в определениях pom-файлов в Maven Central, чтобы попытаться доказать, почему это происходит, но я не уверен, что смогу дать вам объяснение, в котором не было много дыр, поэтому я буду молчать о этот фронт;-) Но у меня не будет недостатка понимания, чтобы помешать решить проблему. Если вы указываете зависимости spring-android-auth, чтобы исключить spring-core, она делает свое дело:

dependencies {
    ...
    compile 'org.springframework.android:spring-android-rest-template:1.0.1.RELEASE'
    compile('org.springframework.android:spring-android-auth:1.0.1.RELEASE') {
        exclude module: 'spring-core'
    }
    compile 'org.springframework.android:spring-android-core:1.0.1.RELEASE'
}

Я тоже сталкивался с этой ошибкой:

Execution failed for task ':app:packageDebug'.
> Duplicate files copied in APK META-INF/notice.txt
File 1: /Users/sbarta/.gradle/caches/modules-2/files-2.1/org.springframework.android/spring-android-auth/1.0.1.RELEASE/f43faebbf90aef324979a81a4f5eee1e3b95191f/spring-android-auth-1.0.1.RELEASE.jar
File 2: /Users/sbarta/.gradle/caches/modules-2/files-2.1/org.springframework.android/spring-android-auth/1.0.1.RELEASE/f43faebbf90aef324979a81a4f5eee1e3b95191f/spring-android-auth-1.0.1.RELEASE.jar

поэтому мне пришлось следовать инструкциям плагина Android Gradle 0.7.0: "дублировать файлы во время упаковки APK", чтобы исключить некоторые META-INF/ файлы из упаковки, и я добавил:

android {
    ...
    packagingOptions {
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
    }
}

Скотт Барта ответ точно правильно. Вот еще один способ глобально исключить определенные модули Spring в вашем build.gradle. Как и в случае любого решения, имеющего глобальные последствия, его следует использовать с осторожностью.

configurations.compile {
    exclude module: 'spring-core'
    exclude module: 'spring-web'
    exclude module: 'commons-logging'
}
Другие вопросы по тегам