NoClassDefFoundError - Eclipse und Android

193

Ich habe ein Problem beim Versuch, eine Android-App auszuführen, die bis zum Hinzufügen einer zweiten externen Bibliothek zu ihrem Erstellungspfad einwandfrei funktioniert hat. Seit ich das Scoreninja-Glas hinzugefügt habe, erhalte ich jetzt einen NoClassDefFoundError, wenn ich versuche, die App auszuführen.

Hier ist die Nachricht:

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

Da alle Build-Skripte von den Android-Tools (?) Generiert werden, bin ich mir nicht sicher, was ich anderes tun kann, als Eclipse zu bereinigen, neu zu erstellen oder neu zu starten (ich habe bereits alle drei ausprobiert). Weiß jemand, wie ich das ändern kann?

An Herrn
quelle
1
Wie haben Sie die JAR-Datei hinzugefügt? Haben Sie über den Erstellungspfad -> Bibliotheken -> Externe Gläser hinzugefügt?
Teja Kantamneni
1
Klicken Sie mit der rechten Maustaste auf Projekt> Pfad erstellen
Tom R
4
Wenn Sie ADT kürzlich aktualisiert haben, sehen Sie sich Johns Antwort unten an (und stimmen Sie sie ab!) Stackoverflow.com/a/9916751/489852
Atul Goyal
1
Wenn Sie dieses Problem haben, bevor Sie direkt zu Johns Antwort springen, löst @Tills Antwort es auch für viele Menschen, auch für mich.
Carlos P
Haben Sie Multidex ausprobiert?
Ashish Rawat

Antworten:

234

Ich hatte dieses Problem nach dem Update von ADT.

Ich habe alle meine JAR-Dateien in einem Ordner namens "lib" gespeichert und die Jars auf normale Eclipse-Weise zum Erstellungspfad hinzugefügt. Dies funktionierte gut bis zu meinem Update.

Nach meinem Update erhielt ich den NoClassDefFoundError für eine Klasse, von der ich deutlich sehen konnte, dass sie in der JAR enthalten war (siehe die ReferencedLibraries-Klassen).

Die Lösung bestand darin, meine Jars aus dem Erstellungspfad zu entfernen und meinen Ordner "lib" in "libs" umzubenennen. Dies ist eine Ameisenkonvention und scheint die Art und Weise zu sein, wie das neue ADT Bibliotheken in einer APK-Datei findet und einschließt. Sobald ich das getan habe, hat alles gut funktioniert.

John O'Connor
quelle
1
Vielen Dank! Ich hatte vor dem gestrigen ADT-Update weder einen lib- noch einen libs-Ordner, und alles hat gut funktioniert. Nach dem Update hatten alle externen Gläser dieses Problem. Sie wurden dank Ihrer Antwort behoben. Ich muss deine mit der von Brian kombinieren, damit es funktioniert.
Hong
Danke John! Ich werde hinzufügen, dass ich nach dem Ändern des Ordners in libs Eclipse neu starten musste, damit es funktioniert.
Michaeldcooney
5
Nach dem Aktualisieren von ADT trat das gleiche Problem auf, aber ich habe meine Jars in einem Verzeichnis außerhalb meines Projekts aufbewahrt und sie als Benutzerbibliothek in meinen Erstellungspfad aufgenommen. Die Lösung bestand darin, die Benutzerbibliothek aus meinem Erstellungspfad zu entfernen und stattdessen Jars mit "Externe Jars hinzufügen" einzuschließen und sie dann zu exportieren, indem Sie die Kontrollkästchen auf der Registerkarte "Bestellen und Exportieren" aktivieren.
Travis
1
Ich habe android-support-v13.jar als externe Bibliothek unter C: \ android-sdk-windows \ extras \ android \ compatible \ v13 referenziert. Ich habe diese JAR in den Ordner "Project Libs" verschoben und den Verweis aus Java Build Path -> Libraries entfernt. Ein sauberer Bau und ich würde wieder gehen.
Snowwire
Hallo. Ich habe unseren Ansatz durch Hinzufügen der externen JAR-Bibliotheken in / libs ausprobiert und erhalte jetzt den folgenden Fehler: Die Konvertierung in das Dalvik-Format ist mit Fehler 1 fehlgeschlagen
Jonathan
100

