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 19:17] 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>+
  
-Zunächst 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 reinschauen - 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>+
  
-Es fehlt eine ''%%main%%'' - also schnell ''%%Main.java%%'' kompilieren+## Kompilieren der main
  
-<code> +Es fehlt eine `main` - also schnell `Main.java` kompilieren 
->> 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
  
 **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
 +    ----                 -------------         ------ ----
 +    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:48            285 Main.java +
--a---l        19.01.2025     13:38            453 Pythagoras.class +
-</code>+
  
-Kompilieren ist trotzdem moeglich!+``` 
 + >> javac Main.java
  
-Compiler ist sogar happy ueber bereits fertig kompilierte Klassen.+    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 
->> javac Main.java +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 +
-</code> +
- +
-**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 ''%%classes%%'' +Meist liegen diese fertigen Dateien irgendwo, bsp im Ordner `classes` 
- +```
-<code>+
 >> rm Main.class >> rm Main.class
 >> mkdir classes >> mkdir classes
 >> mv *.class classes >> mv *.class classes
-</code>+``` 
 +## 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.javanicht mehr, weil 
 +die Klassen nicht gefunden werden.
  
-<code> +    >> javac Main.java
->> javac Main.java +
-</code>+
  
-Deshalb muss ich dem Compiler erstmal sagen, wo sich die Klassendateien befinden. Hierfuer benutzt man die ''%%-cp%%'' Option (%%**%%Class Path).+Deshalb muss ich dem Compiler erstmal sagen, wo sich die Klassendateien 
 +befinden. Hierfür benutzt man die `-cpOption (Class Path).
  
-<code> +    >> javac -cp classes Main.java
->> javac -cp classes Main.java +
-</code>+
  
-**Aber man kann es immer noch nicht ausfuehren!**+**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. 
 + 
 +**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 
 + 
 +Was hat es mit dieser `manifest.txt` auf sich? 
 + 
 +Werfen wir einen kurzen Blick hinein: 
 + 
 +    >> cat manifest.txt 
 +    Main-Class: Main
  
-... und der classPath muss angepasst werden und durch ''%%;%%'' (Windows) um das aktuelle Verzeichnis erweitert werden.+In diesem File ist einfach nur definiert, in welcher Klasse sich die 
 +`main`-Methode des gesamten Programms befindet.
  
-**Vorsicht**\\ +**Tipp**: Am Ende der Zeile muss ein Zeilenumbruch stehen. Ist er nicht 
-Die Erweiterung wird je nach Betriebssystem und Terminal unterschiedlich angegebenIm Fall von ''%%PowerShell%%'' verwenden wir das ''%%;%%''Auch muss der Pfad von Hochkommata ''%%"%%'' umschlossen werden.\\ +da, suchst du dich dumm und dämlich...
-Unter Linux ist es schlicht ein Punkt ''%%.%%''+
  
-<code> +## Erstellung eines jar-Files
->> java -cp ".;classes" Main +
-5.0 +
-4.76837158203125 +
-Donald says: Hello World +
-</code>+
  
-==== Classfiles im Archiv .jar (java archive) ====+Jetz erstellen wir daraus ein `jar`-File. Nennen wir es `super.jar`
  
-Classfiles werden meist nicht einzeln verteilt, sondern gepackt als Archiv.+    >> jar cvfm super.jar manifest.txt *.class
  
-<code> +    Manifest wurde hinzugefügt 
->> cd classes +    Greeter.class wird hinzugefügt(ein = 915) (aus = 498)(45 % verkleinert) 
-... +    Main.class wird hinzugefügt(ein = 643) (aus = 442)(31 % verkleinert) 
->> jar cvf library.jar *.class +    Pythagoras.class wird hinzugefügt(ein = 453) (aus = 323)(28 % verkleinert)
-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.+## Ausführen der jar
  
-<code> +    >> java -jar super.jar 
->> jar tvf .\library.jar +    5.
-     Sun Jan 19 14:28:38 CET 2025 META-INF/ +    4.76837158203125 
-    66 Sun Jan 19 14:28:38 CET 2025 META-INF/MANIFEST.MF +    Donald saysHello World
-   915 Sun Jan 19 13:48:16 CET 2025 Greeter.class +
-   453 Sun Jan 19 13:38:28 CET 2025 Pythagoras.class +
-</code>+
  
-Wir koennen jetzt auch alle ''%%.class%%''-files loeschen und trotzdem wird der Compiler funktionieren:+Und am Ende nochmal einen Blick ins `jar`:
  
-<code> +    >> jar tvf super.jar
->> rm *.class +
->> cd .. +
->> rm *.class +
-</code>+
  
-<code> +         0 Sun Jan 19 19:53:40 CET 2025 META-INF/ 
->> javac -cp classes\library.jar Main.java +        66 Sun Jan 19 19:53:40 CET 2025 META-INF/MANIFEST.MF 
->> java -cp ".;classes\library.jar" Main+       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 
-</code>