1

我有我的 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。

4

2 回答 2

5

看起来多个库都包含核心库文件;当我制作一个示例案例时,我得到了一个稍微不同的异常,但这是相同的原因。如果我打开External Libraries选项卡来查看它正在使用的 jar,我会看到spring-android-corespring-core,如果我打开它们以查看其中包含哪些类,我会看到它们都包含org.springframework.core.ErrorCoded(即我的测试用例中的重复类)。

显示添加的 Spring 库的项目视图

您没有直接包含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 插件 0.7.0 中的说明:“在打包 APK 期间重复文件”以从打包中排除一些 META-INF/ 文件,我添加了:

android {
    ...
    packagingOptions {
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
    }
}
于 2014-03-07T16:59:09.600 回答
0

Scott Barta 的回答完全正确。这是在 build.gradle 中全局排除某些 Spring 模块的另一种方法。与任何具有全局影响的解决方案一样,应谨慎使用。

configurations.compile {
    exclude module: 'spring-core'
    exclude module: 'spring-web'
    exclude module: 'commons-logging'
}
于 2014-08-14T10:03:29.560 回答