# Java Archive

Ein Java Archive (umgangssprachlich wegen der Dateiendung auch JAR-Datei genannt) dient der Gliederung, Verteilung und Bereitstellung von Klassenbibliotheken und ausführbaren Programmen, die in der Programmiersprache Java erstellt wurden. Technisch ist es eine komprimierte Datei im ZIP-Format. Das Archiv enthält kompilierte Java-Klassen (Bytecode) und ggf. weitere Ressourcen. In der Regel umfasst es auch eine oder mehrere Dateien mit Metadaten. Diese haben fest vorgegebene Namen und Strukturen und liegen im Verzeichnis META-INF. Die typische Datei META-INF/MANIFEST.MF wird im Abschnitt Manifest genauer beschrieben. Die Kurzbezeichnung des Archivs kann als Wortspiel mit dem englischen Wort jar (deutsch: „Gefäß“) verstanden werden.

## Verwendung

JAR-Dateien wurden ursprünglich eingeführt, damit von Java-Applets benötigte Java-Klassen nicht einzeln aus dem Netz nachgeladen werden müssen. Die Übertragung vieler Klassen in einer Datei ist effizienter, und zusätzlich können die Dateien komprimiert werden.
Durch die „Manifest“-Datei kann festgelegt werden, wie die Java-Anwendung gestartet wird. Damit kann auch unter grafischen Benutzeroberflächen, wie Windows, macOS oder KDE, die Anwendung ohne Zuhilfenahme der Kommandozeile gestartet werden (vorausgesetzt, der Dateiendung .jar wurde der entsprechende Befehl zugewiesen). Mit java -jar kann man JAR-Dateien aus der Kommandozeile starten. JAR-Archive speichern Dateinamen intern UTF-8-kodiert, sodass sie auch Umlaute enthalten dürfen. Voraussetzung für das Ausführen von JARs bzw. Java-Programmen ist immer ein installiertes Java Runtime Environment.
JAR-Dateien können mit dem jar-Befehl des JDK (der die Syntax von tar benutzt) oder, sofern die Dateinamen nur ASCII-Zeichen enthalten, mit jedem ZIP-Programm erstellt werden. Außerdem bietet die Java Platform, Standard Edition in den beiden Paketen „java.util.jar“ und „java.util.zip“ Klassen an, um JAR- oder ZIP-Archive auszulesen oder zu erstellen.
Zum Beispiel zeigt der folgende Befehl den Inhalt einer JAR-Datei namens test.jar an.
Dabei steht der Buchstabe t für „Inhaltsverzeichnis anzeigen“ (von englisch table of contents), v für ausführliche Ausgabe (von englisch verbose) und f besagt, dass aus einer Datei (englisch file) gelesen werden soll, deren Name folgt.

## Manifest

Jedes Java Archive kann im Verzeichnis „META-INF“ durch eine Datei namens „MANIFEST.MF“ verschiedene Informationen über den Inhalt des Archivs bereitstellen. Zu den wichtigsten Meta-Informationen zählen
* die zur Laufzeit ermittelbare Version enthaltener Klassenbibliotheken,
* Informationen über enthaltene JavaBeans und
* der Name der Hauptklasse einer enthaltenen Java-Anwendung.
Diese Manifest-Datei ist eine einfache zeilenorientierte Textdatei, die mehrere Paare aus Namen und Werten enthält, deren jedes ein sogenanntes Attribut definiert. Ein Attribut ist eine Eigenschaft der gesamten Anwendung, der enthaltenen Klassenbibliothek oder auch nur eines einzelnen Java-Pakets (package) oder einer einzelnen Klasse. Zusätzlich ist sie in mehrere Abschnitte (sections) aufgeteilt.
Der erste Abschnitt heißt main section (Hauptabschnitt) und definiert Attribute, die sich auf das gesamte Java Archive beziehen. Er beginnt immer mit der Definition des Attributs „Manifest-Version“, während die übrigen Attribute optional sind. Die folgenden Abschnitte beziehen sich jeweils auf ein einzelnes Paket oder eine Klasse und sind optional ebenso wie die darin enthaltenen Attribute. Unbekannte Attribute werden ignoriert und führen nicht zu Fehlermeldungen. Wird ein Attribut sowohl im Hauptabschnitt als auch in einem Einzelabschnitt definiert, so überlagert der im Einzelabschnitt definierte Wert den im Hauptabschnitt vorbelegten für diejenige Komponente (Paket oder Klasse), auf die sich der Abschnitt bezieht.

### Beispiel

Das folgende Beispiel zeigt einen Ausschnitt des Manifests der in der Laufzeitumgebung von Java 1.4 enthaltenen Datei „rt.jar“.
Dem Hauptabschnitt in diesem Beispiel lässt sich entnehmen, dass dieses Manifest so aufgebaut ist, wie in (der bisher einzigen) Version 1 der JAR-Datei-Spezifikation von Sun Microsystems beschrieben. Die übrigen Attribute dieses Hauptabschnitts liefern Informationen über die von der Bibliothek erfüllte Spezifikation, den Erzeuger des Java Archives, den Namen der Implementierung, sowie Hersteller und Version der verwendeten Spezifikation und der enthaltenen Implementierung. Die beiden folgenden Abschnitte des Beispiels beziehen sich jeweils auf eine Klasse, die als JavaBean markiert wird.

## Abgeleitete Formate

Weitere Spezialisierungen des JAR-Formats sind zum Beispiel WAR-Dateien (Web Application Archive), EAR-Dateien (Enterprise Application Archive) oder OpenDocument-Dateien.

## Hilfsprogramme

Das Java Development Kit enthält bzw. enthielt mehrere Programme zur Manipulation von JAR-Dateien:

### jar

    jar ist ein Programm zum Erzeugen, Modifizieren und Entpacken von JAR-Dateien, dessen Aufrufparameter denjenigen des bekannten Unix-Programms tar ähneln.

### jarsigner

    jarsigner ist ein Programm, das JAR-Dateien signiert und deren elektronische Signatur überprüft.

### pack200

    pack200 wandelte JAR-Dateien in ein Dateiformat um, das Bytecode effizienter speichern kann. Es wurde in Java 5 eingeführt und kam insbesondere bei Java Web Start zum Einsatz, da hier unter Umständen größere Dateimengen über das Internet übertragen werden mussten. Die Rückwandlung erfolgte mit dem Programm unpack200. Java 13 war die letzte Version, die pack200 und unpack200 enthielt.
Nicht im JDK enthaltene Programmierwerkzeuge für JAR-Dateien:

### ProGuard

    ProGuard ist ein Programm zum Komprimieren, Optimieren und Verschleiern von JAR-Dateien. Dies wird durch eine genauere Analyse des Bytecodes erreicht.

### Packer

    Sofern die Dateinamen im Archiv aus ASCII-Zeichen bestehen, lassen sich JAR-Dateien mit jedem Software-Werkzeug bearbeiten, das auch ZIP-Dateien bearbeiten kann. Einige Beispiele sind in der Liste von Datenkompressionsprogrammen aufgeführt.