Ich erhalte den Fehler
Ausnahme im Thread "main" java.lang.NoClassDefFoundError:
Wenn ich versuche, eine kompilierte Klasse unter Ubuntu auszuführen. Ich verwende ein sehr einfaches Helloworld-Beispiel, und die Millionen von Antworten, die bereits im Internet existieren, legen nahe, dass meine Variablen CLASSPATH und JAVA_HOME falsch gesetzt wurden.
Allerdings habe ich die etc / environment in den richtigen Ordnern und dem aktuellen Ordner bearbeitet:
PATH=".: / usr / local / sbin: / usr / lokal / bin: / usr / sbin: / usr / bin: / sbin: / bin: / usr / games"
JAVA_HOME="/ usr / lib / jvm / java-1.5.0-sun /"
CLASSPATH=".: / usr / lib / jvm / java-1.5.0-sun / lib"
und sie erscheinen, wenn ich den set-Befehl eintippe. In jedem Fall, selbst wenn ich den Klassenpfad manuell mit
einstellesudo java -cp. myfirstjavaprog.class
Ich bekomme den gleichen Fehler. Wo sollte ich sonst hinsehen? Dies muss ein Konfigurationsproblem sein.
Vielen Dank
Ich empfehle dringend, die CLASSPATH-Umgebungsvariable zu entfernen oder zumindest Ihre JRE / JDK daraus zu entfernen.
"."
ist implizit im Klassenpfad, sofern nicht anders angegeben. Und seit Java 1.3 ist es schlau genug, auf der Basis des Ausführungspfades der ausführbaren javac / java-Dateien eigene Runtime und Bibliotheken zu finden. Seitdem war es redundant, wenn nicht sogar falsch, diejenigen auf dem Klassenpfad anzugeben. Natürlich ist .../lib
falsch, da es nur jars gibt, keine Klassen, und diese werden nicht vom Klassenpfad übernommen, wenn sie nicht einzeln und explizit benannt sind.
Moderne Javas sind schlau genug, dass Sie einfach java <classname>
eingeben können, wenn Sie im Stammverzeichnis des Klassenpfads stehen, und es wird Just Work ™.
Sie mischen Äpfel und Orangen. Ein roher Java- oder Javac-Aufruf in der Befehlszeile benötigt einen Klassenpfad, um zu wissen, wo er auf seine Klassen zugreifen kann. Wenn Sie
ausführen %Vor%Sie geben Java eine Liste mit Orten, an denen nach ausführbaren Klassen gesucht werden kann. Es wird nirgendwo anders aussehen, einschließlich ".", Es sei denn, Sie sagen es zu. Also "CLASSPATH" hilft Ihnen nicht, wenn Sie
ausführen %Vor%Mit anderen Worten, es ist nur eine Abkürzung, um den Classpath erneut eingeben zu müssen.
Viele Programme sind für die Verwendung von JAVA_HOME konfiguriert, aber letztendlich benötigen Java-Programme nur einen konfigurierten Klassenpfad und den Pfad zu Java (sie finden ihn über die Variable JAVA_HOME, also brauchen Sie ihn immer noch für Dinge wie ant, aber immer noch konzeptionell) nur eine Abkürzung auch).
Ihr PATH ist der Pfad, in dem das System nach Binärdateien sucht. Wenn Java nicht auf Ihrem Pfad ist (geben Sie "which java" ein, wird Ihnen angezeigt, welche, wenn überhaupt, Java auf Ihrem Pfad ist) läuft / full / path / to / java ist identisch mit dem Ausführen von "java" und dem System finde die Binärdatei in der PATH-Variablen.
Nein, ich denke, dass CLASSPATH-Umgebungsvariablen ignoriert werden.
Der richtige Weg ist die Verwendung der Option -classpath beim Kompilieren und Ausführen. Stellen Sie es für jedes Projekt ein. Die Beweise, die du vor deinen Augen hast, sagen dir, dass es so ist.
Warum wird CLASSPATH ignoriert? Mehrere Gründe:
Ich würde Ihnen wärmstens empfehlen, einige Zeit mit dem Sun-Tutorial zu verbringen. Es wird dir später helfen - Klassenpfade sind notorische Unruhestifter.
Ok, ich habe das Problem am falschen Ort gesucht. Es stellte sich heraus, dass Java in Ordnung war und ich das Opfer war, dass ich denselben Fehler für zwei separate Probleme bekam.
Ich habe ursprünglich versucht, ein Swing-Beispiel auszuführen, das ich von der Java-Website bekommen habe, aber ich hatte nicht bemerkt, dass es eine Paketdefinition hatte. Ich habe die richtige Ordnerstruktur eingerichtet und jetzt läuft es gut.
Als ich versucht habe, ein HelloWorld-Beispiel auszuführen, hatte ich versehentlich die .class-Erweiterung eingefügt.
Beide Probleme haben zu ClassNotFound-Fehlern geführt.
Vielen Dank für Ihre Hilfe.