**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.classist mitkompiliert worden! - Aber
Pythagoras.classist 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