【问题标题】:DuplicateFileException error while building Android APK构建 Android APK 时出现 DuplicateFileException 错误
【发布时间】:2016-08-10 13:24:54
【问题描述】:

我在 Windows 7 上使用 Android Studio 2.0。在构建我的 Android 项目时,我收到以下错误:

:app:transformResourcesWithMergeJavaResForDebug FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK com/google/appengine/repackaged/org/apache/commons/codec/language/bm/sep_approx_spanish.txt
File1: C:\Users\USER\.gradle\caches\modules-2\files-2.1\com.google.appengine\appengine-api-1.0-sdk\1.9.28\e92c18272b555027d9ec666e7a89162f10638314\appengine-api-1.0-sdk-1.9.28.jar
File2: C:\Users\USER\.gradle\caches\modules-2\files-2.1\com.google.appengine\appengine-endpoints\1.9.28\bf2e8a74bd28e388b3487fc78a0c7adfa592fd5d\appengine-endpoints-1.9.28.jar`

我已经挖掘了几个小时,但看不到任何导致此问题的原因。我已经在我的主目录中删除了 .gradle ,但它只是重建它。有谁知道这是什么原因?

完整的 gradle 输出:

Executing tasks: [:app:clean, :app:generateDebugSources, :app:mockableAndroidJar, :app:prepareDebugUnitTestDependencies, :app:generateDebugAndroidTestSources, :app:assembleDebug]

Configuration on demand is an incubating feature.
WARNING: Dependency org.apache.httpcomponents:httpclient:4.0.1 is ignored for debug as it may be conflicting with the internal version provided by Android.
     In case of problem, please repackage it with jarjar to change the class packages
WARNING: Dependency org.apache.httpcomponents:httpclient:4.0.1 is ignored for release as it may be conflicting with the internal version provided by Android.
     In case of problem, please repackage it with jarjar to change the class packages
Incremental java compilation is an incubating feature.
:app:clean
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:checkDebugManifest
:app:preReleaseBuild UP-TO-DATE
:backend:appengineDownloadSdk
:backend:compileJava
:backend:processResources UP-TO-DATE
:backend:classes
:backend:appengineEndpointsGetClientLibs UP-TO-DATE
:backend:appengineEndpointsExpandClientLibs UP-TO-DATE
:backend:compileEndpointsSrcJava
:backend:processEndpointsSrcResources UP-TO-DATE
:backend:endpointsSrcClasses
:backend:_appengineEndpointsAndroidArtifact UP-TO-DATE
:backend:jar UP-TO-DATE
:app:prepareComAndroidSupportAnimatedVectorDrawable2330Library
:app:prepareComAndroidSupportAppcompatV72330Library
:app:prepareComAndroidSupportSupportV42330Library
:app:prepareComAndroidSupportSupportVectorDrawable2330Library
:app:prepareComGoogleAndroidGmsPlayServicesAuth840Library
:app:prepareComGoogleAndroidGmsPlayServicesBase840Library
:app:prepareComGoogleAndroidGmsPlayServicesBasement840Library
:app:prepareComGoogleAndroidGmsPlayServicesMeasurement840Library
:app:prepareDebugDependencies
:app:compileDebugAidl
:app:compileDebugRenderscript
:app:generateDebugBuildConfig
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets
:app:generateDebugResValues UP-TO-DATE
:app:processDebugGoogleServices
:app:generateDebugResources
:app:mergeDebugResources
:app:processDebugManifest
:app:processDebugResources
:app:generateDebugSources
:app:mockableAndroidJar UP-TO-DATE
:app:preDebugUnitTestBuild UP-TO-DATE
:app:prepareDebugUnitTestDependencies
:app:preDebugAndroidTestBuild UP-TO-DATE
:app:prepareDebugAndroidTestDependencies
:app:compileDebugAndroidTestAidl
:app:processDebugAndroidTestManifest
:app:compileDebugAndroidTestRenderscript
:app:generateDebugAndroidTestBuildConfig
:app:generateDebugAndroidTestAssets UP-TO-DATE
:app:mergeDebugAndroidTestAssets
:app:generateDebugAndroidTestResValues UP-TO-DATE
:app:generateDebugAndroidTestResources
:app:mergeDebugAndroidTestResources
:app:processDebugAndroidTestResources
:app:generateDebugAndroidTestSources
:app:compileDebugJavaWithJavac
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

:app:compileDebugNdk UP-TO-DATE
:app:compileDebugSources
:app:buildInfoDebugLoader
:app:transformClassesWithExtractJarsForDebug
:app:transformClassesWithInstantRunVerifierForDebug
:app:transformClassesWithJavaResourcesVerifierForDebug UP-TO-DATE
:app:mergeDebugJniLibFolders
:app:transformNative_libsWithMergeJniLibsForDebug
:app:processDebugJavaRes UP-TO-DATE
:app:transformResourcesWithMergeJavaResForDebug FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
> com.android.build.api.transform.TransformException:     com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK com/google/appengine/repackaged/org/apache/commons/codec/language/bm/sep_approx_spanish.txt
File1: C:\Users\USER\.gradle\caches\modules-2\files-2.1\com.google.appengine\appengine-api-1.0-sdk\1.9.28\e92c18272b555027d9ec666e7a89162f10638314\appengine-api-1.0-sdk-1.9.28.jar
File2: C:\Users\USER\.gradle\caches\modules-2\files-2.1\com.google.appengine\appengine-endpoints\1.9.28\bf2e8a74bd28e388b3487fc78a0c7adfa592fd5d\appengine-endpoints-1.9.28.jar


* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED

Total time: 15.364 secs

据我所知,这是两个依赖项之间的冲突:

dependencies {
  appengineSdk 'com.google.appengine:appengine-java-sdk:1.9.28'
  compile 'com.google.appengine:appengine-endpoints:1.9.28'
  compile 'com.google.appengine:appengine-endpoints-deps:1.9.28'
  compile 'javax.servlet:servlet-api:2.5'
  compile 'com.google.http-client:google-http-client-jackson2:1.20.0'
  compile 'com.google.http-client:google-http-client-gson:1.19.0'
}

我认为是这两个依赖:

appengineSdk 'com.google.appengine:appengine-java-sdk:1.9.28'
compile 'com.google.appengine:appengine-endpoints:1.9.28'
compile 'com.google.appengine:appengine-endpoints-deps:1.9.28'

我无法删除任何这些,因为它会导致后端模块出现编译错误。然而,看起来这两个依赖项几乎相同。他们应该都在里面吗?任何建议表示赞赏!

【问题讨论】:

  • 请发布整个 Gradle 控制台输出,而不仅仅是这些行。请参阅this Stack Overflow question and answer 了解更多信息。
  • 好的,已添加 gradle 输出。我查看了输出,但没有一个对我有任何建议。

标签: android android-studio-2.0


【解决方案1】:

完成@dsh 的回答:

在您的依赖关系树中有 2 个 jar 文件包含名为 sep_approx_spanish.txt 的相同文件,这是不允许的。

要解决您的问题,您必须跟踪您的 gradle 依赖项中的哪个具有名为 appengine-api-1.0-sdk-1.9.28.jarappengine-endpoints-1.9.28.jar 的两个 jar;为此,您可以打开 android studio 的终端控制台并输入:

//if ou are on windows
gradlew dependencies

//if you are on unix based os
./gradlew dependencies

你会看到 gradle 做了很多事情,但在某个时候它会打印整个依赖树。一旦找到导致问题的 2 个依赖项,请在其中一个依赖项声明的末尾添加这段代码

{
    exclude "sep_approx_spanish.txt"
}

例如,如果两个依赖项是这些

compile 'com.google.appengine:appengine-endpoints:1.9.28'
compile 'com.google.appengine:appengine-endpoints-deps:1.9.28

如果必须成为

compile 'com.google.appengine:appengine-endpoints:1.9.28'{
        exclude "sep_approx_spanish.txt"
    }
 compile 'com.google.appengine:appengine-endpoints-deps:1.9.28

compile 'com.google.appengine:appengine-endpoints:1.9.28'
compile 'com.google.appengine:appengine-endpoints-deps:1.9.28'{
        exclude "sep_approx_spanish.txt"
    }

通过这种方式,您告诉 gradle 不要为两个库之一考虑该文件,从而避免文件在 apk 中的重复。

【讨论】:

  • 完美答案,解决了。我必须检查几个 txt 文件才能让它工作,但是一旦我把它们都整理好,就很好了。此外,出色的工作写了一个非常彻底的答案:)
  • 很高兴知道它对您有所帮助 :)
  • @JamesFunk 这对你有用吗?我最终得到另一个错误:错误:(26, 0) Gradle DSL method not found: 'com.google.appengine:appengine-endpoints:1.9.28()'
  • @Mukesh 如果我使用 compile ('com.google.appengine:appengine-endpoints-deps:1.9.28'){ exclude "sep_approx_spanish.txt " } 编译 'com.google.appengine:appengine-endpoints:1.9.28' 或 compile ('com.google.appengine:appengine-endpoints-deps:1.9.28'{ exclude "sep_approx_spanish.txt" } compile 'com. google.appengine:appengine-endpoints:1.9.28'
  • @user3024215 问题似乎与排除语句有关,没有它编译。如果你想排除某个文件,你可以尝试把它放在 PackagingOptions 中。为此,您应该在 build.GRADLE 的 android{} 部分中添加类似 packagingOptions { exclude 'META-INF/maven/com.google.guava/guava/pom.xml'} 之类的内容,而不是在 compile{} 部分中。显然你必须用'META-INF/package/of/the/file/filename.extension'替换'META-INF/maven/com.google.guava/guava/pom.xml'。我使用此解决方案在 guava 库中排除文件 pom.xml
【解决方案2】:

该错误告诉您构建 APK 会生成两个名为 com/google/appengine/repackaged/org/apache/commons/codec/language/bm/sep_approx_spanish.txt 的文件。这是失败的,因为 APK 在任何给定路径中只能包含一个文件。这可能是由包含该文件的类路径中的两个不同 jar 文件引起的。在我的项目中,这只发生在运行时未实际使用的文件中,因此我将它们完全排除在 APK 之外。

【讨论】:

  • 虽然这在技术上是正确的,但我将另一个标记为答案,因为它也解释了如何解决它,而不仅仅是原因。
【解决方案3】:

正在完成@Apperside 的回答。

我通过在我的应用模块的 build.gradle 文件中添加以下行来修复错误:

android{

    packagingOptions {
            exclude 'com/google/appengine/repackaged/org/apache/commons/codec/language/bm/*'
            exclude 'com/google/appengine/repackaged/org/codehaus/jackson/impl/VERSION.txt'
            exclude 'com/google/appengine/repackaged/org/apache/commons/codec/language/*'
        }

    (...)  
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 2018-08-13
    • 2015-12-09
    • 2019-07-14
    • 2023-03-27
    • 1970-01-01
    • 2017-03-13
    相关资源
    最近更新 更多