Ich musste die JAR-Bibliothek nicht in Assets oder Bibliotheken einfügen, sondern nur das Kästchen für dieses JAR unter Eigenschaften -> Java-Erstellungspfad -> "Bestellen und Exportieren" ankreuzen (es wurde zuvor aufgelistet, aber nicht ausgewählt )

Bis
quelle
Vielen Dank! Ich hatte lange mit diesem Fehler zu kämpfen und alles, was ich tun musste, war das verdammte Kästchen für das Glas im Bildschirm "Bestellen und Exportieren" zu aktivieren. Komisch ist, dass ich dies nur tun musste, damit es auf einem Nook Tablet-Emulator funktioniert. Hatte kein Problem mit Geräten oder anderen Emulatoren.
Luis
5
Weiß jemand, warum Sie beides tun müssen, die Bibliothek hinzufügen und auch das Kontrollkästchen unter Bestellen und Exportieren aktivieren müssen? Gibt es einen Grund, warum ich eine externe JAR hinzufügen möchte, diese aber nicht in die Bestellung und den Export aufnehmen möchte?
Lou Morda
Ich hatte dieses Problem nach der Aktualisierung von ADT und dies löste es für mich.
cdavidyoung
5
Es hat mir geholfen, aber erst nachdem ich Project -> Clean
altumano
Vielen Dank!! Rettete mich. Musste nach der Installation von Eclipse Juno eine Bereinigung und einen Neustart durchführen.
Rynardt
68

Durch Hinzufügen der externen JAR-Datei zu Ihrem Erstellungspfad wird die JAR-Datei lediglich zu Ihrem Paket hinzugefügt, sie ist jedoch zur Laufzeit nicht verfügbar.

Damit das Glas zur Laufzeit verfügbar ist , müssen Sie:

  • Stellen Sie das Glas unter Ihren assetsOrdner
  • Fügen Sie diese Kopie des JARs in Ihren Erstellungspfad ein
  • Wechseln Sie im selben Popup-Fenster zur Registerkarte Export
  • Aktivieren Sie das Kontrollkästchen für das neu hinzugefügte Glas
Anthony Forloney
quelle
ScoreNinjaAdapter ist der Code eines anderen, aber ich wäre sehr überrascht, wenn er einen solchen Fehler enthalten würde, wie er allgemein verwendet wird. Der Fehler tritt an einer Stelle in meinem eigenen Code auf.
Tom R
Der Fehler tritt buchstäblich nur hier auf: sna = new ScoreNinjaAdapter (this, SN_APP_ID, SN_APP_KEY);
Tom R
Benötigen Sie eine importAnweisung für externe JAR-Dateien? Ich habe sie nie benutzt.
Anthony Forloney
Haben Sie versucht, die JAR-Datei aus dem assestsOrdner zu entfernen ?
Anthony Forloney
Ja. Am Ende hatte ich die Nase voll davon und lud einfach die Quelle herunter und kopierte die Quelldateien in mein Projekt. Nicht die schönste Lösung, aber es funktioniert jetzt. Danke für deine Hilfe.
Tom R
48

Ich hatte dies für MapActivity. Builds in Eclipse erhalten NoClassDefFound im Debugger.

Ich habe vergessen, eine Bibliothek zum Manifest innerhalb des <Application>...</Application>Elements hinzuzufügen

<uses-library android:name="com.google.android.maps" />
brian.clear
quelle
27

Ich habe die Reihenfolge der enthaltenen Projekte geändert (Eclipse / Build-Pfad konfigurieren / Reihenfolge und Export). Ich habe meine beiden abhängigen Projekte an den Anfang der Liste "Bestellen und Exportieren" verschoben. Es löste das Problem "NoClassDefFoundError".

