2012-06-14 7 views
9

ich die zwei Java-Klasse haben wie folgt:wie die Java-Klasse laufen mit hat Paketnamen

1.

none package class 
System.out.println("App1 hello world..."); 

2.

has package 
package java.java.package1; 

System.out.println("App1 hello world..."); 

dann, ich kompilieren und ausführen sie, das Ergebnis wie folgt:

D:\javaTest>javac App1.java 

D:\javaTest>javac App2.java 

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

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

Exception in thread "main" java.lang.NoClassDefFoundError: java/java/package1/Ap 
p2 
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. 

so wie zu laufen die Klasse App2?

Antwort

18

Sie kompilieren sollten die -d Option, so dass die Klassen in einer entsprechenden Verzeichnishierarchie Ende:

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

Außerdem sollten Sie nicht den Namen eines Pakets mit java in erster Linie beginnend verwenden.

Auch, wenn Sie die Quelle in eine entsprechende Verzeichnishierarchie und compile/run von der Wurzel der Hierarchie, haben Sie dieses Problem nicht.

+1

Zusätzlich zu dem, was Chuck Norris sagte: Wenn Sie kompilieren und Sie sind im Wurzelverzeichnis des Verzeichnisses Hierarchie, müssen Sie '/' anstelle von '.'. Wenn Sie das Programm ausführen, ist es umgekehrt: Verwenden Sie '.' Anstelle von '/'. –

0

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?

1

Sie haben -d directory Options..because

das Zielverzeichnis für Klassendateien Set zu setzen. Wenn eine Klasse Teil eines -Pakets ist, fügtjavac die Klassendatei in ein Unterverzeichnis ein, das den Paketnamen enthält und Verzeichnisse nach Bedarf erstellt. Wenn Sie beispielsweise -d c: \ myclasses angeben und die Klasse com.mypackage.MyClass heißt, heißt die Klassendatei c: \ myclasses \ com \ mypackage \ MyClass.class.

0

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

Zum Beispiel, ich erstelle Ordner/Terri zu starten.

Ich dann die Ordnerstruktur/clarie/andrea darunter erstellen. 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 benutze das nicht: wie java.lang. *).

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

zu kompilieren, aus dem terri/Ordner. Javac \ claire \ andrea \ Saluton.java Dies wird eine Saluton.class in der \ terri erstellen \ claire \ andrea \ Saluton.class

auszuführen: (wieder von/terri), ich mache: java -cp. claire.andrea.Saluton Was sagt, verwenden Sie Klassenpfad aus meinem aktuellen Verzeichnis.
Mein Hauptprogramm ist im Paket claire.andrea und der Klassenname ist Saluton.

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

"Hallo Welt".

Um es zusammenzufassen, stimmt der Paketname weitgehend mit der zugrunde liegenden Verzeichnisstruktur überein. Die Datei (wenn sie auf ein Paket verweist) muss in der Verzeichnisstruktur enthalten sein, auf die sie verweist. Wenn ich Saluton.java in/terri mit dem Paket claire.andrea kompiliere, habe ich keinen Weg gefunden, es auszuführen, es kompiliert gut.

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

Zum Ausführen, package.Class. Im Allgemeinen werden Pakete nicht aktiviert und Klassen sind.

Verwandte Themen