Jeder weiß, wie man Java-Quellcode kompiliert, das heißtcmdzum Verzeichnis gehen, in dem sich die Quelldatei befindetjavac **.javaund das war's. Wenn das Programm eine Paketdeklaration hat, kann man dann trotzdem einfach direktjavac **.java? Die Antwort ist natürlichnein, unten ist ein einfaches Beispiel, um zu beweisen, was passiert, wenn man direktjavac **.javakompiliert.
Wie folgt: Im Verzeichnis F:\javaweb2班\20160531 gibt es eine Datei A.java. Beachten Sie, dass die Quelldatei eine Paketdeklaration hat:
Beispiel

Jetzt kompilieren Sie A.java direkt mit javac A.java, und das Ergebnis ist wie folgt:
Wir können deutlich sehen, dass die Bytecode-Datei A.class im aktuellen Verzeichnis erschienen ist. Kann sie direkt so ausgeführt werden? Probieren wir es aus!
Dieser Fehler ist aufgetreten, weil wir eine Paketdeklaration in A.java haben. Beim Ausführen der A.java-Quelldatei sucht die Java-Virtual-Machine zuerst nach der Bytecode-Datei im aktuellen Verzeichnis von A.java. Obwohl sie sie diesmal findet, geht die Java-Virtual-Machine aufgrund der Paketdeklaration in A.java anschließend zum Paketverzeichnis, um die A.class-Bytecode-Datei zu suchen. Nur wenn sie sie dort findet, kann sie erfolgreich ausgeführt werden. Wenn Sie es nicht glauben, machen wir ein Experiment! (Hier zeige ich Ihnen auch, wie man A.java mit einer Paketdeklaration kompiliert, das heißt Paketkompilierung mit javac -d . A.java)
Jetzt ist die Paketkompilierung erfolgreich. An diesem Punkt können wir sehen, dass die A.class-Datei im Verzeichnis mypack erschienen ist. Versuchen wir, sie auszuführen.
An diesem Punkt stellen wir fest, dass die Ausführung immer noch fehlschlägt?? Warum ist das so?? Dies ist ein Problem, auf das viele Anfänger stoßen. Hier muss sich jeder einen Punkt merken: Der Parameter des Java-Befehls ist der "vollqualifizierte Klassenname", nicht der "Dateiname".
Der vollständig qualifizierte Klassenname dieses Quellprogramms sollte mypack.A sein, daher sollte es so geschrieben werden:java mypack.A
Jetzt kann es erfolgreich ausgeführt werden!
Nicht so schnell!! Unten gibt es noch spannenderes Zeug! Was die Verwendung von Paketen angeht, wie könnten wir Paketimport, Erstellung und Kompilierung nicht erklären!
Diesmal führen wir eine weitere Testklasse Test.java ein, mit folgendem Code:
Beispiel
Kompilieren und ausführen wie folgt:

Das Ergebnis ist, wie erwartet, sicherlich, dass es kompiliert und ausgeführt wird. Der Ausführungsablauf ist folgendermaßen: Nachdem Test.java kompiliert wurde, befindet sich die erzeugte Bytecode-Datei im aktuellen Verzeichnis (während der Kompilierung wird gesucht, ob es eine A.class-Datei in mypack gibt; wenn nicht, schlägt die Kompilierung fehl). Während der Ausführung, da Test.java keine Paketdeklaration hat, findet die Java Virtual Machine zuerst Test.class im aktuellen Verzeichnis und führt sie aus. Wenn die Ausführung die Stelle erreicht, an der Klasse A im Programm referenziert wird, prüft die Java Virtual Machine, ob es eine A.class-Bytecode-Datei im aktuellen Verzeichnis gibt. Zu diesem Zeitpunkt, selbst wenn sie eine findet, wird sie gemäß dem Paketimport im Quellprogramm in das Paket eintreten, um nach A.class zu suchen. Nur wenn sie sie findet, kann die Ausführung erfolgreich sein (tatsächlich hat sie bereits während der Kompilierungsphase gesucht!)
Einen Schritt weiter: Wenn wir der Testklasse Test.java eine Paketdeklaration package mypack1; hinzufügen,
Jetzt führen wir die Paketkompilierung für Test.java durch. Hier möchte ich noch einmal zwei Wissenspunkte erklären: 1. Beim Paketieren und Kompilieren wird das Paketverzeichnis automatisch erstellt, und Sie müssen nicht selbst einen Ordner mit dem Paketnamen anlegen; 2. Wenn sich mehrere Java-Dateien im aktuellen Verzeichnis befinden, die kompiliert oder paketkompiliert werden müssen,javac -d . *.javaDer Befehl kann alle Java-Dateien im aktuellen Verzeichnis kompilieren oder paketkompilieren, je nachdem, ob im Programm eine Paketdeklaration vorhanden ist.
Wie führen wir nun die Datei Test.java aus? java Test.java? Offensichtlich funktioniert das nicht. Denken Sie an das, was ich früher gesagt habe: Der Parameter des Java-Befehls ist der "vollqualifizierte Klassenname", nicht der "Dateiname".
Deshalb müssen wir es so ausführen:

Auf diese Weise:
Alles oben Besprochene ist der allgemeine Fall, das heißt, der Klassenpfad befindet sich im aktuellen Verzeichnis. Wenn der Klassenpfad nicht im aktuellen Verzeichnis liegt, kann es dann trotzdem ausgeführt werden? Und wie sollte es ausgeführt werden?
Wie in der folgenden Abbildung gezeigt, habe ich Test.java in das Verzeichnis eine Ebene darüber gelegt. In diesem Fall müssen wir den Klassenpfad-Parameter selbst festlegen. Zum Beispiel:F:\javaweb2班>java -cp F:/javaweb2class/20160531 mypack1.java; oder in einem beliebigen Verzeichnis:java -cp F:/javaweb2class/20160531 mypack1.java

Auf diese Weise gelingt es! Analysiert und versteht den konkreten Ausführungsablauf selbst!
Zusammenfassung
- 1. Der Parameter des Java-Befehls ist der "vollqualifizierte Klassenname", nicht der "Dateiname".
- 2. Beim Paketieren und Kompilieren wird das Paketverzeichnis automatisch erstellt, und Sie müssen nicht selbst einen Ordner mit dem Paketnamen anlegen.
- 3. Wenn sich mehrere Java-Dateien im aktuellen Verzeichnis befinden, die kompiliert oder paketkompiliert werden müssen,javac -d . *.javaDer Befehl kann alle Java-Dateien im aktuellen Verzeichnis kompilieren oder paketkompilieren, je nachdem, ob im Programm eine Paketdeklaration vorhanden ist.
- 4. Wenn der Klassenpfad nicht im aktuellen Verzeichnis liegt, müssen Siejava -cp ...verwenden, wie zum Beispiel:java -cp F:/javaweb2class/20160531 mypack1.java。
- 5. Machen Sie sich den Prozess klar, durch den die Java Virtual Machine Bytecode-Dateien anhand von Paketdeklarationen und Paket-Imports ausführt.
Originaladresse: https://www.cnblogs.com/xiaoming0601/p/5551113.html