2015-04-10 9 views
5

Wymieniłem klasy JavaDate z klasami Joda 'DateTime ostatnio w mojej aplikacji na Androida. Używam Jackson do parsowania json. Dodałem następujące linie do mojego pliku build.gradleKopiowanie plików podczas pakowania - messages.properties z JodaTime

compile com.fasterxml.jackson.datatype:jackson-datatype-joda:2.4.3 
compile net.danlew:android.joda:2.7.1 

Zepsuł moją kompilację. Komunikat o błędzie to duplicate files during packaging of APK. Sugeruje również opcję

android { 
    packagingOptions { 
    exclude 'org/joda/time/format/messages_da.properties' 
    } 
} 

Jest wiele takich plików jak to w JodaTime jak „messages_da.properties”, „messages_fr.properties”. Sądzę, że są one używane do tworzenia formatowania opartego na języku.

Moje przeczucie mówi, że te pliki nie powinny być wykluczone. Jeśli eksperci tam może stanowić rozwiązanie tego problemu, byłoby wspaniale

+3

Dla tego, co jest warte, możesz również użyć "pickFirst" zamiast "exclude", aby użyć pierwszego znalezionego. –

+0

Zobacz moją odpowiedź poniżej, dochodzi do źródła problemu, wyjaśnia go i pokazuje o wiele lepsze rozwiązanie. – Sakiboy

Odpowiedz

2

To jest rzeczywiście problem, który wynika z w zależności od wielu modułów joda-time w twoim projekcie.

Aby rozwiązać ten problem, należy je wykluczyć „duplikat” joda-time moduł (y) z jakiegokolwiek uzależnienia w projekcie, który zawiera «duplikat» joda-time moduł.

Aby dowiedzieć się, jakie zależności są w tym «duplikat» joda-time, użyj polecenia ./gradlew app:dependencies, aby wyświetlić pełny wykres zależności, a następnie przejrzyj listę zależności i znajdź te, które zawierają "zduplikowany" moduł joda-time. Następnie wykluczyć joda-time z dowolnej zależności, która obejmuje "duplikat" tego. Po wykonaniu tej czynności aplikacja będzie działać poprawnie.

Przykład jak wykluczyć joda-time z zależnością:

// An offending dependency that contains a duplicate joda-time. 
compile('com.some.project:some-module:0.1') { 
     // Exclude joda-time from this dependency to remove the errors. 
     exclude module: 'joda-time' 
    } 

Dzięki temu nie trzeba polegać na innych hacky odpowiedzi tutaj.

3

Moja brudna rozwiązanie:

android { 
    packagingOptions { 
     exclude 'META-INF/maven/joda-time/joda-time/pom.properties' 
     exclude 'META-INF/maven/joda-time/joda-time/pom.xml' 
     pickFirst 'org/joda/time/format/messages.properties' 
     pickFirst 'org/joda/time/format/messages_cs.properties' 
     pickFirst 'org/joda/time/format/messages_da.properties' 
     pickFirst 'org/joda/time/format/messages_de.properties' 
     pickFirst 'org/joda/time/format/messages_en.properties' 
     pickFirst 'org/joda/time/format/messages_es.properties' 
     pickFirst 'org/joda/time/format/messages_fr.properties' 
     pickFirst 'org/joda/time/format/messages_it.properties' 
     pickFirst 'org/joda/time/format/messages_ja.properties' 
     pickFirst 'org/joda/time/format/messages_no.properties' 
     pickFirst 'org/joda/time/format/messages_nl.properties' 
     pickFirst 'org/joda/time/format/messages_pl.properties' 
     pickFirst 'org/joda/time/format/messages_pt.properties' 
     pickFirst 'org/joda/time/format/messages_ru.properties' 
     pickFirst 'org/joda/time/format/messages_tr.properties' 
    } 
} 
2

I rozwiązać ten problem jak

android { 
    packagingOptions { 
     exclude 'org/joda/time/format/*.properties' 
    } 
} 
Powiązane problemy