[CENTOS] Durch die Überprüfung der Funktionsweise von Java unter Linux konnte ich die Kompilierung und Hierarchie verstehen.

Neulich habe ich in einer internen Lernsitzung etwas über Java-Kompilierung und Paketverwaltung gelernt. Da ich nur bearbeiten konnte, was die Umgebung mit Eclipse erstellt wurde, gab mir das Festlegen von Kompilierungsoptionen und das Erstellen von Paketen die Möglichkeit, das Verhalten der Kompilierung und das Verwalten von Paketen besser zu verstehen. Ich werde es hier als Bewertung meiner selbst ausgeben.

Umgebung

・ CentOS7.4 -Java 1.8.0_171 ・ Vi 7.4 ・ Baum 1.6.0

Vorbereitung

Erstellen Sie ein Verzeichnis, um den Vorgang zu überprüfen.

# cd
# mkdir -p JAVA/src
# cd JAVA
# mkdir class

Kompilieren und ausführen

Wenn Sie die Verzeichnishierarchie aus dem aktuellen Verzeichnis mit dem Befehl tree betrachten, sieht dies wie folgt aus.

# tree --charset=c
.
|-- class
`-- src

Wechseln Sie zunächst zu src und erstellen Sie eine Testquelldatei.

# cd src
# vi TestJava.java

TestJava.java



class TestJava {

    public static void main(String[] args){

        System.out.println("test");

    }

}

Wenn Sie nach dem Erstellen mit den oben genannten Inhalten die Verzeichnishierarchie überprüfen, sieht dies wie folgt aus.

# tree ../ --charset=c
../
|-- class
`-- src
    `-- TestJava.java

Kompilieren Sie die erstellte Datei. Wenn Sie hier kompilieren, ohne Optionen anzugeben, wird eine Klassendatei unter src erstellt. Es ist jedoch schwierig, die Klassendatei nach dem Erstellen in ein anderes Verzeichnis zu verschieben. Selbst in Eclipse wurde dieser Bereich automatisch erstellt, sodass ich ihn nicht spürte. Wenn Sie ihn jedoch manuell ausführen, geben Sie die Option an, damit er zum Zeitpunkt der Erstellung im angegebenen Verzeichnis (Klassenverzeichnis) erstellt wird. Verwenden Sie die Option "-d", um das Verzeichnis anzugeben.

# javac -d ../class TestJava.java

Überprüfen Sie nach der Ausführung den Status der Verzeichnishierarchie.

# tree ../ --charset=c
../
|-- class
|   `-- TestJava.class
`-- src
    `-- TestJava.java

Im angegebenen Klassenverzeichnis wurde eine Datei erstellt. Auf diese Weise werden die Quelldatei und die Klassendatei getrennt verwaltet, sodass niemand die Quelle ohne Erlaubnis bearbeiten kann.

Um dies zur Laufzeit von einem anderen als dem Klassenverzeichnis auszuführen, geben Sie den Dateipfad mit der Option "-cp" an. Er kann auch ausgeführt werden, wenn sich keine Datei im aktuellen Verzeichnis befindet. Dies ist die Methode, wenn CLASSPATH, das von der Umgebungsvariablen festgelegt wurde, in der Befehlszeile ausgeführt wird.

# java -cp ../class TestJava
test

Es wurde ausgeführt und "Test" ausgegeben.

Paket

Wenn die Anzahl der Klassendateien zunimmt, verwalten Sie die Pakete separat, um die Verwaltung zu vereinfachen. Es ist auch gut, Namenskonflikte zu vermeiden, selbst wenn Sie bei der Entwicklung mit mehreren Personen eine Datei mit demselben Namen erstellen. Erstellen Sie zunächst ein Verzeichnis für das Paket im Verzeichnis src, löschen Sie die Klassendatei einmal und überprüfen Sie sie.

