Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---l 19.01.2025 13:24 216 Greeter.java
-a---l 19.01.2025 13:24 283 Main.java
-a---l 19.01.2025 13:38 370 Pythagoras.java
>> javac Pythagoras.java
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---l 19.01.2025 13:24 216 Greeter.java
-a---l 19.01.2025 13:24 283 Main.java
-a---l 19.01.2025 13:38 453 Pythagoras.class
-a---l 19.01.2025 13:38 370 Pythagoras.java
Man sieht, dass ohne Probleme Pythagoras.class entsteht. Da kann man
auch mal reinschaun - obwohl es erstmal nicht so super hilfreich ist.
>> cat Pythogoras.class
>> javap -c Pythagoras
Was nicht klappt: Das Ausführen der class-Datei:
>> java Pythagoras
Fehler: Hauptmethode in Klasse Pythagoras nicht gefunden. Definieren Sie die Hauptmethode als:
public static void main(String[] args):
oder eine JavaFX-Anwendung muss javafx.application.Application erweitern
Es fehlt eine main - also schnell Main.java kompilieren
>> javac Main.java
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---l 19.01.2025 13:48 915 Greeter.class
-a---l 19.01.2025 13:24 216 Greeter.java
-a---l 19.01.2025 13:48 643 Main.class
-a---l 19.01.2025 13:48 285 Main.java
-a---l 19.01.2025 13:38 453 Pythagoras.class
-a---l 19.01.2025 13:38 370 Pythagoras.java
Spannend
Greeeter.class ist mitkompiliert worden!Pythagoras.class ist NICHT nochmal kompiliert worden (s.Was, wenn einige Dateien nicht als .java vorliegen?
Um das zu simulieren, verschieben wir ein paar java-files in den Ordner
temp ...
>> mkdir temp
>> mv Pythagoras.java temp
>> mv Greeter.java temp
>> rm Main.class
... und kompilieren dann Main.java.
>> javac Main.java
Mode LastWriteTime Length Name
---- ------------- ------ ----
dar--l 19.01.2025 13:58 temp
-a---l 19.01.2025 13:48 915 Greeter.class
-a---l 19.01.2025 13:48 285 Main.java
-a---l 19.01.2025 13:38 453 Pythagoras.class
Kompilieren ist trotzdem möglich!
Compiler ist sogar happy über bereits fertig kompilierte Klassen.
>> javac Main.java
Mode LastWriteTime Length Name
---- ------------- ------ ----
dar--l 19.01.2025 13:58 temp
-a---l 19.01.2025 13:48 915 Greeter.class
-a---l 19.01.2025 13:59 643 Main.class
-a---l 19.01.2025 13:48 285 Main.java
-a---l 19.01.2025 13:38 453 Pythagoras.class
Das ist sogar der Klassiker: Man schreibt eigenen Java-Code, der von
bereits fertig kompilierten Klassen abhängig ist
Meist liegen diese fertigen Dateien irgendwo, bsp im Ordner classes
>> rm Main.class
>> mkdir classes
>> mv *.class classes
Aber jetzt funktioniert das kompilieren von Main.java nicht mehr, weil
die Klassen nicht gefunden werden.
>> javac Main.java
Deshalb muss ich dem Compiler erstmal sagen, wo sich die Klassendateien
befinden. Hierfür benutzt man die -cp Option (Class Path).
>> javac -cp classes Main.java
Aber man kann es immer noch nicht ausführen!
>> java Main
Es muss auch hier wieder der classPath angegeben werden...
>> java -cp classes Main
Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden
Ursache: java.lang.ClassNotFoundException: Main
... und der classPath muss angepasst werden und durch ; (Windows) um
das aktülle Verzeichnis erweitert werden.
Vorsicht
Die Erweiterung wird je nach Betriebssystem und Terminal unterschiedlich
angegeben. Im Fall von PowerShell verwenden wir das ;. Auch muss der
Pfad von Hochkommata " umschlossen werden.
Unter Linux ist es schlicht ein Punkt .
>> java -cp ".;classes" Main
5.0
4.76837158203125
Donald says: Hello World
Classfiles werden meist nicht einzeln verteilt, sondern gepackt als
Archiv.
>> cd classes
...
>> jar cvf library.jar *.class
Manifest wurde hinzugefügt
Greeter.class wird hinzugefügt(ein = 915) (aus = 498)(45 % verkleinert)
Pythagoras.class wird hinzugefügt(ein = 453) (aus = 323)(28 % verkleinert)
...
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---l 19.01.2025 13:48 915 Greeter.class
-a---l 19.01.2025 14:28 1386 library.jar
-a---l 19.01.2025 13:38 453 Pythagoras.class
Mit jar tvf kann man auch in ein .jar hineingucken.
>> jar tvf .\library.jar
0 Sun Jan 19 14:28:38 CET 2025 META-INF/
66 Sun Jan 19 14:28:38 CET 2025 META-INF/MANIFEST.MF
915 Sun Jan 19 13:48:16 CET 2025 Greeter.class
453 Sun Jan 19 13:38:28 CET 2025 Pythagoras.class
Wir knnen jetzt auch alle .class-files löschen und trotzdem wird der
Compiler funktionieren:
>> rm *.class
>> cd ..
>> rm *.class
>> javac -cp classes\library.jar Main.java
>> java -cp ".;classes\library.jar" Main
5.0
4.76837158203125
Donald says: Hello World
Wie wäre es aber nun, wenn wir das fertige Produkt inklusive der main
in solch einer jar-Bibliothek verpacken? So hätten wir doch nur 1
File, das wir problemlos weitergeben könnten?
Antwort lautet: Genau - so machen wir es auch!
Also, hier nochmal die Ausgangslage: Alle java-Files liegen in einem
Ordner
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---l 19.01.2025 13:24 216 Greeter.java
-a---l 19.01.2025 13:24 283 Main.java
-a---l 19.01.2025 13:38 370 Pythagoras.java
Mit javac Main.java wird alles kompiliert - als Ergebnis haben wir
alle class-Files.
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---l 19.01.2025 19:39 915 Greeter.class
-a---l 19.01.2025 13:24 216 Greeter.java
-a---l 19.01.2025 19:39 643 Main.class
-a---l 19.01.2025 13:48 285 Main.java
-a---l 19.01.2025 19:43 18 manifest.txt
-a---l 19.01.2025 19:39 453 Pythagoras.class
-a---l 19.01.2025 13:38 370 Pythagoras.java
Was hat es mit dieser manifest.txt auf sich?
Werfen wir einen kurzen Blick hinein:
>> cat manifest.txt
Main-Class: Main
In diesem File ist einfach nur definiert, in welcher Klasse sich die
main-Methode des gesamten Programms befindet.
Tipp: Am Ende der Zeile muss ein Zeilenumbruch stehen. Ist er nicht
da, suchst du dich dumm und dämlich...
Jetz erstellen wir daraus ein jar-File. Nennen wir es super.jar
>> jar cvfm super.jar manifest.txt *.class
Manifest wurde hinzugefügt
Greeter.class wird hinzugefügt(ein = 915) (aus = 498)(45 % verkleinert)
Main.class wird hinzugefügt(ein = 643) (aus = 442)(31 % verkleinert)
Pythagoras.class wird hinzugefügt(ein = 453) (aus = 323)(28 % verkleinert)
>> java -jar super.jar
5.0
4.76837158203125
Donald says: Hello World
Und am Ende nochmal einen Blick ins jar:
>> jar tvf super.jar
0 Sun Jan 19 19:53:40 CET 2025 META-INF/
66 Sun Jan 19 19:53:40 CET 2025 META-INF/MANIFEST.MF
915 Sun Jan 19 19:39:56 CET 2025 Greeter.class
643 Sun Jan 19 19:39:56 CET 2025 Main.class
453 Sun Jan 19 19:39:56 CET 2025 Pythagoras.class