Es ist seltsam für mich. Ich habe nicht von der Bedeutung der Reihenfolge der enthaltenen Bibliotheken und Projekte gehört. Android + Eclipse macht Spaß :)

Andrew Krizhanovsky
quelle
Dies ist auch die Lösung, die im zweiten Benutzerkommentar hier im Bugruport erwähnt wird: code.google.com/p/android/issues/detail?id=55304
Arberg
15

Ich bin mir nicht sicher, ob dies damit zusammenhängt oder ob Sie überhaupt noch nach einer Antwort suchen, aber ich bin auf diesen Thread gestoßen, als ich versucht habe, denselben Fehler zu untersuchen (aber möglicherweise aus verschiedenen Gründen).

Ich konnte online keine Lösungen finden, aber eine Antwort auf einen ähnlichen Thread brachte mich zum Nachdenken und erkannte, dass ich das Projekt wahrscheinlich nur neu erstellen (oder bereinigen) musste.

Gehen Sie in Eclipse zu Projekt => Bereinigen. Wählen Sie Ihr Projekt aus und Eclipse schien es selbst zu reparieren. Für mich löste dies das Problem.

Hoffe das hilft.

Brian
quelle
Ja, es scheint einen Fehler in Eclipse / ADT / dex / zu geben, bei dem Klassen im Build grundsätzlich fehlen. Es kann auch die ApplicationKlasse fehlen, was zu einem anderen Fehler führt.
Timmmm
13

Ich bin auf das gleiche Problem gestoßen. Der Grund war, dass die Bibliothek, die ich verwenden wollte, mit einem Standard-JDK 7 kompiliert wurde.

Ich habe es mit den -source 1.6 -target 1.6Optionen neu kompiliert und es hat gut funktioniert.

