0

在 Android Studio 0.8.2 上,我正在尝试使用 Spring 创建一个与 Twitter 集成的应用程序。有无数的构建问题,直到我创建了一个空白活动,我只是使用测试我的 Gradle 构建。

每次我尝试连接到 spring-social-twitter 时,构建都会失败。如果我注释掉 Twitter 依赖项,应用程序就会编译。我很确定这与应用程序本身无关,因为我正在一个空白应用程序上对其进行测试。

我究竟做错了什么?

我的 build.gradle 文件:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 20
    buildToolsVersion "20.0.0"

    defaultConfig {
        applicationId "com.example.testapplication"
        minSdkVersion 8
        targetSdkVersion 20
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    packagingOptions {
        exclude 'META-INF/ASL2.0'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/notice.txt'
    }
}

configurations.compile {
    exclude module: 'spring-core'
    exclude module: 'spring-web'
    exclude module: 'commons-logging'
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:20.+'
    compile 'org.springframework.android:spring-android-rest-template:1.+'
    compile 'org.springframework.android:spring-android-auth:1.+'
    compile 'org.springframework.android:spring-android-core:1.+'
    compile 'org.springframework.security:spring-security-crypto:3.+'
    compile 'org.springframework.social:spring-social-core:1.+'
    compile 'org.springframework.social:spring-social-twitter:1.+' // <- The offending line
    compile 'com.fasterxml.jackson.core:jackson-databind:2.3.2'
}

错误:

Error:Execution failed for task ':app:dexDebug'.
    > com.android.ide.common.internal.LoggedErrorException: Failed to run command:
    C:\Android\android-studio\sdk\build-tools\android-4.4W\dx.bat --dex --num-threads=4 --output C:\Workspace\TestApplication\app\build\intermediates\dex\debug C:\Workspace\TestApplication\app\build\intermediates\classes\debug C:\Workspace\TestApplication\app\build\intermediates\dependency-cache\debug C:\Workspace\TestApplication\app\build\intermediates\pre-dexed\debug\aopalliance-1.0-b64c80122d373c2ee241b55db78eac4c4c550a82.jar C:\Workspace\TestApplication\app\build\intermediates\pre-dexed\debug\classes-528f16ed29eae5d85d8c6f1ee7d32d83803e6e6d.jar C:\Workspace\TestApplication\app\build\intermediates\pre-dexed\debug\classes-fa1cd323aa3b243f3f4157cb5e43b3768ee49e9b.jar C:\Workspace\TestApplication\app\build\intermediates\pre-dexed\debug\internal_impl-20.0.0-d4c263ffd0c244f7b9af8079e5d62faa86242454.jar C:\Workspace\TestApplication\app\build\intermediates\pre-dexed\debug\jackson-annotations-2.3.0-c8c500c4e2e271888f48319f1d0f4ee141245e21.jar C:\Workspace\TestApplication\app\build\intermediates\pre-dexed\debug\jackson-core-2.3.2-5a10979c76ddf0300365195ed3dcdf3bbf65dba0.jar C:\Workspace\TestApplication\app\build\intermediates\pre-dexed\debug\jackson-databind-2.3.2-a027503e6b72a7b1487e8e935334766d26725e1b.jar C:\Workspace\TestApplication\app\build\intermediates\pre-dexed\debug\javax.inject-1-e86c6ad046940b581fcf8f69e7965f8f5d1cfaf6.jar C:\Workspace\TestApplication\app\build\intermediates\pre-dexed\debug\spring-android-auth-1.0.1.RELEASE-d09921850d19080abfdeefe1fde904485c1b37c8.jar C:\Workspace\TestApplication\app\build\intermediates\pre-dexed\debug\spring-android-core-1.0.1.RELEASE-d006eb074ec6bcaf01f1fcb65dcc840f72c538d1.jar C:\Workspace\TestApplication\app\build\intermediates\pre-dexed\debug\spring-android-rest-template-1.0.1.RELEASE-f254c94632ca185a2fee85575fea1e4e9e68766f.jar C:\Workspace\TestApplication\app\build\intermediates\pre-dexed\debug\spring-aop-4.0.2.RELEASE-87af05a1d636417a8a1c074a0d93dbc6c5902550.jar C:\Workspace\TestApplication\app\build\intermediates\pre-dexed\debug\spring-beans-4.0.2.RELEASE-5afb5560550de06352f4871e0c5351c296555245.jar C:\Workspace\TestApplication\app\build\intermediates\pre-dexed\debug\spring-context-4.0.2.RELEASE-ae3ec0e430000b49e6dabc34fb702e4db3ab96ad.jar C:\Workspace\TestApplication\app\build\intermediates\pre-dexed\debug\spring-expression-4.0.2.RELEASE-1cfe445710559e2affa6317c573db04b9638c918.jar C:\Workspace\TestApplication\app\build\intermediates\pre-dexed\debug\spring-security-crypto-3.2.4.RELEASE-e5c641be2ba64d1b5bda6b6e9778a6043726fc96.jar C:\Workspace\TestApplication\app\build\intermediates\pre-dexed\debug\spring-social-config-1.1.0.RC1-0646da07e81cc32f0ff7a641a47b589c6ee71ed6.jar C:\Workspace\TestApplication\app\build\intermediates\pre-dexed\debug\spring-social-core-1.1.0.RC1-f762fce97f3b62664de8e04d427fea101bc74da1.jar C:\Workspace\TestApplication\app\build\intermediates\pre-dexed\debug\spring-social-twitter-1.1.0.RC1-66dcadc997a346a9caac49e5e66d0d6d60d6e684.jar C:\Workspace\TestApplication\app\build\intermediates\pre-dexed\debug\spring-social-web-1.1.0.RC1-753970492ed13f57671662ceb587dd9aa4f2c882.jar C:\Workspace\TestApplication\app\build\intermediates\pre-dexed\debug\spring-webmvc-4.0.2.RELEASE-a6c8053426ad57c5e0b1eb2de9405ef3c0e118b1.jar C:\Workspace\TestApplication\app\build\intermediates\pre-dexed\debug\support-annotations-20.0.0-bab26a85db10fdf51a5bd499a182514bd4080ed4.jar
