24.5 Das Archivformat JAR
Die JAR-Dateien (von Java-Archiv) bilden ein Archivformat, das ZIP ähnelt. Wie für ein Archivformat üblich, packt auch JAR mehrere Dateien zusammen. »Gepackt« heißt aber nicht zwingend, dass die Dateien komprimiert sein müssen, sie können einfach nur in einem JAR gebündelt sein. Ein Auspackprogramm wie 7-Zip kann JAR-Dateien entpacken. Hier bleibt zu überlegen, ob ein Programm wie 7-Zip mit der Dateiendung .jar verbunden werden soll oder ob das Standardverhalten bei installiertem JRE beibehalten wird: Unter Windows ist mit der Dateiendung .jar das JRE verbunden, das die Hauptklasse des Archivs startet.
Signieren und Versionskennungen
Microsoft vertraut bei seinen ActiveX-Controls vollständig auf Zertifikate und glaubt an eine Zurückverfolgung der Übeltäter in dem Fall, dass das Control Unsinn anstellt. Leider ist in dieser Gedankenkette ein Fehler enthalten, weil sich jeder Zertifikate ausstellen lassen kann, auch unter dem Namen Mickey Mouse.[ 288 ](Obwohl dieser schon vergeben ist; doch vielleicht ist »Darkwing Duck« ja noch frei. )
Überlegt angewendet, ist das Konzept jedoch gut zu verwenden, und JAR-Archive nutzen das gleiche Konzept. Sie lassen sich durch eine Signatur schützen, und die Laufzeitumgebung räumt Java-Programmen Extrarechte ein, die ein normales Programm sonst nicht hätte. Dies ist bei Programmen aus dem Intranet interessant.
Des Weiteren können Hersteller Informationen über Version und Kennung hinzufügen wie auch eine Versionskontrolle, damit nur solche Klassen eines Archivs verwendet werden, die den Verbleib in der gleichen Version gewährleisten. Außerdem kam ein Archivformat hinzu, das Pakete zur Core-Plattform-API hinzunehmen kann. Beispiele sind die 3D- und Java-Mail-API. Eigene Pakete sehen also so aus, als gehörten sie zum Standard.
24.5.1 Das Dienstprogramm jar benutzen
jar ist ein Kommandozeilenprogramm und verfügt über verschiedene Optionen, um Archive zu erzeugen, sie auszupacken und anzusehen. Die wichtigsten Formen für das Kommandozeilenprogramm sind:
-
Anlegen: jar c[Optionen] JAR-Datei Eingabedateien
-
Aktualisieren: jar u[Optionen] JAR-Datei Eingabedateien
-
Auspacken: jar x[Optionen] JAR-Datei
-
Inhalt anzeigen: jar t[Optionen] JAR-Datei
-
Indexdatei INDEX.LIST erzeugen: jar i JAR-Datei
Je nach Aktion sind weitere Optionen möglich.
Daneben gibt es eine API im Paket java.util.jar, mit der alles programmiert werden kann, was auch das Dienstprogramm leistet.
[+] Tipp
Selten wird ein Jar-Werkzeug auf der Kommandozeile oder in einem Shell-Skript eingesetzt. In der Regel bauen Build-Werkzeuge wie Maven oder Gradle am Ende der Compilation ein Java-Archiv. In einem Maven-Projekt wird so eine Java-Datei erzeugt:
mvn package
24.5.2 Das Manifest
Ohne dass die Ausgabe es zeigt, fügt jar beim Erzeugen eines Archivs automatisch eine Manifest-Datei namens META-INF/MANIFEST.MF ein. Ein Manifest enthält wichtige Zusatzinformationen für ein Archiv, wie die Signatur, die für jede Datei aufgeführt ist.
[zB] Beispiel
Ausschnitt aus der Manifest-Datei des H2 Datenbankmanagementsystems:[ 289 ](https://repo1.maven.org/maven2/com/h2database/h2/1.4.200/h2-1.4.200.jar)
Manifest-Version: 1.0
Implementation-Title: H2 Database Engine
Implementation-URL: https://h2database.com
Implementation-Version: 1.4.200
Build-Jdk: 1.7
Created-By: 1.7.0_80-b15 (Oracle Corporation)
Main-Class: org.h2.tools.Console
Automatic-Module-Name: com.h2database
Bundle-Activator: org.h2.util.DbDriverActivator
Bundle-ManifestVersion: 2
Bundle-Name: H2 Database Engine
Bundle-SymbolicName: com.h2database
Bundle-Vendor: H2 Group
Bundle-Version: 1.4.200
...
Die Einträge im Manifest erinnern an eine Property-Datei, denn auch hier gibt es immer Schlüssel und Werte, die durch einen Doppelpunkt voneinander getrennt sind.
24.5.3 Applikationen in JAR-Archiven starten
Dass die Dateien zusammen in einem Archiv gebündelt sind, hat den Vorteil, dass Entwickler ihren Kunden nicht mehr ein ganzes Bündel von Klassen- und Ressourcendateien liefern müssen, sondern nur eine einzige Datei. Ein anderer Vorteil ist, dass ein Betriebssystem wie Windows oder macOS standardmäßig mit der Endung .jar das JRE (Java Runtime Environment) verbindet, sodass ein Doppelklick auf eine JAR-Datei das Programm gleich startet.
Main-Class im Manifest
Damit die Laufzeitumgebung weiß, welches main(String[]) welcher Klasse sie aufrufen soll, ist eine kleine Notiz mit dem Schlüssel Main-Class in der Manifest-Datei nötig:
Main-Class: voll.qualifizierter.Klassenname.der.Klasse.mit.main
Dies ist sehr angenehm für den Benutzer eines Archivs, denn nun ist der Hersteller für den Eintrag des Einstiegspunktes im Manifest verantwortlich.
Von der Kommandozeile oder mit Doppelklick starten
Starten wir den Interpreter java von der Kommandozeile, gibt die Option -jar das Archiv an. Der Interpreter sucht nach dem Startprogramm, das durch die Manifest-Datei gegeben ist.
$ java -jar JarDatei.jar
Ausführbare Java-Archive starten wir unter Windows mit einem Doppelklick, da die Dateiendung .jar dazu führt, dass javaw -jar mit dem Dateinamen ausgeführt wird. Auch Solaris ab 2.6 erkennt JAR-Dateien in der Konsole oder auf dem Desktop als ausführbare Programme und startet sie selbstständig mit java -jar.
[»] Hinweis
java (oder javaw) ignoriert die Angaben über -cp bzw. Einträge in der Umgebungsvariablen CLASSPATH, wenn ein Java-Programm mit -jar gestartet wird.
Statt viele kleine Java-Archive zu referenzieren, ist eine weitere Möglichkeit, erst einmal alle Jar-Dateien auszupacken und sie dann wieder zu einem neuen großen JAR zusammenzupacken, das java -jar starten kann. Mit Maven lässt sich das über das Apache Maven Shade Plugin realisieren.[ 290 ](https://maven.apache.org/plugins/maven-shade-plugin/index.html) Das Ergebnis nennt sich auch Fat-JAR.