Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
programmierung:jar [2025/01/19 20:11] sweprogrammierung:jar [2025/12/20 14:53] (current) – external edit 127.0.0.1
Line 1: Line 1:
-====== jar-Bibliotheken ======+jar-Bibliotheken
  
-===== Ausgangslage =====+## Ausgangslage
  
-<code> +    Mode                 LastWriteTime         Length Name 
-Mode                 LastWriteTime         Length Name +    ----                 -------------         ------ ---- 
-----                 -------------         ------ ---- +    -a---l        19.01.2025     13:24            216 Greeter.java 
--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:24            283 Main.java +    -a---l        19.01.2025     13:38            370 Pythagoras.java
--a---l        19.01.2025     13:38            370 Pythagoras.java +
-</code>+
  
-===== Kompilieren wir einfach mal Pythagoras.java. =====+## Kompilieren wir einfach mal Pythagoras.java.
  
-<code> +    >> javac Pythagoras.java
->> javac Pythagoras.java+
  
  
-Mode                 LastWriteTime         Length Name +    Mode                 LastWriteTime         Length Name 
-----                 -------------         ------ ---- +    ----                 -------------         ------ ---- 
--a---l        19.01.2025     13:24            216 Greeter.java +    -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:24            283 Main.java 
--a---l        19.01.2025     13:38            453 Pythagoras.class +    -a---l        19.01.2025     13:38            453 Pythagoras.class 
--a---l        19.01.2025     13:38            370 Pythagoras.java +    -a---l        19.01.2025     13:38            370 Pythagoras.java
-</code>+
  
-Man sieht, dass ohne Probleme ''%%Pythagoras.class%%'' entsteht. Da kann man auch mal reinschaun - obwohl es erstmal nicht so super hilfreich ist.+Man sieht, dass ohne Probleme `Pythagoras.classentsteht. Da kann man 
 +auch mal reinschaun - obwohl es erstmal nicht so super hilfreich ist.
  
-<code> +    >> cat Pythogoras.class 
->> cat Pythogoras.class +    >> javap -c Pythagoras
->> javap -c Pythagoras +
-</code>+
  
-Was nicht klappt: Das Ausführen der ''%%class%%''-Datei:+Was nicht klappt: Das Ausführen der `class`-Datei:
  
-<code> +    >> java Pythagoras
->> java Pythagoras+
  
-Fehler: Hauptmethode in Klasse Pythagoras nicht gefunden. Definieren Sie die Hauptmethode als: +    Fehler: Hauptmethode in Klasse Pythagoras nicht gefunden. Definieren Sie die Hauptmethode als: 
-   public static void main(String[] args): +       public static void main(String[] args): 
-oder eine JavaFX-Anwendung muss javafx.application.Application erweitern +    oder eine JavaFX-Anwendung muss javafx.application.Application erweitern
-</code>+
  
-===== Kompilieren der main =====+## Kompilieren der main
  
-Es fehlt eine ''%%main%%'' - also schnell ''%%Main.java%%'' kompilieren+Es fehlt eine `main- also schnell `Main.javakompilieren
  
-<code> +    >> javac Main.java
->> javac Main.java+
  
  
-Mode                 LastWriteTime         Length Name +    Mode                 LastWriteTime         Length Name 
-----                 -------------         ------ ---- +    ----                 -------------         ------ ---- 
--a---l        19.01.2025     13:48            915 Greeter.class +    -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:24            216 Greeter.java 
--a---l        19.01.2025     13:48            643 Main.class +    -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:48            285 Main.java 
--a---l        19.01.2025     13:38            453 Pythagoras.class +    -a---l        19.01.2025     13:38            453 Pythagoras.class 
--a---l        19.01.2025     13:38            370 Pythagoras.java +    -a---l        19.01.2025     13:38            370 Pythagoras.java
-</code>+
  
 **Spannend** **Spannend**
  
-  * Auch ''%%Greeeter.class%%'' ist mitkompiliert worden! +Auch `Greeeter.classist mitkompiliert worden! 
-  Aber ''%%Pythagoras.class%%'' ist NICHT nochmal kompiliert worden (s. Zeitstempel)+Aber `Pythagoras.classist NICHT nochmal kompiliert worden (s. 
 +  Zeitstempel)
  
-===== 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 ''%%temp%%'' ...+Um das zu simulieren, verschieben wir ein paar java-files in den Ordner 
 +`temp...
  
-<code> +``` 
->> >> >> mkdir temp + >> mkdir temp 
->> >> >> mv Pythagoras.java temp + >> mv Pythagoras.java temp 
->> >> >> mv Greeter.java temp + >> mv Greeter.java temp 
->> >> >> rm Main.class + >> rm Main.class 
-</code>+``` 
 +... und kompilieren dann `Main.java`.
  
