NoClassDefFoundError - Eclipse i Android


193

Mam problem z uruchomieniem aplikacji na Androida, która działała poprawnie do czasu dodania drugiej biblioteki zewnętrznej do ścieżki kompilacji. Od czasu dodania słoika scoreninja otrzymuję teraz NoClassDefFoundError, gdy próbuję uruchomić aplikację.

Oto wiadomość:

02-11 21:45:26.154: ERROR/AndroidRuntime(3654): java.lang.NoClassDefFoundError: com.scoreninja.adapter.ScoreNinjaAdapter

Ponieważ wszystkie skrypty kompilacji są generowane przez narzędzia Android (?), Nie jestem pewien, co jeszcze mogę zrobić oprócz czyszczenia i przebudowywania lub ponownego uruchamiania zaćmienia (już wypróbowałem wszystkie trzy). Czy ktoś wie, jak mogę to zmienić?


1
Jak dodałeś plik jar? Czy dodałeś przy użyciu ścieżki kompilacji -> Biblioteki -> Zewnętrzne słoiki?
Teja Kantamneni

1
Projekt prawym przyciskiem myszy> Ścieżka kompilacji> Dodaj zewnętrzne archiwa ... zgodnie z instrukcjami tutaj: scoreninja.appspot.com
Tom R

4
Jeśli aktualizowany ADT niedawno, a następnie spojrzeć na Johna odpowiedź poniżej (i upvote go!) Stackoverflow.com/a/9916751/489852
Atul Goyal

1
Jeśli masz ten problem, zanim przejdziesz bezpośrednio do odpowiedzi Johna, poniższa odpowiedź @Till rozwiązuje ją także dla wielu osób, w tym dla mnie.
Carlos P

Czy próbowałeś multidex?
Ashish Rawat

Odpowiedzi:


234

Miałem ten problem po aktualizacji ADT.

Przechowywałem wszystkie moje pliki JAR w folderze o nazwie „lib” i dodawałem słoiki do ścieżki kompilacji w normalny sposób Eclipse. Działało dobrze do mojej aktualizacji.

Po mojej aktualizacji otrzymywałem błąd NoClassDefFoundError dla klasy, którą wyraźnie mogłem zobaczyć w słoiku (sprawdzanie klas ReferencedLibraries).

Rozwiązaniem było usunięcie moich słoików ze ścieżki kompilacji i zmiana nazwy folderu „lib” na „libs”. Jest to konwencja mrówek, która wydaje się być sposobem, w jaki nowy ADT znajduje i dołącza biblioteki do pliku .apk. Gdy to zrobiłem, wszystko działało dobrze.


1
Wielkie dzięki! Nie miałem ani lib ani folderu libs przed wczorajszą aktualizacją ADT i wszystko działało dobrze. Po aktualizacji wszystkie zewnętrzne słoiki miały ten problem. Zostały naprawione dzięki twojej odpowiedzi. Muszę połączyć twoje z Brianem, żeby to działało.
Hong

Dzięki, John! Dodam, że po zmianie folderu na libs musiałem ponownie uruchomić eclipse, aby działało.
Michaeldcooney,

5
Napotkałem ten sam problem po aktualizacji ADT, ale trzymałem słoiki w katalogu poza moim projektem i włączałem je jako bibliotekę użytkownika do mojej ścieżki kompilacji. Rozwiązaniem było usunięcie biblioteki użytkownika z mojej ścieżki kompilacji i włączenie słoików za pomocą „Dodaj słoiki zewnętrzne”, a następnie wyeksportowanie ich przez zaznaczenie pól wyboru na karcie „Zamów i eksportuj”.
Travis

1
Odwoływałem się do android-support-v13.jar jako zewnętrznej biblioteki w C: \ android-sdk-windows \ extras \ android \ kompatybilność \ v13. Przenieśliłem ten plik JAR do folderu libs projektu i usunąłem odwołanie ze ścieżki budowania Java -> Biblioteki. Czysta wersja i znów jechałem.
Snowwire,

Cześć. wypróbowałem nasze podejście, dodając biblioteki lib jar zewnętrznych wewnątrz / libs i teraz otrzymuję ten błąd: Konwersja do formatu Dalvik nie powiodła się z błędem 1
Jonathan

100

Nie musiałem umieszczać biblioteki jar w zasobach lub bibliotekach, ale zaznaczam tylko pole dla tego jar w oknie Właściwości -> Ścieżka kompilacji Java -> „Zamów i eksportuj” (była wcześniej wymieniona, ale nie została wybrana )