# mkdir pack1
# mv TestJava.java pack1
# rm -rf ../class/TestJava.class
# cd pack1
# tree ../../ --charset=c
../../
|-- class
`-- src
    `-- pack1
        `-- TestJava.java

Nur im src-Verzeichnis wird eine Datei im Paketverzeichnis erstellt.

Fügen Sie bei Verwendung des Pakets die folgende Beschreibung am Anfang der Quelle hinzu.

Paket Paketname

Ein Beschreibungsbeispiel lautet wie folgt.

TestJava.java


package pack1;

class TestJava {

    public static void main(String[] args){

        System.out.println("test");

    }

}

Beschreiben Sie den erstellten Paketnamen am Anfang der Quelldatei folgendermaßen. Dieses Mal werden wir nur mit einem einfachen Paketnamen testen, aber in Wirklichkeit werden wir ein Verzeichnis erstellen, indem wir eine Hierarchie wie "jp / co / testcomp / cv" ausgraben. Wenn es dann in der Quelle beschrieben wird, wird der Hierarchiebegrenzer durch "." Dargestellt. Wie `Paket jp.co.testcomp.cv;`. Wie im Beispiel wird empfohlen, den Paketnamen mit der Umkehrung des Internetdomänennamens zu beginnen. Dies liegt daran, dass empfohlen wird, das Paket von dem Domainnamen zu benennen, der sich je nach Land oder Unternehmen unterscheidet, damit der Paketname bei der Verwendung von Programmen anderer Unternehmen oder anderer Länder nicht in Konflikt gerät.

Lass es uns erneut versuchen.

# javac -d ../class pack1/TestJava.java
# tree ../ --charset=c
../
|-- class
|   `-- pack1
|       `-- TestJava.class
`-- src
    `-- pack1
        `-- TestJava.java

Für jedes Verzeichnis pack1 im Klassenverzeichnis wurde eine Datei erstellt. Wenn die Quelldatei keine Paketbeschreibung enthält, wird nur die Klassendatei ohne den Ordner pack1 im Klassenverzeichnis erstellt.

Es ist gut, die Hierarchie der Quell- und Klassendateien abzugleichen, um keine Verwirrung im Speicherziel zu verursachen. Vergessen Sie daher nicht die Beschreibung des Pakets. (Obwohl Eclipse Fehler erkennen kann)

Die Ausführung ist übrigens wie folgt festgelegt.

# java -cp ../class pack1.TestJava
test

Geben Sie im Klassenpfad das Klassenverzeichnis an, geben Sie es jedoch im Paket als `` `pack1.TestJava``` an. Es kann nicht wie im Fehlerbeispiel mit der angegebenen Methode ausgeführt werden.

Fehlerbeispiel)

# java -cp ../class/pack1 TestJava
# java -cp  ../class TestJava
# java  ../class/pack1/TestJava

Mehrere Klassen kompilieren und ausführen

Zuerst habe ich die Datei wie folgt geändert.

TestJava.java


package pack1;

class TestJava {
    int i;
    char c;

    TestJava(){
        i = 1;
        c = 'A';
    }

    TestJava( int p_i, char p_c){
        i = p_i;
        c = p_c;
    }

    void go() {
        System.out.println("GO!");
        System.out.println("i =" + i + "\n" + "c = " + c );
    }

    public static void main(String[] args){

        System.out.println("test2");
        TestJava tj = new TestJava();
        TestJava tj_2 = new TestJava( 2, 'B');
        tj.go();
        tj_2.go();
    }

}

Erstellen Sie Ihre eigene Instanz und geben Sie 2 vom Konstruktor vorbereitete Muster aus. Es ist auch ein Testprogramm, das sogar seine eigene Methode ausgibt.

Ich habe eine andere Datei erstellt.

TestJava2.java


package pack1;

class TestJava2 {

    public static void main(String[] args){
        System.out.println("TestJava2");
        TestJava tj2 = new TestJava();
        TestJava tj2_2 = new TestJava2( 2, 'B');
        tj2.go();
        tj2_2.go();
    }

}

Dies ist der Inhalt, um eine Instanz aus der TestJava-Klasse zu erstellen und auszuführen.

Löschen Sie die einmal erstellte Klassendatei und machen Sie es wie folgt.

# tree ../../ --charset=c
../../
|-- class
|   `-- pack1
`-- src
    `-- pack1
        |-- TestJava.java
        `-- TestJava2.java

Es gibt folgende Möglichkeiten, diese beiden Dateien zu kompilieren.

    1. Kompilieren Sie mehrere Dateien gleichzeitig.

javac -d ../../class TestJava.java TestJava2.java



 2. Kompilieren Sie die aufrufende Datei und anschließend die aufrufende Datei
 In diesem Fall verwendet TestJava2.java TestJava.java, daher müssen Sie auch den Klassenpfad angeben.

javac -d ../../class TestJava.java

javac -d ../../class -cp ../../class TestJava2.java


 Klicken Sie hier für das Ausführungsergebnis.

java -cp ../../class pack1.TestJava2

TestJava2 GO! i =1 c = A GO! i =2 c = B



 das ist alles.


Recommended Posts