-... und kompilieren dann ''%%Main.java%%''+```
- +
-<code>+
 >> javac Main.java >> javac Main.java
  
- +    Mode                 LastWriteTime         Length Name 
-Mode                 LastWriteTime         Length Name +    ----                 -------------         ------ ---- 
-----                 -------------         ------ ---- +    dar--l        19.01.2025     13:58                temp 
-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            915 Greeter.class +    -a---l        19.01.2025     13:48            285 Main.java 
--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            453 Pythagoras.class +```
-</code> +
 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.
  
-<code> +``` 
->> javac 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:59            643 Main.class +
--a---l        19.01.2025     13:48            285 Main.java +
--a---l        19.01.2025     13:38            453 Pythagoras.class +
-</code>+
  
-**Das ist sogar der KlassikerMan schreibt eigenen Java-Code, der von bereits fertig kompilierten Klassen abhängig ist**+    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 
 +```
  
-Meist liegen diese fertigen Dateien irgendwobsp im Ordner ''%%classes%%''+**Das ist sogar der Klassiker: Man schreibt eigenen Java-Codeder von 
 +bereits fertig kompilierten Klassen abhängig ist**
  
-<code>+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
-</code>+``` 
 +## 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 ''%%Main.java%%'' nicht mehr, weil die Klassen nicht gefunden werden.+    >> javac Main.java
  
-<code> +Deshalb muss ich dem Compiler erstmal sagen, wo sich die Klassendateien 
->> javac Main.java +befinden. Hierfür benutzt man die `-cpOption (Class Path).
-</code> +
- +
-Deshalb muss ich dem Compiler erstmal sagen, wo sich die Klassendateien befinden. Hierfür benutzt man die ''%%-cp%%'' Option (%%**%%Class Path).+
  
-<code> +    >> javac -cp classes Main.java
->> javac -cp classes Main.java +
-</code>+
  
 **Aber man kann es immer noch nicht ausführen!** **Aber man kann es immer noch nicht ausführen!**
  
-<code> +    >> java Main
->> java Main +
-</code>+
  
 Es muss auch hier wieder der classPath angegeben werden... Es muss auch hier wieder der classPath angegeben werden...
  
-<code> +    >> java -cp classes Main 
->> 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: Main
-Ursache: java.lang.ClassNotFoundException: Main +
-</code>+
  
-... und der classPath muss angepasst werden und durch ''%%;%%'' (Windows) um das aktülle Verzeichnis erweitert werden.+... 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 ''%%PowerShell%%'' verwenden wir das ''%%;%%''. Auch muss der Pfad von Hochkommata ''%%"%%'' umschlossen werden.\\ +
-Unter Linux ist es schlicht ein Punkt ''%%.%%''+
  
-<code> +Die Erweiterung wird je nach Betriebssystem und Terminal unterschiedlich 
->> java -cp ".;classes" Main +angegebenIm Fall von `PowerShell` verwenden wir das `;`Auch muss der 
-5.0 +Pfad von Hochkommata `"` umschlossen werden.
-4.76837158203125 +
-Donald says: Hello World +
-</code>+
  
-===== Classfiles im Archiv .jar (java archive) =====+Unter Linux ist es schlicht ein Punkt `.`
  
-Classfiles werden meist nicht einzeln verteilt, sondern gepackt als Archiv.+    >> java -cp ".;classes" Main 
 +    5.0 
 +    4.76837158203125 
 +    Donald says: Hello World
  
-<code> +## Classfiles im Archiv .jar (java archive)
->> 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 +
-</code>+
  
-Mit ''%%jar tvf%%'' kann man auch in ein ''%%.jar%%'' hineingucken.+Classfiles werden meist nicht einzeln verteilt, sondern gepackt als 
 +Archiv.
  
-<code+    >> cd classes 
->> jar tvf .\library.jar +    ... 
-     0 Sun Jan 19 14:28:38 CET 2025 META-INF/ +    >> jar cvf library.jar *.class 
-    66 Sun Jan 19 14:28:38 CET 2025 META-INF/MANIFEST.MF +    Manifest wurde hinzugefügt 
-   915 Sun Jan 19 13:48:16 CET 2025 Greeter.class +    Greeter.class wird hinzugefügt(ein = 915) (aus = 498)(45 % verkleinert) 
-   453 Sun Jan 19 13:38:28 CET 2025 Pythagoras.class +    Pythagoras.class wird hinzugefügt(ein = 453) (aus = 323)(28 % verkleinert) 
-</code>+    ..
 +    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
  
