2013-08-02 23 views
5

Meine Verzeichnisstruktur sieht so aus.JVM kann meine Klasse nicht finden: java.lang.NoClassDefFoundError

PackagesUnit3/com/myname/Start/PackagesTest.java
(diese Klasse meine Haupt- und die Import-Anweisung „import com.systems.mui enthält. *;)

PackagesUnit3/com/Systeme /mui/Test.java
(diese Klasse enthält das Paket Anweisung „Paket com.systems.mui;“)

mit PackageUnit3 als mein Basisverzeichnis I erfolgreich beiden Klassen kompilieren kann mit der Anweisung

"javac com/myname/start/PackagesTest.java" 

Allerdings kann ich den Code nicht mit dem .class Dateien für jede der Java-Klassen

"java com.myname.start.PackagesTest" 

Error: "Exception in thread "main" java.lang.NoClassDefFoundError: com/myname/start/PackagesTest (wrong name: PackagesTest)" 

Der complier erfolgreich generierte Befehl ausführen und platziert sie in der gleichen Position wie die Quelldateien.

Laut Horstmann, "Core Java" 9. Ausgabe. p. 186, meine "Java" Befehlssyntax sollte funktionieren.

Ich sollte nicht das aktuelle Verzeichnis (".") Angeben müssen, da ich nicht die Option Classpath (-cp) verwende.

Ein Hinweis: Ich verwendete den "SUBST R:" Befehl, um das PackagesUnit3-Verzeichnis als Basisverzeichnis einzurichten. Meine tatsächliche Befehlszeile sieht wie folgt aus: R:>

Irgendwelche Vorschläge ??

+2

+1, weil Ihr Fragetitel mich zum Lachen brachte. :) –

+2

'java com.myname.start.Packages.test' - ist das ein Tippfehler? Weil Ihr Klassenname 'PackagesTest' ist. –

+0

Ich schlage vor, Sie reparieren Ihre Befehlszeile. Wenn Ihre PackagesTest-Klasse über die main() -Methode verfügt, sollte Ihre Befehlszeile java com.myname.start.PackagesTest lauten. – Olaf

Antwort

10

die Ausnahme gegeben, es sieht aus wie Sie eine package Aussage sind vermisst:

package com.myname.start; 

Ihr Paket Erklärung sollte die Verzeichnisstruktur, und dann wird die Klasse mit den richtigen vollständig qualifizierten Namen wird generiert entspricht der com.myname.start.PackageTest.

Entweder in einer IDE kompilieren, die Dinge für Sie sortiert werden, oder mit einem optionalen -d Argumente aus der Wurzel Ihrer Paketstruktur zusammenstellen, um das Root-Ausgabeverzeichnis angeben, zum Beispiel

$ javac -d bin com/myname/start/*.java 
$ java -cp bin com.myname.start.PackageTest 
+0

Ich arbeite immer von einer IDE, also bin ich kein Experte, aber wird nicht CLASSPATH irgendwie eingestellt werden müssen? –

+1

@EdwardFalk: Nein - Sie können immer '-cp' oder' --classpath' verwenden, aber standardmäßig wird das aktuelle Verzeichnis verwendet. –

+0

Jon - Sie sind absolut richtig - Ich habe nicht die Paket-Anweisung, die Sie in der PackagesTest-Quelldatei angegeben. Es läuft jetzt ohne den Laufzeitfehler. T.J. Ermahnung war richtig. –

0

Ich habe auf dieser Option aktiviert ist, neu erstellt das Szenario und Sie haben Recht ... alle Klassen sind Unter der Annahme, öffentliche, mit richtigen Paket Erklärungen und aus dem Stammverzeichnis kompiliert, Klasse Test werden, da sie erfolgreich kompilieren verweist nicht auf andere Klassen (oder Klassen aus verschiedenen Paketen). No -cp Option ist erforderlich

Beim Kompilieren der Klasse PackagesTest kann die Klasse Test nicht gefunden werden. Aber indem -cp . hinzugefügt wird, kompiliert es erfolgreich.

Sobald beide Dateien kompiliert werden, wird versucht, PackagesTest 'Haupt zu finden, auch die Klasse Test finden. Aber durch Hinzufügen -cp , läuft es reibungslos.

Mit der Option -verbose können Sie sehen, wo der Befehl javac (und java) nach Klassen sucht, da er den Standardklassenpfad anzeigt, der nicht "." Enthält. (das lokale Verzeichnis)

Verwandte Themen