Differences

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

Link to this comparison view

Next revision
Previous revision
programmierung:jar [2025/01/19 14:46] – created sweprogrammierung:jar [2025/12/20 14:53] (current) – external edit 127.0.0.1
Line 1: Line 1:
-====== Java Bibliotheken ======+# jar-Bibliotheken
  
-<code> +## Ausgangslage
-javac Pythagoras.java +
-</code>+
  
-<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:38             43 JarAblauf.md +    -a---l        19.01.2025     13:38            370 Pythagoras.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 +
-</code>+
  
 +## Kompilieren wir einfach mal Pythagoras.java.
  
-----+    >> javac Pythagoras.java
  
-<code> 
-cat Pythogoras.class 
-</code> 
  
 +    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.
  
-<code+    >> cat Pythogoras.class 
-javap -c Pythagoras +    >> javap -c Pythagoras
-</code>+
  
 +Was nicht klappt: Das Ausführen der `class`-Datei:
  
-----+    >> java Pythagoras
  
-<code> +    Fehler: Hauptmethode in Klasse Pythagoras nicht gefunden. Definieren Sie die Hauptmethode als
-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
-   public static void main(String[] args): +
-oder eine JavaFX-Anwendung muss javafx.application.Application erweitern +
-</code>+
  
-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:38             43 JarAblauf.md +    -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>+
  
-  Auch ''%%Greeeter.class%%'' ist mitkompiliert worden! +**Spannend**
-  Aber ''%%Pythagoras.class%%'' ist NICHT nochmal kompiliert worden (s. Zeitstempel)+
  
-==== Was, wenn einige Dateien nicht als .java vorliegen? ====+- Auch `Greeeter.class` ist mitkompiliert worden! 
 +- Aber `Pythagoras.class` ist NICHT nochmal kompiliert worden (s. 
 +  Zeitstempel)
  
-<code> +## 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                 LastWriteTime         Length Name +Um das zu simulieren, verschieben wir ein paar java-files in den Ordner 
-----                 -------------         ------ ---+`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:57           1778 JarAblauf.md +
--a---l        19.01.2025     13:48            285 Main.java +
--a---l        19.01.2025     13:38            453 Pythagoras.class +
-</code>+
  
-Kompilieren ist trotzdem moeglich!+``` 
 + >> mkdir temp 
 + >> mv Pythagoras.java temp 
 + >> mv Greeter.java temp 
 + >> rm Main.class 
 +``` 
 +... und kompilieren dann `Main.java`.
  
-Kompiler ist sogar happy ueber bereits fertig kompilierte Klassen.+``` 
 +>> javac Main.java
  
-<code> +    Mode                 LastWriteTime         Length Name 
-javac Main.java+    ----                 -------------         ------ ---- 
 +    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!
  
-Mode                 LastWriteTime         Length Name +Compiler ist sogar happy über bereits fertig kompilierte Klassen.
-----                 -------------         ------ ---- +
-dar--l        19.01.2025     13:58                temp +
--a---l        19.01.2025     13:48            915 Greeter.class +
--a---l        19.01.2025     13:57           1778 JarAblauf.md +
--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 Klassiker: Man schreibt eigenen Java-Code, der von bereits fertig kompilierten Klassen abhaengig ist**+``` 
 + >> javac Main.java
  
-Meist liegen diese fertigen Dateien irgendwo, bsp im Ordner ''%%classes%%''+    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 Klassiker: Man schreibt eigenen Java-Code, der von 
-rm Main.class +bereits fertig kompilierten Klassen abhängig ist**
-mkdir classes +
-mv *.class classes +
-</code>+
  
-Aber jetzt funktioniert folgender Code nicht mehrweil die Klassen nicht gefunden werden.+Meist liegen diese fertigen Dateien irgendwobsp im Ordner `classes` 
 +``` 
 +>> rm Main.class 
 +>> mkdir classes 
 +>> mv *.class classes 
 +``` 
 +## ClassPath angeben mit -cp
  
-<code> +Aber jetzt funktioniert das kompilieren von `Main.java` nicht mehr, weil 
-javac Main.java +die Klassen nicht gefunden werden.
-</code>+
  
-Deshalb muss ich dem Kompiler erstmal sagen, wo sich die Klassendateien befinden. Hierfuer benutzt man die ''%%-cp%%'' Option (%%**%%Class Path).+    >> javac Main.java
  
-<code> +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).
-</code>+
  
-**Aber man kann es immer noch nicht ausfuehren!**+    >> javac -cp classes Main.java
  
-<code> +**Aber man kann es immer noch nicht ausführen!** 
->> java Main + 
-</code>+    >> java Main
  
 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. 
 + 
 +**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 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                 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 
 + 
 +# 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: 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
  
-... und der classPath muss angepasst werden und durch ''%%.%%'' um das aktuelle Verzeichnis erweitert werden.+Was hat es mit dieser `manifest.txt` auf sich?
  
-<code> +Werfen wir einen kurzen Blick hinein:
->> java -cp ".;classes" Main +
-5.0 +
-4.76837158203125 +
-Donald saysHello World +
-</code>+
  
-==== Classfiles im Archiv .jar (java archive) ====+    >> cat manifest.txt 
 +    Main-Class: Main
  
-Classfiles werden meist nicht einzeln verteiltsondern gepackt als Archiv.+In diesem File ist einfach nur definiertin welcher Klasse sich die 
 +`main`-Methode des gesamten Programms befindet.
  
-<code> +**Tipp**: Am Ende der Zeile muss ein Zeilenumbruch stehenIst er nicht 
->> cd classes +da, suchst du dich dumm und dämlich...
-... +
->> 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.+## Erstellung eines jar-Files
  
->> 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+Jetz erstellen wir daraus ein `jar`-FileNennen wir es `super.jar`
  
-<code>+    >> jar cvfm super.jar manifest.txt *.class
  
-Wir koennen jetzt auch alle ``.class``-files loeschen und trotzdem wird der Compiler funktionieren: +    Manifest wurde hinzugefügt 
-</code>+    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)
  
-rm //.class cd .. rm //.class+## Ausführen der jar
  
->> javac -cp classes\library.jar Main.java+    >> java -jar super.jar 
 +    5.
 +    4.76837158203125 
 +    Donald says: Hello World
  
-<code>+Und am Ende nochmal einen Blick ins `jar`:
  
-</code>+    >> jar tvf super.jar
  
->> java -cp ".;classes\library.jar" Main+         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
  
-5.0 4.76837158203125 Donald says: Hello World ```