-Wir knnen jetzt auch alle ''%%.class%%''-files löschen und trotzdem wird der Compiler funktionieren:+Mit `jar tvf` kann man auch in ein `.jar` hineingucken.
  
-<code> +    >> jar tvf .\library.jar 
->> rm *.class +         0 Sun Jan 19 14:28:38 CET 2025 META-INF/ 
->> cd .. +        66 Sun Jan 19 14:28:38 CET 2025 META-INF/MANIFEST.MF 
->> rm *.class +       915 Sun Jan 19 13:48:16 CET 2025 Greeter.class 
-</code>+       453 Sun Jan 19 13:38:28 CET 2025 Pythagoras.class
  
-<code> +Wir knnen jetzt auch alle `.class`-files löschen und trotzdem wird der 
->> javac -cp classes\library.jar Main.java +Compiler funktionieren:
->> java -cp ".;classes\library.jar" Main+
  
-5.0 +    >> rm *.class 
-4.76837158203125 +    >> cd .
-Donald says: Hello World +    >> rm *.class
-</code>+
  
-====== jar-Bibliothek für gesamtes Programm ======+    >> javac -cp classes\library.jar Main.java 
 +    >> java -cp ".;classes\library.jar" Main 
 + 
 +    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 ''%%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! Antwort lautet: Genau - so machen wir es auch!
  
-Also, hier nochmal die Ausgangslage: Alle ''%%java%%''-Files liegen in einem Ordner+Also, hier nochmal die Ausgangslage: Alle `java`-Files liegen in einem 
 +Ordner
  
-<code> +    Mode                 LastWriteTime         Length Name 
-Mode                 LastWriteTime         Length Name +    ----                 -------------         ------ ---- 
-----                 -------------         ------ ---- +    -a---l        19.01.2025     13:24            216 Greeter.java 
--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:24            283 Main.java +    -a---l        19.01.2025     13:38            370 Pythagoras.java
--a---l        19.01.2025     13:38            370 Pythagoras.java +
-</code>+
  
-Mit ''%%javac Main.java%%'' wird alles kompiliert - als Ergebnis haben wir alle ''%%class%%''-Files.+Mit `javac Main.javawird alles kompiliert - als Ergebnis haben wir 
 +alle `class`-Files.
  
-<code> +    Mode                 LastWriteTime         Length Name 
-Mode                 LastWriteTime         Length Name +    ----                 -------------         ------ ---- 
-----                 -------------         ------ ---- +    -a---l        19.01.2025     19:39            915 Greeter.class 
--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     13:24            216 Greeter.java +    -a---l        19.01.2025     19:39            643 Main.class 
--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     13:48            285 Main.java +    -a---l        19.01.2025     19:43             18 manifest.txt 
--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     19:39            453 Pythagoras.class +    -a---l        19.01.2025     13:38            370 Pythagoras.java
--a---l        19.01.2025     13:38            370 Pythagoras.java +
-</code>+
  
-Was hat es mit dieser ''%%manifest.txt%%'' auf sich?+Was hat es mit dieser `manifest.txtauf sich?
  
 Werfen wir einen kurzen Blick hinein: Werfen wir einen kurzen Blick hinein:
  
-<code> +    >> cat manifest.txt 
->> cat manifest.txt +    Main-Class: Main 
-Main-Class: Main + 
-</code>+In diesem File ist einfach nur definiert, in welcher Klasse sich die 
 +`main`-Methode des gesamten Programms befindet.
  
-In diesem File ist einfach nur definiertin welcher Klasse sich die ''%%main%%''-Methode des gesamten Programms befindet.+**Tipp**: Am Ende der Zeile muss ein Zeilenumbruch stehen. Ist er nicht 
 +dasuchst 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 ''%%jar%%''-File. Nennen wir es ''%%super.jar%%''+    >> jar cvfm super.jar manifest.txt *.class
  
-<code> +    Manifest wurde hinzugefügt 
->> jar cvfm super.jar manifest.txt *.class+    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)
  
-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) +
-</code>+
  
-===== Ausführen der jar =====+    >> java -jar super.jar 
 +    5.0 
 +    4.76837158203125 
 +    Donald says: Hello World
  
-<code> +Und am Ende nochmal einen Blick ins `jar`:
->> java -jar super.jar +
-5.0 +
-4.76837158203125 +
-Donald saysHello World +
-</code>+
  
-Und am Ende nochmal einen Blick ins ''%%jar%%'':+    >> jar tvf super.jar
  
-<code> +         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/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
  
-     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 
-</code>