NoClassDefFoundError: falscher Name

Ich habe ein Java-Programm geschrieben, um RESTful-Web-Services mit Netbeans7.0.1 zu testen, und es funktioniert gut. Jetzt habe ich die Datei build.xml geschrieben, um den Code zu kompilieren, und wenn ich versuche, die generierte .class-Datei auszuführen, habe ich immer diese Ausnahme bekommen:

Exception in thread "main" java.lang.NoClassDefFoundError: ClientREST (wrong name: clientrest/ClientREST) at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632) at java.lang.ClassLoader.defineClass(ClassLoader.java:616) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141) at java.net.URLClassLoader.defineClass(URLClassLoader.java:283) at java.net.URLClassLoader.access$000(URLClassLoader.java:58) at java.net.URLClassLoader$1.run(URLClassLoader.java:197) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:190) at java.lang.ClassLoader.loadClass(ClassLoader.java:307) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) at java.lang.ClassLoader.loadClass(ClassLoader.java:248) Could not find the main class: ClientREST. Program will exit. 

Der Name und der Pfad stimmen, also irgendwelche Gedanken, warum ich diese Ausnahme bekomme?

Ausnahme im Thread “main” java.lang.NoClassDefFoundError: ClientREST

Also hast du es als java ClientREST . Es erwartet eine ClientREST.class ohne irgendein package .


(falscher Name: ClientRest / ClientREST)

Hey, die class versucht dir zu sagen, dass sie ein package clientrest; . Sie müssen es vom Paketstamm aus ausführen. Gehen Sie einen Ordner nach oben, so dass Sie sich in dem Ordner befinden, der wiederum den Ordner clientrest enthält, der das Paket darstellt, und führen Sie dann java clientrest.ClientREST .

Sie sollten nicht in den clientrest gehen und java ClientREST ausführen.

Ich habe diesen Fehler mit der Befehlszeile Java festgestellt:

java -cp stuff/src/mypackage Test

wo sich Test.java im Paket mypackage .

Stattdessen müssen Sie den classnpfad -cp auf den -cp , in diesem Fall src, und dann das Paket dem Dateinamen voranstellen.

Also wird es am Ende so aussehen:

java -cp stuff/src mypackage.Test

Um weiter auf Garry’s Antwort hinzuweisen: Der classnpfad ist das Basisverzeichnis, in dem sich die class selbst befindet. Also wenn die classndatei hier ist –

/home/person/javastuff/classes/package1/subpackage/javaThing.class

Sie müssten den classnpfad wie folgt referenzieren:

/ home / person / javastuff / classn

Um also von der Befehlszeile aus zu starten, wäre der vollständige Befehl –

java -cp / home / person / javastuff / klassen paket1 / unterpaket / javaThing

dh die Vorlage für das Obige ist

java_executable -cp classnpfad the_class_itself_within_the_class_path

So konnte ich endlich meinen arbeiten, ohne den classnpfad in der Umgebung zu haben

Wahrscheinlich existiert der Speicherort, auf dem Sie Ihre classn generieren, nicht im classnpfad. Während des Laufens verwenden Sie den jvm arg-verbose beim Ausführen und überprüfen Sie das Protokoll, ob die class geladen wird oder nicht.

Die Ausgabe gibt Ihnen auch einen Hinweis darauf, woher die clasess geladen wird. Stellen Sie sicher, dass Ihre classndateien an diesem Ort vorhanden sind.

Versuchen Sie die folgende Syntax:

Angenommen, die Java-Datei befindet sich hier: fm/src/com/gsd/FileName.java

Sie können also die folgende Syntax verwenden:

(Machen Sie das aktuelle Verzeichnis zu ‘fm’)

java src.com.gsd.FileName