Durch die Überprüfung der Funktionsweise von Java unter Linux konnte ich die Kompilierung und Hierarchie verstehen.
Ich habe das Verhalten von Java Scanner und .nextLine () nicht wirklich verstanden.
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Empfehlung der Set-Operation durch Java (und Verständnis von Equals und HashCode)
Ich habe versucht, die Methoden von Java String und StringBuilder zusammenzufassen
Ich habe versucht, die Grammatik von R und Java zu übersetzen [Von Zeit zu Zeit aktualisiert]
Ich habe die Eigenschaften von Java und .NET verglichen
Ich wurde von der Dunkelheit Romajis verschluckt, als ich versuchte, meinen Namen in Romaji umzuwandeln
Die CSV-Datei, die ich herunterladen konnte, wurde plötzlich auf der Seite angezeigt.
Der Teil, dem ich in "Einführung in Ajax in Java-Webanwendungen" von NetBeans verfallen war
Ich war süchtig nach der Aufzeichnung des zugehörigen Modells
In der Abbildung verstandene Java-Klassen und -Instanzen
Ich habe die Typen und Grundlagen von Java-Ausnahmen zusammengefasst
20190803_Java & k8s on Azure Die Geschichte vom Festivalbesuch
Befehl zum Überprüfen der Anzahl und des Status von Java-Threads
Ich war süchtig danach, die Update-Anweisung in MyBatis zu wiederholen
Verstehen Sie das Singleton-Muster, indem Sie Java- und JavaScript-Code vergleichen
Ich war süchtig nach Laradock + VSCode + xdebug
Verstehen Sie das Iterator-Muster, indem Sie Java- und JavaScript-Code vergleichen
Wiedereinführung in Java for Humanities 0: Den Akt der Programmierung verstehen
[Java] Ich habe über die Vorzüge und Verwendungen von "Schnittstelle" nachgedacht.
Ich möchte die Notwendigkeit des Testens beurteilen, indem ich die Unterschiede der Klassendateien beim Refactoring von Java vergleiche.
[Scala] [Java] Ich habe versucht, die Sicherheitsanfälligkeit beim Durchqueren von Zip4j durch Bytecode-Operation zu beheben.
[Java] Verschiedene Zusammenfassungen an die Leiter von Klassen und Mitgliedern
Ich möchte den Ablauf der Spring-Verarbeitungsanforderungsparameter verstehen
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!
Ich habe versucht, mein Verständnis der Objektorientierung um n% zu vertiefen
Ich möchte die Eingabe begrenzen, indem ich den Zahlenbereich einschränke
Ich habe versucht, den Betrieb des gRPC-Servers mit grpcurl zu überprüfen
Vom jungen Java (3 Jahre) bis zu Node.js (4 Jahre). Und der Eindruck, nach Java zurückzukehren
[Java] Ich habe versucht, mit der Grabmethode ein Labyrinth zu erstellen ♪
Ich habe versucht, den Kalender mit Java auf der Eclipse-Konsole anzuzeigen.
Ich war süchtig nach der API-Version min23 von registerTorchCallback
Ich konnte die Docker + Laravel + MySQL App für Heroku bereitstellen!
Eine Geschichte, der ich mit der automatischen Starteinstellung von Tomcat 8 unter CentOS 8 zweimal verfallen war
[java8] Um die Stream-API zu verstehen
Die Geschichte, zu vergessen, eine Datei in Java zu schließen und zu scheitern
Ich möchte Bilder mit REST Controller von Java und Spring anzeigen!
Ich war süchtig nach einem einfachen Test von Jedis (Java-> Redis-Bibliothek)
Aufgenommen, weil ich süchtig nach der Standardeingabe der Scannerklasse war
Ich habe versucht, die wichtigsten Punkte des gRPC-Designs und der Entwicklung zusammenzufassen
[Ruby] Ich möchte nur den Wert des Hash und nur den Schlüssel extrahieren
Ich möchte das Argument der Annotation und das Argument der aufrufenden Methode an den Aspekt übergeben
[Circle CI] Ich war süchtig nach dem automatischen Test von Circle CI (Rails + MySQL) [Memo]
[Java-Verbesserungsfall] Wie man die Grenze des Selbststudiums und darüber hinaus erreicht
Überprüfen Sie den MX-Eintrag der E-Mail-Adresse mit Java und die Domain
Ich möchte den Feldnamen des [Java] -Felds erhalten. (Alter Ton)
[Rails] Die Ursache dafür, dass nicht gepostet werden konnte, war in form_with
[Rails] Artikel für Anfänger, um den Fluss von form_with zu organisieren und zu verstehen
Ich habe versucht, die Geschwindigkeit von Graal VM mit JMH zu messen und zu vergleichen