Error Code:
2
Output:
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lorg/springframework/beans/BeansException;
at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
at com.android.dx.command.dexer.Main.run(Main.java:230)
at com.android.dx.command.dexer.Main.main(Main.java:199)
at com.android.dx.command.Main.main(Main.java:103)
4

2 回答 2

3

我可以让你走得更远,但你可能会陷入下一个问题。

如果我加载您的构建文件(并重现您的构建错误),当我进入 IDE 并要求它带我去BeansException上课时,我会得到:

的屏幕截图

您可以看到它BeansException是在两个不同的地方定义的,这在 Android 版本中是不允许的,因此您会看到错误。您需要设置您的构建,以便在一个地方定义每个类。

做更多的调查,你可以使用这个命令来查看你的依赖树。从应用程序的模块目录中,运行以下命令:

../gradlew dependencies

输出的相关部分在这里:

_debugApk - ## Internal use, do not manually configure ##
+--- com.android.support:appcompat-v7:20.+ -> 20.0.0
|    \--- com.android.support:support-v4:20.0.0
|         \--- com.android.support:support-annotations:20.0.0
+--- org.springframework.android:spring-android-rest-template:1.+ -> 1.0.1.RELEASE
|    \--- org.springframework.android:spring-android-core:1.0.1.RELEASE
+--- org.springframework.android:spring-android-auth:1.+ -> 1.0.1.RELEASE
|    +--- org.springframework.android:spring-android-core:1.0.1.RELEASE
|    +--- org.springframework.android:spring-android-rest-template:1.0.1.RELEASE (*)
|    +--- org.springframework.security:spring-security-crypto:3.1.3.RELEASE -> 3.2.4.RELEASE
|    \--- org.springframework.social:spring-social-core:1.0.2.RELEASE -> 1.1.0.RC1
+--- org.springframework.android:spring-android-core:1.+ -> 1.0.1.RELEASE
+--- org.springframework.security:spring-security-crypto:3.+ -> 3.2.4.RELEASE
+--- org.springframework.social:spring-social-core:1.+ -> 1.1.0.RC1
+--- org.springframework.social:spring-social-twitter:1.+ -> 1.1.0.RC1
|    +--- com.fasterxml.jackson.core:jackson-databind:2.3.0 -> 2.3.2
|    |    +--- com.fasterxml.jackson.core:jackson-annotations:2.3.0
|    |    \--- com.fasterxml.jackson.core:jackson-core:2.3.2
|    +--- org.springframework.security:spring-security-crypto:3.2.0.RELEASE -> 3.2.4.RELEASE
|    +--- org.springframework.social:spring-social-core:1.1.0.RC1
|    +--- org.springframework.social:spring-social-config:1.1.0.RC1
|    |    +--- org.springframework.social:spring-social-web:1.1.0.RC1
|    |    |    +--- javax.inject:javax.inject:1
|    |    |    +--- org.springframework:spring-webmvc:4.0.2.RELEASE
|    |    |    |    +--- org.springframework:spring-beans:4.0.2.RELEASE
|    |    |    |    +--- org.springframework:spring-context:4.0.2.RELEASE
|    |    |    |    |    +--- org.springframework:spring-aop:4.0.2.RELEASE
|    |    |    |    |    |    +--- aopalliance:aopalliance:1.0
|    |    |    |    |    |    \--- org.springframework:spring-beans:4.0.2.RELEASE
|    |    |    |    |    +--- org.springframework:spring-beans:4.0.2.RELEASE
|    |    |    |    |    \--- org.springframework:spring-expression:4.0.2.RELEASE
|    |    |    |    \--- org.springframework:spring-expression:4.0.2.RELEASE
|    |    |    \--- org.springframework.social:spring-social-core:1.1.0.RC1
|    |    \--- org.springframework.social:spring-social-core:1.1.0.RC1
|    +--- com.fasterxml.jackson.core:jackson-core:2.3.0 -> 2.3.2
|    \--- com.fasterxml.jackson.core:jackson-annotations:2.3.0
\--- com.fasterxml.jackson.core:jackson-databind:2.3.2 (*)