Dzięki wielkie! Borykałem się z tym błędem od dłuższego czasu i wszystko, co musiałem zrobić, to sprawdzić pole Drew dla słoika na ekranie „Zamów i eksportuj”. Zabawne jest to, że musiałem to zrobić, aby działało na emulatorze tabletu Nook. Nie miał problemu z urządzeniami ani innymi emulatorami.
Luis

5
Czy ktoś wie, dlaczego musisz zrobić jedno i drugie, dodać bibliotekę, a także zaznaczyć pole wyboru w Zamów i Eksportuj? Czy istnieje powód, dla którego chciałbym dodać zewnętrzny plik JAR, ale nie dołączyć go do zamówienia i eksportu?
Lou Morda

Miałem ten problem po aktualizacji ADT i to rozwiązało go dla mnie.
cdavidyoung

5
Pomogło mi to, ale dopiero po wykonaniu Project -> Clean
altumano,

Dzięki!! Uratował mnie Musiałem zrobić czyszczenie i zrestartować po zainstalowaniu Eclipse Juno.
Rynardt

68

Dodając zewnętrzny słoik do ścieżki kompilacji, po prostu dodaje słoik do pakietu, ale nie będzie on dostępny w czasie wykonywania.

Aby słoik był dostępny w czasie wykonywania , musisz:

  • Umieść słoik pod swoim assetsfolderem
  • Dołącz tę kopię słoika do ścieżki kompilacji
  • Przejdź do karty eksportu w tym samym oknie podręcznym
  • Zaznacz pole obok nowo dodanego słoika

ScoreNinjaAdapter jest czyimś kodem, ale byłbym bardzo zaskoczony, gdyby zawierał taki błąd, jak to jest w powszechnym użyciu. Błąd występuje w pewnym momencie w moim własnym kodzie.
Tom R

Błąd dosłownie dzieje się tutaj: sna = new ScoreNinjaAdapter (this, SN_APP_ID, SN_APP_KEY);
Tom R

Czy potrzebujesz importinstrukcji dla zewnętrznych plików jar? Nigdy ich nie użyłem.
Anthony Forloney

Czy próbowałeś usunąć plik .jar z assestspodejścia do folderu?
Anthony Forloney

Tak. W końcu miałem już dość tego wszystkiego i po prostu pobrałem źródło i skopiowałem pliki źródłowe do mojego projektu. Nie najładniejsze rozwiązanie, ale teraz działa. Dziękuję za twoją pomoc.
Tom R

48

Miałem to dla MapActivity. Buduje w Eclipse dostaje NoClassDefFound w debuggerze.

Zapomniałem dodać bibliotekę do manifestu, wewnątrz <Application>...</Application>elementu

<uses-library android:name="com.google.android.maps" />

27

Zmieniłem kolejność dołączonych projektów (Eclipse / Configure Build Path / Order and Export). Przeniosłem moje dwa zależne projekty na szczyt listy „Zamów i eksportuj”. Rozwiązało to problem „NoClassDefFoundError”.

To jest dla mnie dziwne. Nie słyszałem o znaczeniu kolejności włączonych bibliotek i projektów. Android + Eclipse to świetna zabawa :)


Jest to również rozwiązanie wspomniane w drugim komentarzu użytkownika w bugruport: code.google.com/p/android/issues/detail?id=55304
arberg

15

Nie jestem pewien, czy jest to powiązane, czy nawet wciąż szukasz odpowiedzi, ale natknąłem się na ten wątek, próbując znaleźć ten sam błąd (ale być może z różnych powodów).

Nie mogłem znaleźć żadnych rozwiązań online, ale odpowiedź na podobny wątek skłoniła mnie do myślenia i zdałem sobie sprawę, że prawdopodobnie po prostu potrzebuję odbudować (lub wyczyścić) projekt.

W Eclipse przejdź do Project => Clean. Wybierz swój projekt, a Eclipse sam go naprawił. Dla mnie to rozwiązało problem.

Mam nadzieję że to pomoże.


Tak, wydaje się, że jest błąd w Eclipse / ADT / dex / cokolwiek, co w zasadzie pomija klasy w kompilacji. Może także przegapićApplication klasę, co prowadzi do innego błędu.
Timmmm,

13

