jar-Bibliotheken

**This is an old revision of the document!**

jar-Bibliotheken

Ausgangslage

 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 

Zunächst kompilieren wir einfach mal Pythagoras.java.

>>javac Pythagoras.java
>>
>

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 reinschauen - obwohl es erstmal nicht so super hilfreich ist.

>>cat Pythogoras.class javap -c Pythagoras 

Was nicht klappt: Das Ausführen der class-Datei:

>>java Pythagoras
>>
>

Fehler: Hauptmethode in Klasse Pythagoras nicht gefunden. Definieren Sie die Hauptmethode als: public static void main(String[] args): oder eine JavaFX-Anwendung muss javafx.application.Application erweitern 

Es fehlt eine main - also schnell Main.java kompilieren

>>javac Main.java
>>
>

Mode                 LastWriteTime         Length Name


----
-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:48            643 Main.class -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            370 Pythagoras.java 

Spannend

  • Auch Greeeter.class ist mitkompiliert worden!
  • Aber Pythagoras.class ist NICHT nochmal kompiliert worden (s. Zeitstempel)

Was, wenn einige Dateien nicht als .java vorliegen?

Um das zu simulieren, verschieben wir ein paar java-files in den Ordner temp

>>>>>>mkdir temp mv Pythagoras.java temp mv Greeter.java temp rm Main.class 

… und kompilieren dann 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 moeglich!

Compiler ist sogar happy ueber bereits fertig kompilierte Klassen.

>>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 

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

>>rm Main.class mkdir classes mv *.class classes 

Aber jetzt funktioniert das kompilieren von Main.java nicht mehr, weil die Klassen nicht gefunden werden.

>>javac Main.java 

Deshalb muss ich dem Compiler erstmal sagen, wo sich die Klassendateien befinden. Hierfuer benutzt man die -cp Option (**Class Path).

>>javac -cp classes Main.java 

Aber man kann es immer noch nicht ausfuehren!

>>java Main 

Es muss auch hier wieder der classPath angegeben werden…

>>java -cp classes Main Fehler: Hauptklasse Main konnte nicht gefunden oder geladen werden Ursache: java.lang.ClassNotFoundException: Main 

… und der classPath muss angepasst werden und durch ; (Windows) um das aktuelle 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 koennen jetzt auch alle .class-files loeschen 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