Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| programmierung:jar [2025/01/19 20:11] – swe | programmierung:jar [2025/12/20 14:53] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== | + | # jar-Bibliotheken |
| - | ===== Ausgangslage | + | ## Ausgangslage |
| - | < | + | |
| - | Mode | + | ---- |
| - | ---- | + | -a---l |
| - | -a---l | + | -a---l |
| - | -a---l | + | -a---l |
| - | -a---l | + | |
| - | </ | + | |
| - | ===== Kompilieren wir einfach mal Pythagoras.java. | + | ## Kompilieren wir einfach mal Pythagoras.java. |
| - | < | + | |
| - | >> javac Pythagoras.java | + | |
| - | Mode | + | |
| - | ---- | + | ---- |
| - | -a---l | + | -a---l |
| - | -a---l | + | -a---l |
| - | -a---l | + | -a---l |
| - | -a---l | + | -a---l |
| - | </ | + | |
| - | Man sieht, dass ohne Probleme | + | Man sieht, dass ohne Probleme |
| + | auch mal reinschaun - obwohl es erstmal nicht so super hilfreich ist. | ||
| - | < | + | |
| - | >> cat Pythogoras.class | + | >> javap -c Pythagoras |
| - | >> javap -c Pythagoras | + | |
| - | </ | + | |
| - | Was nicht klappt: Das Ausführen der '' | + | Was nicht klappt: Das Ausführen der `class`-Datei: |
| - | < | + | |
| - | >> java Pythagoras | + | |
| - | Fehler: Hauptmethode in Klasse Pythagoras nicht gefunden. Definieren Sie die Hauptmethode als: | + | |
| - | | + | |
| - | oder eine JavaFX-Anwendung muss javafx.application.Application erweitern | + | oder eine JavaFX-Anwendung muss javafx.application.Application erweitern |
| - | </ | + | |
| - | ===== Kompilieren der main ===== | + | ## Kompilieren der main |
| - | Es fehlt eine '' | + | Es fehlt eine `main` - also schnell |
| - | < | + | |
| - | >> javac Main.java | + | |
| - | Mode | + | |
| - | ---- | + | ---- |
| - | -a---l | + | -a---l |
| - | -a---l | + | -a---l |
| - | -a---l | + | -a---l |
| - | -a---l | + | -a---l |
| - | -a---l | + | -a---l |
| - | -a---l | + | -a---l |
| - | </ | + | |
| **Spannend** | **Spannend** | ||
| - | * Auch '' | + | - Auch `Greeeter.class` ist mitkompiliert worden! |
| - | | + | - Aber `Pythagoras.class` ist NICHT nochmal kompiliert worden (s. |
| + | | ||
| - | ===== Kompilieren von java und class-Files | + | ## Kompilieren von java und class-Files |
| **Was, wenn einige Dateien nicht als .java vorliegen? | **Was, wenn einige Dateien nicht als .java vorliegen? | ||
| - | Um das zu simulieren, verschieben wir ein paar java-files in den Ordner | + | Um das zu simulieren, verschieben wir ein paar java-files in den Ordner |
| + | `temp` ... | ||
| - | < | + | ``` |
| - | >> >> | + | >> |
| - | >> >> | + | >> |
| - | >> >> | + | >> |
| - | >> >> | + | >> |
| - | </ | + | ``` |
| + | ... und kompilieren dann `Main.java`. | ||
| - | ... und kompilieren dann '' | + | ``` |
| - | + | ||
| - | < | + | |
| >> javac Main.java | >> javac Main.java | ||
| - | + | | |
| - | Mode | + | ---- |
| - | ---- | + | dar--l |
| - | dar--l | + | -a---l |
| - | -a---l | + | -a---l |
| - | -a---l | + | -a---l |
| - | -a---l | + | ``` |
| - | </ | + | |
| Kompilieren ist trotzdem möglich! | Kompilieren ist trotzdem möglich! | ||
| Compiler ist sogar happy über bereits fertig kompilierte Klassen. | Compiler ist sogar happy über bereits fertig kompilierte Klassen. | ||
| - | < | + | ``` |
| - | >> javac Main.java | + | >> |
| - | + | ||
| - | Mode | + | |
| - | ---- | + | |
| - | dar--l | + | |
| - | -a---l | + | |
| - | -a---l | + | |
| - | -a---l | + | |
| - | -a---l | + | |
| - | </ | + | |
| - | **Das ist sogar der Klassiker: Man schreibt eigenen Java-Code, der von bereits fertig kompilierten Klassen abhängig ist** | + | Mode |
| + | ---- | ||
| + | dar--l | ||
| + | | ||
| + | -a---l | ||
| + | -a---l | ||
| + | -a---l | ||
| + | ``` | ||
| - | Meist liegen diese fertigen Dateien irgendwo, bsp im Ordner '' | + | **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 | >> rm Main.class | ||
| >> mkdir classes | >> mkdir classes | ||
| >> mv *.class classes | >> mv *.class classes | ||
| - | </ | + | ``` |
| + | ## ClassPath angeben mit -cp | ||
| - | ===== ClassPath angeben mit -cp ===== | + | Aber jetzt funktioniert das kompilieren von `Main.java` nicht mehr, weil |
| + | die Klassen nicht gefunden werden. | ||
| - | Aber jetzt funktioniert das kompilieren von '' | + | >> javac Main.java |
| - | < | + | Deshalb muss ich dem Compiler erstmal sagen, wo sich die Klassendateien |
| - | >> javac Main.java | + | befinden. Hierfür benutzt man die `-cp` Option (Class Path). |
| - | </ | + | |
| - | + | ||
| - | Deshalb muss ich dem Compiler erstmal sagen, wo sich die Klassendateien befinden. Hierfür benutzt man die '' | + | |
| - | < | + | |
| - | >> javac -cp classes Main.java | + | |
| - | </ | + | |
| **Aber man kann es immer noch nicht ausführen!** | **Aber man kann es immer noch nicht ausführen!** | ||
| - | < | + | |
| - | >> java Main | + | |
| - | </ | + | |
| Es muss auch hier wieder der classPath angegeben werden... | Es muss auch hier wieder der classPath angegeben werden... | ||
| - | < | + | |
| - | >> java -cp classes Main | + | Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden |
| - | Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden | + | Ursache: java.lang.ClassNotFoundException: |
| - | Ursache: java.lang.ClassNotFoundException: | + | |
| - | </ | + | |
| - | ... und der classPath muss angepasst werden und durch '' | + | ... und der classPath muss angepasst werden und durch `;` (Windows) um |
| + | das aktülle Verzeichnis erweitert werden. | ||
| - | **Vorsicht**\\ | + | **Vorsicht** |
| - | Die Erweiterung wird je nach Betriebssystem und Terminal unterschiedlich angegeben. Im Fall von '' | + | |
| - | Unter Linux ist es schlicht ein Punkt '' | + | |
| - | < | + | Die Erweiterung wird je nach Betriebssystem und Terminal unterschiedlich |
| - | >> java -cp ".;classes" | + | angegeben. Im Fall von `PowerShell` verwenden wir das `;`. Auch muss der |
| - | 5.0 | + | Pfad von Hochkommata `"` umschlossen werden. |
| - | 4.76837158203125 | + | |
| - | Donald says: Hello World | + | |
| - | </ | + | |
| - | ===== Classfiles im Archiv | + | Unter Linux ist es schlicht ein Punkt `.` |
| - | Classfiles werden meist nicht einzeln verteilt, sondern gepackt als Archiv. | + | >> java -cp ".; |
| + | 5.0 | ||
| + | 4.76837158203125 | ||
| + | Donald says: Hello World | ||
| - | < | + | ## Classfiles im Archiv |
| - | >> cd classes | + | |
| - | ... | + | |
| - | >> | + | |
| - | 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 | + | |
| - | ---- | + | |
| - | -a---l | + | |
| - | -a---l | + | |
| - | -a---l | + | |
| - | </ | + | |
| - | Mit '' | + | Classfiles werden meist nicht einzeln verteilt, sondern gepackt als |
| + | Archiv. | ||
| - | <code> | + | |
| - | >> jar tvf .\library.jar | + | ... |
| - | 0 Sun Jan 19 14:28:38 CET 2025 META-INF/ | + | |
| - | | + | |
| - | 915 Sun Jan 19 13:48:16 CET 2025 Greeter.class | + | |
| - | 453 Sun Jan 19 13:38:28 CET 2025 Pythagoras.class | + | Pythagoras.class wird hinzugefügt(ein = 453) (aus = 323)(28 % verkleinert) |
| - | </ | + | ... |
| + | | ||
| + | ---- | ||
| + | -a---l | ||
| + | | ||
| + | -a---l | ||
| - | Wir knnen jetzt auch alle '' | + | Mit `jar tvf` kann man auch in ein `.jar` hineingucken. |
| - | < | + | |
| - | >> | + | 0 Sun Jan 19 14:28:38 CET 2025 META-INF/ |
| - | >> cd .. | + | 66 Sun Jan 19 14:28:38 CET 2025 META-INF/ |
| - | >> rm *.class | + | 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 |
| - | >> javac -cp classes\library.jar Main.java | + | Compiler funktionieren: |
| - | >> java -cp " | + | |
| - | 5.0 | + | >> rm *.class |
| - | 4.76837158203125 | + | >> |
| - | Donald says: Hello World | + | >> rm *.class |
| - | </code> | + | |
| - | ====== | + | >> javac -cp classes\library.jar Main.java |
| + | >> java -cp " | ||
| + | |||
| + | 5.0 | ||
| + | 4.76837158203125 | ||
| + | Donald says: Hello World | ||
| + | |||
| + | # jar-Bibliothek für gesamtes Programm | ||
| + | |||
| + | 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? | ||
| - | Wie wäre es aber nun, wenn wir das fertige Produkt inklusive der '' | ||
| Antwort lautet: Genau - so machen wir es auch! | Antwort lautet: Genau - so machen wir es auch! | ||
| - | Also, hier nochmal die Ausgangslage: | + | Also, hier nochmal die Ausgangslage: |
| + | Ordner | ||
| - | < | + | |
| - | Mode | + | ---- |
| - | ---- | + | -a---l |
| - | -a---l | + | -a---l |
| - | -a---l | + | -a---l |
| - | -a---l | + | |
| - | </ | + | |
| - | Mit '' | + | Mit `javac Main.java` wird alles kompiliert - als Ergebnis haben wir |
| + | alle `class`-Files. | ||
| - | < | + | |
| - | Mode | + | ---- |
| - | ---- | + | -a---l |
| - | -a---l | + | -a---l |
| - | -a---l | + | -a---l |
| - | -a---l | + | -a---l |
| - | -a---l | + | -a---l |
| - | -a---l | + | -a---l |
| - | -a---l | + | -a---l |
| - | -a---l | + | |
| - | </ | + | |
| - | Was hat es mit dieser | + | Was hat es mit dieser |
| Werfen wir einen kurzen Blick hinein: | Werfen wir einen kurzen Blick hinein: | ||
| - | < | + | |
| - | >> cat manifest.txt | + | Main-Class: Main |
| - | Main-Class: Main | + | |
| - | </ | + | In diesem File ist einfach nur definiert, in welcher Klasse sich die |
| + | `main`-Methode des gesamten Programms befindet. | ||
| - | In diesem File ist einfach nur definiert, in welcher Klasse sich die '' | + | **Tipp**: Am Ende der Zeile muss ein Zeilenumbruch stehen. Ist er nicht |
| + | da, suchst du dich dumm und dämlich... | ||
| - | **Tipp**: Am Ende der Zeile muss ein Zeilenumbruch stehen. Ist er nicht da, suchst du dich dumm und dämlich... | + | ## Erstellung eines jar-Files |
| - | ===== Erstellung eines jar-Files ===== | + | Jetz erstellen wir daraus ein `jar`-File. Nennen wir es `super.jar` |
| - | Jetz erstellen wir daraus ein '' | + | >> |
| - | < | + | Manifest wurde hinzugefügt |
| - | >> jar cvfm super.jar manifest.txt *.class | + | |
| + | Main.class wird hinzugefügt(ein = 643) (aus = 442)(31 % verkleinert) | ||
| + | Pythagoras.class | ||
| - | Manifest wurde hinzugefügt | + | ## Ausführen der jar |
| - | 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) | + | |
| - | </ | + | |
| - | ===== Ausführen der jar ===== | + | >> java -jar super.jar |
| + | 5.0 | ||
| + | 4.76837158203125 | ||
| + | Donald says: Hello World | ||
| - | < | + | Und am Ende nochmal einen Blick ins `jar`: |
| - | >> java -jar super.jar | + | |
| - | 5.0 | + | |
| - | 4.76837158203125 | + | |
| - | Donald says: Hello World | + | |
| - | </ | + | |
| - | Und am Ende nochmal einen Blick ins '' | + | >> jar tvf super.jar |
| - | < | + | 0 Sun Jan 19 19:53:40 CET 2025 META-INF/ |
| - | >> jar tvf super.jar | + | 66 Sun Jan 19 19:53:40 CET 2025 META-INF/ |
| + | 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 | ||
| - | 0 Sun Jan 19 19:53:40 CET 2025 META-INF/ | ||
| - | 66 Sun Jan 19 19:53:40 CET 2025 META-INF/ | ||
| - | 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 | ||
| - | </ | ||