Assylien
quelle
DANKE DUUUUUUUUUUUUUU !!!!!!!!!!!!!!!!!!!!! Dieses Problem hat mich frustriert und Sie haben es gelöst! Es ist ein bisschen ironisch, dass selbst das neueste Jelly Bean 4.3 SDK (API 18) noch keine 1,7 JAR / Klassen lesen kann. Und das Schlimmste ist, dass es sich überhaupt nicht beschwert :(
Hendy Irawan
Ich hatte das gleiche Problem. Das Schlimmste ist, dass ich über diese Option nachgedacht habe und dann meine -source 1.7 durch -source 1.5 geändert habe (um sicher zu sein) und das Problem nicht gelöst wurde. Aber nachdem ich Ihren Kommentar gelesen hatte, versuchte ich es erneut mit 1.6 und dann funktionierte es wie ein Zauber.
Pedro Náñez
7

Dasselbe hat bei mir funktioniert: Eigenschaften -> Java-Erstellungspfad -> "Bestellen und Exportieren" Interessanterweise - warum wird dies nicht automatisch durchgeführt? Ich denke, eine Einstellung fehlt. Auch dies geschah für mich nach dem SDK-Upgrade.

vlad
quelle
3

Klicken Sie mit der rechten Maustaste auf Ihren Projektordner, suchen Sie im Java-Erstellungspfad nach Eigenschaften und wählen Sie die angezeigten JAR-Dateien aus. Es hat bei mir funktioniert.

Zacharia
quelle
2

Ich habe alles aus diesem Beitrag (und einigen anderen Beiträgen) ausprobiert und es hat bei mir nicht funktioniert. Dies ist bei weitem das schrecklichste ADT-Upgrade, das ich je erlebt habe, und ich werde niemals ohne ein funktionierendes ADT-Backup aktualisieren.

Ich habe es geschafft, es zu lösen, indem ich das Projekt entfernt und es dann mithilfe einer von mir vorhandenen Quellensicherung erneut hinzugefügt habe.

Eli
quelle
2

Ich hatte den gleichen Fehler mit ADT22. Problem beim Überprüfen von "Android Private Libraries" in den Eigenschaften -> Java-Erstellungspfad -> Bestellen und Exportieren behoben. Wenn Sie Bibliotheksprojekte verwenden, sollten Sie dies auch für diese Projekte tun.

prijupaul
quelle
Es hat auch bei mir funktioniert. Ich habe die Bibliothek aufgenommen, aber vergessen, sie unter "Bestellen und Exportieren" zu überprüfen. Danke dir!
jmrodrigg
2

Alle vorhandenen Antworten funktionieren bei mir nicht, weil mein Fall etwas anders ist. Ich habe ein paar Stunden gebraucht, um es zum Laufen zu bringen. Ich benutze Eclipse.

Mein Android-Projekt enthält ein weiteres normales Java 1.6-Projekt, für das eine JAR-Datei eines Drittanbieters erforderlich ist. Der Trick ist:

  • Fügen Sie das JAR in das normale Java-Projekt ein, damit es (nur) kompiliert werden kann. Überprüfen Sie es nicht auf der Registerkarte "Bestellen und Exportieren"
  • Kopieren Sie diese JAR-Datei auch in den Ordner "libs" des Android-Projekts, damit sie zur Laufzeit verfügbar ist

Hoffe das hilft denen, die ähnliche Szenarien wie meine haben.

Goldener Daumen
quelle
1

Manchmal muss man das gesamte externe Projekt als Bibliothek nehmen und nicht nur das Glas:

Mein Problem wurde gelöst, indem das gesamte Projekt (in meinem Fall google-play-services_lib) als Bibliothek und nicht nur das Glas hinzugefügt wurde. die Schritte dazu (von @style Antwort ):

  1. Datei-> Neu-> Andere
  2. Wählen Sie Android Project
  3. Wählen Sie "Projekt aus vorhandener Quelle erstellen".
  4. Klicken Sie auf die Schaltfläche "Durchsuchen ..." und navigieren Sie zum gewünschten Projekt
  5. Fertig stellen (Jetzt Aktionsleistenprojekt in Ihrem Arbeitsbereich)
  6. Klicken Sie mit der rechten Maustaste auf Ihr Projekt -> Eigenschaften
  7. Klicken Sie im Abschnitt Android-> Bibliothek auf Hinzufügen
  8. Wählen Sie das kürzlich hinzugefügte Projekt aus -> Ok
dvrm
quelle
1

Manchmal kommt es vor, dass jar, von dem Sie abhängig sind, nicht mit dem Tag "used-libary" in Ihrer AndroidManifest.xml enthalten ist.

Stellen Sie außerdem sicher, dass es sich innerhalb des "application" -Tags befindet.

Grüße,

Ravi

Ravi Pandit
quelle
1

Ich hatte dieses Problem und es wurde dadurch verursacht, dass die Bibliothek nicht "exportiert" wurde. Das Problem lag nur daran, dass die .class-Dateien für einige Klassen beim Packen der APK nicht verfügbar sind. Kompilierungszeit funktioniert es ohne Exporieren

In meinem Fall habe ich die Klasse "CusrsorAdapter" verwendet und unter "JavaBuildPath-> Bestellen und Exportieren" die Unterstützung für V4-JAR nicht überprüft. Sobald das ausgewählte Problem behoben ist, ist das Problem behoben.

Um sicherzustellen, dass Sie aus dem oben genannten Grund den Fehler noClassDefFound erhalten, überprüfen Sie bitte Ihre Logacat. Zur Laufzeit wird ein unbekannter Superklassenfehler angezeigt.

Sojan PR
quelle
0

Ich habe verschiedene Dinge ausprobiert und der Grund für den Fehler in meinem Fall war ein Konflikt zwischen maps.jar und Google Api in Java Build Path-> Libraries. Also, als ich die maps.jar entfernte, funktionierte es gut.

Grüße,

Wahib

Wahib Ul Haq
quelle
0

Bitte stellen Sie sicher, dass sich Ihre JAR-Datei im libs-Verzeichnis Ihres Projekts befindet, wenn Sie mit Ihrer Eclipse eine neuere ADT-Version verwenden.

Samir
quelle
0

Ich habe genau das gleiche Problem ... Um es zu beheben, habe ich einfach meine privaten Android-Bibliotheken im "Erstellungspfad" entfernt und auf "OK" geklickt ... und als ich den "Erstellungspfad" wieder öffnete, hatte Eclipse sie erneut von selbst hinzugefügt. und dann hat es bei mir geklappt;) ...