Spotkałem ten sam problem. Powodem było to, że biblioteka, której próbowałem użyć, została skompilowana ze standardowym JDK 7.

Zrekompilowałem go z -source 1.6 -target 1.6opcjami i działało dobrze.


DZIĘKUJEMY ZA CIEBIE !!!!!!!!!!!!!!!!!!! Byłem sfrustrowany tym problemem, a ty go rozwiązałeś! To trochę ironiczne, że nawet najnowszy pakiet Jelly Bean 4.3 SDK (API 18) nadal nie może odczytać 1,7 JAR / klas. A co najgorsze, wcale nie narzeka :(
Hendy Irawan

Miałem ten sam problem. Najgorsze jest to, że pomyślałem w tej opcji, a potem zmieniłem swoje -source 1.7 na -source 1.5 (dla pewności) i problem nie został rozwiązany. Ale po przeczytaniu twojego komentarza spróbowałem ponownie z 1.6, a potem zadziałało to jak urok.
Pedro Náñez,

7

To samo działało dla mnie: Właściwości -> Ścieżka kompilacji Java -> „Zamów i eksportuj” Co ciekawe - dlaczego nie dzieje się to automatycznie? Chyba brakuje jakiegoś ustawienia. To samo wydarzyło się po aktualizacji SDK.


3

Kliknij prawym przyciskiem myszy folder projektu, poszukaj właściwości w ścieżce kompilacji Java i wybierz widoczne pliki jar. To zadziałało dla mnie.



2

Próbowałem wszystkiego z tego postu (i niektórych innych postów), ale to nie działało dla mnie, jest to zdecydowanie najstraszniejsza aktualizacja ADT, jakiej doświadczyłem, i nigdy nie zaktualizuję się bez działającej kopii zapasowej ADT.

Udało mi się go rozwiązać, usuwając projekt, a następnie dodając go ponownie za pomocą źródłowej kopii zapasowej.


2

Miałem ten sam błąd z ADT22. Rozwiązano go, sprawdzając „Prywatne biblioteki Androida” we właściwościach -> Ścieżka kompilacji Java -> Zamów i eksportuj. Jeśli korzystasz z jakichkolwiek projektów bibliotecznych, to samo należy zrobić również dla nich.


To również działało dla mnie. Uwzględniłem bibliotekę, ale zapomniałem sprawdzić w „Zamów i wyeksportuj”. Dziękuję Ci!
jmrodrigg

2

Wszystkie istniejące odpowiedzi nie działają dla mnie, ponieważ moja sprawa jest nieco inna. Uruchomienie go zajęło mi kilka godzin. Używam Eclipse.

Mój projekt na Androida zawiera inny normalny projekt Java 1.6, który wymaga pliku jar innej firmy. Sztuką jest:

  • dołącz słoik do normalnego projektu Java, aby go skompilować (tylko), nie zaznaczaj go na karcie „Zamów i eksportuj”
  • skopiuj również ten plik jar do folderu „libs” projektu Android, aby był dostępny w czasie wykonywania

Mam nadzieję, że pomoże to tym, którzy mają podobne scenariusze, jak mój.


1

czasami trzeba wziąć cały projekt zewnętrzny jako bibliotekę, a nie tylko słoik:

mój problem rozwiązany przez dodanie całego projektu (w moim przypadku google-play-services_lib) jako biblioteki, a nie tylko słoika. kroki do tego (od odpowiedzi @ style ):

  1. Plik-> Nowy-> Inne
  2. Wybierz Android Project
  3. Wybierz „Utwórz projekt z istniejącego źródła”
  4. Kliknij przycisk „Przeglądaj ...” i przejdź do poszukiwanego projektu
  5. Zakończ (teraz projekt paska akcji w twoim obszarze roboczym)
  6. Kliknij swój projekt prawym przyciskiem myszy -> Właściwości
  7. W sekcji Android-> Biblioteka kliknij Dodaj
  8. wybierz ostatnio dodany projekt -> Ok

1

Czasami dzieje się tak z powodu niewłączenia jar, na który masz zależność, ze znacznikiem „uses-libary” w pliku AndroidManifest.xml.

Upewnij się także, że powinien znajdować się wewnątrz znacznika „application”.

Pozdrowienia,

Ravi


1

Miałem ten problem i był on spowodowany brakiem „eksportowania” biblioteki. Problem polegał tylko na tym, że pliki .class dla niektórych klas nie są dostępne podczas pakowania pakietu APK. Czas kompilacji będzie działał bez wyrzucania

W moim przypadku korzystałem z klasy „CusrsorAdapter” i pod „JavaBuildPath-> Zamów i eksportuj” nie sprawdziłem obsługi jar V4. Po wybraniu problemu problem zniknął.

Aby upewnić się, że otrzymujesz błąd noClassDefFound z powyższego powodu, sprawdź logacat, zobaczysz nieznany błąd superklas w czasie wykonywania.



0

Próbowałem różnych rzeczy, a przyczyną błędu w moim przypadku był konflikt między maps.jar i Google Api w Java Build Path-> Libraries. Więc kiedy usunąłem maps.jar, działało dobrze.

Pozdrowienia,

wahib


0

upewnij się, że plik jar znajduje się w katalogu libs twojego projektu, ponieważ używasz nowszej wersji ADT wraz z zaćmieniem.


0

Mam dokładnie ten sam problem ... Aby to naprawić, po prostu usunąłem swoje prywatne biblioteki Lib z Androidem w „ścieżce kompilacji” i kliknąłem ok ... a kiedy ponownie otworzyłem op w „ścieżce kompilacji”, zaćmienie dodało je ponownie, a potem zadziałało dla mnie;) ...


