我有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。
答案 0 :(得分:5)
看起来多个库包含核心库文件;当我制作一个示例案例时,我得到了一个稍微不同的异常,但这是相同的原因。如果我打开外部库选项卡查看它正在使用的罐子,我会看到 spring-android-core 和 spring-core ,以及如果我打开它们以查看其中的类,我看到它们都包含org.springframework.core.ErrorCoded
(在我的测试用例中是重复的类)。
您不直接包含 spring-core ;它来自 spring-android-auth 库的传递依赖(如果我只包含那两个库并省略 spring-android-rest-template 我仍然得到错误)。我尝试挖掘Maven Central中的pom文件定义以试图证明它为什么会发生,但我不确定我能给你一个没有很多漏洞的解释,所以我会保持安静前面;-)但我不会缺乏理解妨碍尝试解决问题。如果你告诉 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 plugin 0.7.0: "duplicate files during packaging of APK"的说明从包装中排除一些META-INF /文件,我补充道:
android {
...
packagingOptions {
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
}
}
答案 1 :(得分:0)
configurations.compile {
exclude module: 'spring-core'
exclude module: 'spring-web'
exclude module: 'commons-logging'
}