从这里我们可以看到它org.springframework.social:spring-social-twitter:1.+最终包含org.springframework:spring-beans:4.0.2.RELEASE了它的传递依赖(你发现它是因为你将它隔离为导致构建问题的行),但这意味着如果它已经被捆绑到 spring-android-core jar 中,它是多余的。我没有看到 spring-android-core 对 spring-beans 的另一个依赖;也许该类只是打包到 jar 中,甚至不是依赖项。

无论如何,您可以在依赖项中使用此语法来告诉 Gradle 不要选择传递依赖项:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:20.+'
    compile 'org.springframework.android:spring-android-rest-template:1.+'
    compile 'org.springframework.android:spring-android-auth:1.+'
    compile 'org.springframework.android:spring-android-core:1.+'
    compile 'org.springframework.security:spring-security-crypto:3.+'
    compile 'org.springframework.social:spring-social-core:1.+'
    compile('org.springframework.social:spring-social-twitter:1.+') {
        exclude module: 'spring-beans'
    }
    compile 'com.fasterxml.jackson.core:jackson-databind:2.3.2'
}

如果我这样做,那么不再有 dex 多文件定义类错误。但是,我现在得到了这个类似但不同的重复文件错误,我可以稍微思考一下,但我不确定是否可以在不编写实例化 Spring 的测试应用程序的情况下修复它,这超出了我的范围我会做一个这样的答案;)

:app:packageDebug
Error: duplicate files during packaging of APK /Users/sbarta/AndroidStudioProjects/MyApplication/app/build/outputs/apk/app-debug-unaligned.apk
    Path in archive: META-INF/spring.schemas
    Origin 1: /Users/sbarta/.gradle/caches/modules-2/files-2.1/org.springframework.social/spring-social-config/1.1.0.RC1/7afae4a4f83c64c4fd382c77708866e82900e799/spring-social-config-1.1.0.RC1.jar
    Origin 2: /Users/sbarta/.gradle/caches/modules-2/files-2.1/org.springframework/spring-context/4.0.2.RELEASE/6d6a781d99215990da8b398e1cdf09594a683209/spring-context-4.0.2.RELEASE.jar
You can ignore those files in your build.gradle:
    android {
      packagingOptions {
        exclude 'META-INF/spring.schemas'
      }
    }
:app:packageDebug FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:packageDebug'.
> Duplicate files copied in APK META-INF/spring.schemas
    File 1: /Users/sbarta/.gradle/caches/modules-2/files-2.1/org.springframework.social/spring-social-config/1.1.0.RC1/7afae4a4f83c64c4fd382c77708866e82900e799/spring-social-config-1.1.0.RC1.jar
    File 2: /Users/sbarta/.gradle/caches/modules-2/files-2.1/org.springframework.social/spring-social-config/1.1.0.RC1/7afae4a4f83c64c4fd382c77708866e82900e799/spring-social-config-1.1.0.RC1.jar

这意味着META-INF/spring.schemas从两个不同的地方包含两个文件,这也是不允许的。但是,在这里你没有告诉 dex 忽略其中一个的灵活性;您可以通过以下方式告诉它忽略所有这些:

android {
  packagingOptions {
    exclude 'META-INF/spring.schemas'
  }
}

在您的构建文件中。我有一种感觉,Spring 需要该模式文件(虽然是哪个????),所以如果你这样做,你的应用程序可能仍然无法工作。尝试并尝试使用它,如果您仍然遇到问题,您可以发布另一个问题并获得更专业的帮助。

我不确定这个问题的根源是什么。Spring 库中是否存在多个模式文件的打包错误?或者您希望解决这个问题?还是其他构建系统只是做正确的事?我不确定。

于 2014-07-16T18:19:35.127 回答
0

好的,这远不是人们所说的令人满意的解决方案,但是事情可以编译,所以我很“高兴”。

无论问题的根源是什么,它似乎都特定于 spring-social-twitter 版本 1.1.0。我将 build.gradle 行更改为:

compile 'org.springframework.social:spring-social-twitter:1.0.5.RELEASE'

而不是我以前的 ...spring-social-twitter:1.+' 现在编译得很好。尚未测试工作方面,但这将是一组完全不同的问题。

我向你保证,找到这个的方法与实际的“解决方案”一样荒谬。

于 2014-07-18T01:33:46.903 回答