2016-04-18 24 views
8

Używam Android Studio 2.0 na Windows 7. Przy budowie mojego Android projektu, pojawia się następujący błąd:błąd DuplicateFileException budując Android APK

: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` 

I zostały kopania wokół dla godzin i nie widać wszystko, co to powoduje. Usunąłem .gradle w moim katalogu domowym, ale po prostu odbudowuje to wszystko. Czy ktoś wie, co to powoduje?

Pełna moc 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 

Z tego co mogę powiedzieć, to jest konflikt między dwiema zależnościami:

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' 
} 

Myślę, że te dwie zależności:

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' 

I "nie jestem w stanie usunąć żadnego z nich, ponieważ powoduje to kompilację błędów w module zaplecza. Wygląda jednak na to, że te dwie zależności są prawie identyczne. Czy oni powinni tam być? Każda rada jest doceniana!

+1

Proszę zaksięgować całą treść wyjściową programu Gradle Console, a nie tylko te wiersze. Zobacz [to pytanie i przepełnienie stosu] (https://stackoverflow.com/questions/36698816/gradle-what-is-a-ro-zero-exit-value-andhow-do-i-fix-it# comment60986098_36698816), aby uzyskać więcej. – CommonsWare

+0

OK, dodano wyniki gradle. Przejrzałem wyniki, ale żadne z nich niczego mi nie sugeruje. –

Odpowiedz

7

Aby zakończyć @ DSH za odpowiedź:

w drzewie zależności są 2 pliki jar zawierające ten sam plik o nazwie sep_approx_spanish.txt, to nie jest dozwolone.

Aby rozwiązać problem, musisz wyłapać, które z zależności gradowych ma dwa słoiki o nazwach appengine-api-1.0-sdk-1.9.28.jar i appengine-endpoints-1.9.28.jar; aby to zrobić, można otworzyć konsolę terminala Android studio i wpisać:

//if ou are on windows 
gradlew dependencies 

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

Zobaczysz Gradle robi wiele rzeczy, ale w pewnym momencie będzie wydrukować całe drzewo zależności. Po znalezieniu których są 2 Zależności są przyczyną problemu, należy dodać ten fragment kodu na końcu jednej z deklaracji zależność

{ 
    exclude "sep_approx_spanish.txt" 
} 

Tak na przykład, jeśli obie zależności są te

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

jeśli musi stać

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

lub

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

w ten sposób informuje się gradle, aby nie brać pod uwagę tego pliku dla jednej z dwóch bibliotek, unikając powielania pliku wewnątrz pliku APK.

+0

Doskonała odpowiedź, to rozwiązało. Musiałem przejść przez kilka plików txt, aby to działało, ale kiedy już je wszystkie uporządkowałem, wszystko było w porządku. Również świetna praca nad napisaniem bardzo dokładnej odpowiedzi :) –

+0

Cieszę się, że to pomogło :) – Apperside

+1

@JamesFunk wykonał tę pracę dla Ciebie? Skończyło się na otrzymaniu kolejnego błędu: Błąd: (26, 0) Nie znaleziono metody DSL Gradle: 'com.google.appengine: appengine-endpoints: 1.9.28()' – sublimental

2

Błąd informuje, że utworzenie pliku APK spowodowałoby utworzenie dwóch plików o nazwie com/google/appengine/repackaged/org/apache/commons/codec/language/bm/sep_approx_spanish.txt. Jest to błąd, ponieważ plik APK może zawierać tylko jeden plik w dowolnej ścieżce. Jest to prawdopodobnie spowodowane przez dwa różne pliki jar w ścieżce klas, które zawierają plik. W moim projekcie wystąpiło to tylko w przypadku plików, które nie były faktycznie używane w środowisku wykonawczym, więc całkowicie je wykluczyłem z pliku APK.

+0

Chociaż jest to technicznie poprawne, oznaczyłem drugi jako odpowiedź, ponieważ wyjaśnił, jak to naprawić, a nie tylko przyczynę. –

+0

Okay, świetnie! :) – dsh

0

Wypełnianie odpowiedzi @Apperide.

Naprawiłem błąd, dodając następujące linie do mojej kompilacji.plik gradowy modułu mojej aplikacji:

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/*' 
     } 

    (...) 
}