Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| programmierung:jar [2025/01/19 14:46] – created swe | programmierung:jar [2025/12/20 14:53] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Java Bibliotheken | + | # jar-Bibliotheken |
| - | < | + | ## Ausgangslage |
| - | javac Pythagoras.java | + | |
| - | </ | + | |
| - | < | + | |
| - | Mode | + | ---- |
| - | ---- | + | -a---l |
| - | -a---l | + | -a---l |
| - | -a---l | + | -a---l |
| - | -a---l | + | |
| - | -a---l | + | |
| - | -a---l | + | |
| - | </ | + | |
| + | ## Kompilieren wir einfach mal Pythagoras.java. | ||
| - | ---- | + | >> javac Pythagoras.java |
| - | < | ||
| - | cat Pythogoras.class | ||
| - | </ | ||
| + | Mode | ||
| + | ---- | ||
| + | -a---l | ||
| + | -a---l | ||
| + | -a---l | ||
| + | -a---l | ||
| - | ---- | + | Man sieht, dass ohne Probleme `Pythagoras.class` entsteht. Da kann man |
| + | auch mal reinschaun | ||
| - | <code> | + | |
| - | javap -c Pythagoras | + | >> |
| - | </ | + | |
| + | Was nicht klappt: Das Ausführen der `class`-Datei: | ||
| - | ---- | + | >> java Pythagoras |
| - | < | + | Fehler: Hauptmethode in Klasse Pythagoras |
| - | Was nicht klappt: | + | public static void main(String[] args): |
| - | java Pythagoras | + | oder eine JavaFX-Anwendung muss javafx.application.Application erweitern |
| - | Fehler: Hauptmethode in Klasse Pythagoras nicht gefunden. Definieren Sie die Hauptmethode als: | + | ## Kompilieren der main |
| - | | + | |
| - | oder eine JavaFX-Anwendung muss javafx.application.Application erweitern | + | |
| - | </ | + | |
| - | Es fehlt eine '' | + | Es fehlt eine `main` - also schnell |
| - | <code> | + | >> javac Main.java |
| - | 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 |
| - | -a---l | + | |
| - | </ | + | |
| - | | + | **Spannend** |
| - | | + | |
| - | ==== Was, wenn einige Dateien nicht als .java vorliegen? ==== | + | - Auch `Greeeter.class` ist mitkompiliert worden! |
| + | - Aber `Pythagoras.class` ist NICHT nochmal kompiliert worden (s. | ||
| + | Zeitstempel) | ||
| - | < | + | ## Kompilieren von java und class-Files |
| - | mkdir temp | + | |
| - | mv Pythagoras.java temp | + | |
| - | mv Greeter.java temp | + | |
| - | rm Main.class | + | |
| - | javac Main.java | + | |
| + | **Was, wenn einige Dateien nicht als .java vorliegen? | ||
| - | Mode | + | Um das zu simulieren, verschieben wir ein paar java-files in den Ordner |
| - | ---- | + | `temp` ... |
| - | dar--l | + | |
| - | -a---l | + | |
| - | -a---l | + | |
| - | -a---l | + | |
| - | -a---l | + | |
| - | </ | + | |
| - | Kompilieren ist trotzdem moeglich! | + | ``` |
| + | >> | ||
| + | >> | ||
| + | >> | ||
| + | >> | ||
| + | ``` | ||
| + | ... und kompilieren dann `Main.java`. | ||
| - | Kompiler ist sogar happy ueber bereits fertig kompilierte Klassen. | + | ``` |
| + | >> javac Main.java | ||
| - | < | + | Mode |
| - | javac Main.java | + | |
| + | dar--l | ||
| + | -a---l | ||
| + | -a---l | ||
| + | -a---l | ||
| + | ``` | ||
| + | Kompilieren ist trotzdem möglich! | ||
| - | Mode | + | Compiler ist sogar happy über bereits fertig kompilierte Klassen. |
| - | ---- | + | |
| - | dar--l | + | |
| - | -a---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 abhaengig ist** | + | ``` |
| + | >> | ||
| - | Meist liegen diese fertigen Dateien irgendwo, bsp im Ordner '' | + | Mode |
| + | ---- | ||
| + | dar--l | ||
| + | -a---l | ||
| + | -a---l | ||
| + | -a---l | ||
| + | -a---l | ||
| + | ``` | ||
| - | < | + | **Das ist sogar der Klassiker: Man schreibt eigenen Java-Code, der von |
| - | rm Main.class | + | bereits fertig kompilierten Klassen abhängig ist** |
| - | mkdir classes | + | |
| - | mv *.class classes | + | |
| - | </ | + | |
| - | Aber jetzt funktioniert folgender Code nicht mehr, weil die Klassen nicht gefunden werden. | + | Meist liegen diese fertigen Dateien irgendwo, bsp im Ordner `classes` |
| + | ``` | ||
| + | >> rm Main.class | ||
| + | >> mkdir classes | ||
| + | >> mv *.class classes | ||
| + | ``` | ||
| + | ## ClassPath angeben mit -cp | ||
| - | < | + | Aber jetzt funktioniert das kompilieren von `Main.java` nicht mehr, weil |
| - | javac Main.java | + | die Klassen nicht gefunden werden. |
| - | </ | + | |
| - | Deshalb muss ich dem Kompiler erstmal sagen, wo sich die Klassendateien befinden. Hierfuer benutzt man die '' | + | >> javac Main.java |
| - | < | + | Deshalb muss ich dem Compiler erstmal sagen, wo sich die Klassendateien |
| - | >> javac -cp classes Main.java | + | befinden. Hierfür benutzt man die `-cp` Option (Class Path). |
| - | </ | + | |
| - | **Aber man kann es immer noch nicht ausfuehren!** | + | >> 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... | 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: | + | |
| - | </code> | + | ... 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 " | ||
| + | 5.0 | ||
| + | 4.76837158203125 | ||
| + | Donald says: Hello World | ||
| + | |||
| + | ## Classfiles im Archiv .jar (java archive) | ||
| + | |||
| + | 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 | ||
| + | ---- | ||
| + | -a---l | ||
| + | -a---l | ||
| + | -a---l | ||
| + | |||
| + | 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/ | ||
| + | 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: | ||
| + | |||
| + | | ||
| + | >> cd .. | ||
| + | >> rm *.class | ||
| + | |||
| + | >> 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? | ||
| + | |||
| + | Antwort lautet: Genau - so machen wir es auch! | ||
| + | |||
| + | Also, hier nochmal die Ausgangslage: | ||
| + | Ordner | ||
| + | |||
| + | Mode | ||
| + | ---- | ||
| + | -a---l | ||
| + | -a---l | ||
| + | -a---l | ||
| + | |||
| + | 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 | ||
| - | ... und der classPath muss angepasst werden und durch '' | + | Was hat es mit dieser `manifest.txt` auf sich? |
| - | < | + | Werfen wir einen kurzen Blick hinein: |
| - | >> java -cp " | + | |
| - | 5.0 | + | |
| - | 4.76837158203125 | + | |
| - | Donald says: Hello World | + | |
| - | </ | + | |
| - | ==== Classfiles im Archiv | + | >> cat manifest.txt |
| + | Main-Class: Main | ||
| - | Classfiles werden meist nicht einzeln verteilt, sondern gepackt als Archiv. | + | 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 |
| - | >> cd classes | + | da, suchst du dich dumm und dämlich... |
| - | ... | + | |
| - | >> jar cvf library.jar | + | |
| - | 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 '' | + | ## Erstellung eines jar-Files |
| - | >> | + | Jetz erstellen wir daraus ein `jar`-File. Nennen wir es `super.jar` |
| - | <code> | + | |
| - | Wir koennen jetzt auch alle ``.class``-files loeschen und trotzdem | + | 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) | ||
| - | rm //.class cd .. rm //.class | + | ## Ausführen der jar |
| - | >> | + | |
| + | 5.0 | ||
| + | 4.76837158203125 | ||
| + | Donald says: Hello World | ||
| - | < | + | Und am Ende nochmal einen Blick ins `jar`: |
| - | </code> | + | |
| - | >> java -cp ".; | + | 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 | ||
| - | 5.0 4.76837158203125 Donald says: Hello World ``` | ||