0

Spędziłem dwa dni próbując rozwiązać ten problem po aktualizacji ADT. w końcu miałem szczęście, że dostałem ten post tutaj:

https://code.google.com/p/android/issues/detail?id=55304

co poprowadziło mnie we właściwym kierunku. postępując zgodnie z rozwiązaniem - pamiętaj o zastąpieniu biblioteki obsługi Androida wszystkich swoich projektów do tej samej wersji (usuń ją i zainstaluj ponownie w projektach). mam nadzieję, że to pomoże - powodzenia


0

Jeśli wolisz wiedzieć, które pliki dotyczą tego obejścia, oto, co znalazłem. Po prostu zmień plik .classpath na

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="src" path="gen"/>
    <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
    <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
    <classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
    <classpathentry kind="output" path="bin/classes"/>
</classpath>

Zamień plik .classpath we wszystkich projektach bibliotecznych i w głównym projekcie Androida. Plik .classpath znajduje się w folderze głównym projektu zaćmienia. Oczywiście, nie zapomnij dodać własnych wpisów ścieżki klasy, jeśli takie posiadasz (porównaj z aktualną wersją ścieżki .classpath).

Uważam, że jest to ten sam wynik, co przejście przez menu zaćmienia, jak wyjaśniono powyżej w komponavt-user (Eclipse / Konfiguruj ścieżkę kompilacji / Zamów i eksportuj).


0

Rozwiązaniem tutaj pracował dla mnie. Chodzi o zaimportowanie biblioteki do folderu libs, następnie zmodyfikowanie pliku build.gradle, a następnie wyczyszczenie za pomocą gradlew.


0

Jeśli zmienisz zamówienie i wyeksportujesz ścieżkę kompilacji projektu, ten błąd nie wystąpi. Innym sposobem osiągnięcia tego jest ścieżka .classpath w folderze projektu.


0

Spróbuj tego:-

Krok 1

Dodaj wszystkie biblioteki, aby zbudować pat w Eclipse (oznacza, że ​​wszystkie biblioteki będą odwoływać się do bibliotek)

Krok 2

Usuń plik R.java i ponownie skompiluj projekt. Nie martw się, R.java zostanie automatycznie odtworzona.

Wyluzuj :)


0

Jak zrozumiałem, twój projekt nie pokazuje błędów, ponieważ umieściłeś słoik. Ale słoik nie zostanie użyty, gdy Twój projekt zostanie „wyeksportowany” na urządzenie. Spróbuj tego

Projekt -> Właściwości

Ścieżka kompilacji Java / zamówienie i eksport

[✔] Twój słoik


0

Zdarza mi się to bardzo często.

Ostatnim razem, kiedy to się stało, pamiętam, było to spowodowane przełączeniem Eclipse ADT (edycja specjalna Google) na Android Studio i powrotem. Zasadniczo wypróbowałem wszystkie metody, które można znaleźć w stosie przepływu, które nie działały dla mnie.

W końcu udało mi się ponownie uruchomić aplikację (koniec z NoCalssDeffoundError), zmieniając IDE na oryginalne Eclipse (Kepler) za pomocą ADT.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.