19 Stimmen

Wie kann ich eine Java-Klasse in einem Paket ausführen?

Ich habe zwei Java-Klassen wie folgt

App1 ohne ein Paket:

class App1 {
    public static void main(String[] args) {
        System.out.println("App1 hello world...");
    }
}

App2 in einem Paket:

package java.java.package1;    
class App2 {
    public static void main(String[] args) {
        System.out.println("App2 hello world...");
    }
}

Ich kann sie beide zusammenstellen:

D:\javaTest>javac App1.java

D:\javaTest>javac App2.java

Ich kann jedoch nur die erste ausführen:

D:\javaTest>java App1
App1 hello world...

D:\javaTest>java java.java.package1.App2

Exception in thread "main" java.lang.NoClassDefFoundError: java/java/package1/App2
Caused by: java.lang.ClassNotFoundException: java.java.package1.App2
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: java.java.package1.App2.  Program will exit.

Wie kann ich die App2 ?

32voto

Jon Skeet Punkte 1325502

Wenn Sie die Quelle in einer dem Paketnamen entsprechenden Verzeichnishierarchie ( D:\javaTest\java\java\package1\App1.java ), und kompilieren/ausführen von der Wurzel der Hierarchie ( D:\javaTest ), hätten Sie dieses Problem nicht:

D:\javaTest>javac java\java\package1\App1.java

D:\javaTest>java java.java.package1.App1
App2 hello world...

Sie können auch kompilieren, indem Sie die -d damit die Klassen in eine solche Verzeichnishierarchie verschoben werden:

javac -d . App2.java
java java.java.package1.App2

Beachten Sie, dass Sie keinen Paketnamen verwenden sollten, der mit java und spätere Versionen des JDK lösen eine SecurityException aus. Siehe diese Frage für weitere Informationen.

4voto

Jerry Ludwig Punkte 41

Sie erstellen ein neues Verzeichnis. Dies ist das Verzeichnis, das Ihre Arbeit enthält, und nicht der Anfang Ihrer Pakete.

Ich erstelle zum Beispiel den Ordner /terri, um zu beginnen.

Ich erstelle dann die Ordnerstruktur /clarie/andrea darunter. Mein Paket wird in diesem Beispiel claire.andrea heißen. Normale Paketnamen beginnen mit com und dann einem Firmennamen oder etwas Ähnlichem (oder java für Standard-Java-Pakete, also verwenden Sie das nicht: wie java.lang.*).

Im andrea-Ordner erstelle ich eine Java-Datei namens Saluton.java mit der Klasse Saluton (die einfach nur Hallo ausgibt). Der Klassenname und der Dateiname müssen übereinstimmen.

Zum Kompilieren aus dem Ordner terri/: javac . \claire\andrea\Saluton.java Dadurch wird eine Saluton.class in der Datei \terri\claire\andrea\Saluton.class

Zum Ausführen: (wieder von /terri), mache ich: java -cp . claire.andrea.Saluton Das heißt, benutze den Klassenpfad aus meinem aktuellen Verzeichnis.
Mein Hauptprogramm befindet sich im Paket claire.andrea und der Klassenname ist Saluton.

Hier ist der Lauf: \terri java -cp . claire.andrea.Saluton

"Hallo Welt".

Zusammenfassend lässt sich sagen, dass der Paketname der zugrunde liegenden Verzeichnisstruktur entsprechen muss. Die Datei (wenn sie auf ein Paket verweist) muss innerhalb der Verzeichnisstruktur liegen, auf die sie verweist. Wenn ich Saluton.java in /terri mit dem Paket claire.andrea kompiliere, habe ich keine Möglichkeit gefunden, es auszuführen, aber es lässt sich gut kompilieren.

Außerdem muss der Dateiname der Klasse mit der öffentlichen Klasse in dieser Datei übereinstimmen.

Zur Ausführung: Paket.Klasse. Im Allgemeinen werden Pakete nicht großgeschrieben, Klassen dagegen schon.

1voto

Sumit Singh Punkte 24033

Sie müssen die -d directory Optionen denn

Legen Sie das Zielverzeichnis für Klassendateien fest. Wenn eine Klasse Teil eines Pakets ist, javac legt die Klassendatei in einem Unterverzeichnis ab, das den Namen des Pakets widerspiegelt, erstellt Verzeichnisse nach Bedarf. Wenn Sie zum Beispiel -d c angeben: \myclasses und die Klasse heißt com.mypackage.MyClass, dann heißt die Klassendatei c: \myclasses\com\mypackage\MyClass.class.

0voto

Mainguy Punkte 1600

App2 muss sich im Verzeichnis java/java/package1 befinden. In java müssen der Paketname und das Verzeichnis für den Quellcode übereinstimmen. Haben Sie keinen Kompilierungsfehler erhalten?

0voto

Saroj Punkte 1

Überprüfen Sie den Wert Ihres Klassenpfads mit dem folgenden Befehl in der Eingabeaufforderung echo %CLASSPATH%

Prüfen Sie, wo Ihre Klasse erstellt wird. Um ein Java-Quellprogramm zu kompilieren, müssen Sie den von Ihnen angegebenen Pfad daraufhin überprüfen, ob die Java-Datei dort vorhanden ist oder nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X