pkdkk
quelle
0

Ich habe zwei Tage lang versucht, dieses Problem zu lösen, nachdem ich ADT aktualisiert habe. Endlich hatte ich das Glück, diesen Beitrag hier zu bekommen:

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

das führte mich in die richtige Richtung. Wenn Sie der Lösung folgen, denken Sie daran, die Android-Support-Bibliothek aller Ihrer Projekte durch dieselbe Version zu ersetzen (entfernen Sie sie und installieren Sie sie erneut in den Projekten). Ich hoffe das hilft - viel Glück

Ron
quelle
0

Wenn Sie lieber wissen möchten, auf welche Dateien sich die Problemumgehung bezieht, habe ich Folgendes gefunden. Ändern Sie einfach die .classpath-Datei in

<?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>

Ersetzen Sie die .classpath-Datei in allen Bibliotheksprojekten und im Android-Hauptprojekt. Die .classpath-Datei befindet sich im Stammordner des Eclipse-Projekts. Vergessen Sie natürlich nicht, Ihre eigenen Klassenpfadeinträge hinzuzufügen, falls Sie welche haben (vergleichen Sie diese also mit Ihrer aktuellen Version von .classpath).

Ich glaube, dies ist das gleiche Ergebnis wie das Durchlaufen der Eclipse-Menüs als Komponenten-Benutzer (Eclipse / Build-Pfad konfigurieren / Reihenfolge und Export).

Arberg
quelle
0

Die Lösung hier hat bei mir funktioniert. Es geht darum, die Bibliothek in den Ordner libs zu importieren, dann die Datei build.gradle zu ändern und dann mit gradlew zu bereinigen.

gabr10
quelle
0

Wenn Sie Ihre Reihenfolge ändern und in Ihren Projekterstellungspfad exportieren, tritt dieser Fehler nicht auf. Die andere Möglichkeit, dies zu erreichen, ist .classpath in Ihrem Projektordner.

Geekgugi
quelle
0

Versuche dies:-

Schritt 1

Fügen Sie alle Bibliotheken hinzu, um pat in Eclipse zu erstellen (bedeutet, dass alle Bibliotheken referenziert werden).

Schritt 2

Löschen Sie die R.java-Datei und erstellen Sie das Projekt erneut. Keine Sorge, R.java wird automatisch neu erstellt.

Ausruhen :)

user1606195
quelle
0

Wie ich verstanden habe, zeigt Ihr Projekt keine Fehler, da Sie das Glas eingeschlossen haben. Das Glas wird jedoch nicht verwendet, wenn Ihr Projekt auf das Gerät "exportiert" wurde. Versuche dies

Projekt -> Eigenschaften

Java Build Path / Order und Export

[✔] Dein Glas


quelle
0

Das passiert mir ziemlich oft.

Das letzte Mal, an das ich mich erinnern kann, wurde durch das Umschalten von Eclipse ADT (Google Special Edition) auf Android Studio und das Zurückschalten verursacht. Ich habe im Grunde alle Methoden ausprobiert, die ich im Stackoverflow finden kann und die bei mir nicht funktioniert haben.

Schließlich brachte ich die App wieder zum Laufen (kein NoCalssDeffoundError mehr), indem ich meine IDE mit ADT auf die ursprüngliche Eclipse (Kepler) umstellte.

Tyolab
quelle