Rheinwerk Computing < openbook >


 
Inhaltsverzeichnis
Materialien
Vorwort
1 Java ist auch eine Sprache
2 Imperative Sprachkonzepte
3 Klassen und Objekte
4 Arrays und ihre Anwendungen
5 Der Umgang mit Zeichenketten
6 Eigene Klassen schreiben
7 Objektorientierte Beziehungsfragen
8 Ausnahmen müssen sein
9 Geschachtelte Typen
10 Besondere Typen der Java SE
11 Generics<T>
12 Lambda-Ausdrücke und funktionale Programmierung
13 Architektur, Design und angewandte Objektorientierung
14 Java Platform Module System
15 Die Klassenbibliothek
16 Einführung in die nebenläufige Programmierung
17 Einführung in Datenstrukturen und Algorithmen
18 Einführung in grafische Oberflächen
19 Einführung in Dateien und Datenströme
20 Einführung ins Datenbankmanagement mit JDBC
21 Bits und Bytes, Mathematisches und Geld
22 Testen mit JUnit
23 Die Werkzeuge des JDK
A Java SE-Module und Paketübersicht
Stichwortverzeichnis


Download:

- Listings, ca. 2,7 MB


Buch bestellen
Ihre Meinung?



Spacer
<< zurück
Java ist auch eine Insel von Christian Ullenboom

Einführung, Ausbildung, Praxis
Buch: Java ist auch eine Insel


Java ist auch eine Insel

Pfeil 23 Die Werkzeuge des JDK
Pfeil 23.1 Übersicht
Pfeil 23.1.1 Aufbau und gemeinsame Schalter
Pfeil 23.2 Java-Quellen übersetzen
Pfeil 23.2.1 Der Java-Compiler des JDK
Pfeil 23.2.2 Alternative Compiler
Pfeil 23.2.3 Native Compiler
Pfeil 23.3 Die Java-Laufzeitumgebung
Pfeil 23.3.1 Schalter der JVM
Pfeil 23.3.2 Der Unterschied zwischen java.exe und javaw.exe
Pfeil 23.4 Dokumentationskommentare mit Javadoc
Pfeil 23.4.1 Einen Dokumentationskommentar setzen
Pfeil 23.4.2 Mit dem Werkzeug javadoc eine Dokumentation erstellen
Pfeil 23.4.3 HTML-Tags in Dokumentationskommentaren *
Pfeil 23.4.4 Generierte Dateien
Pfeil 23.4.5 Dokumentationskommentare im Überblick *
Pfeil 23.4.6 Javadoc und Doclets *
Pfeil 23.4.7 Veraltete (deprecated) Typen und Eigenschaften
Pfeil 23.4.8 Javadoc-Überprüfung mit DocLint
Pfeil 23.5 Das Archivformat JAR
Pfeil 23.5.1 Das Dienstprogramm jar benutzen
Pfeil 23.5.2 Das Manifest
Pfeil 23.5.3 Applikationen in JAR-Archiven starten
Pfeil 23.6 jlink: der Java Linker
Pfeil 23.7 Zum Weiterlesen
 

Zum Seitenanfang

23.5    Das Archivformat JAR Zur vorigen ÜberschriftZur nächsten Überschrift

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 WinZip 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.[ 291 ](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.

 

Zum Seitenanfang

23.5.1    Das Dienstprogramm jar benutzen Zur vorigen ÜberschriftZur nächsten Überschrift

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.

JAR-Dateien anlegen

Die notwendige Option für das Anlegen eines neuen Archivs ist c (für engl. create). Da wir häufig die Ausgabe (das neue Archiv) in einer Datei haben wollen, geben wir zusätzlich f (für engl. file) an. Somit können wir schon unser erstes Archiv erstellen.

[zB]  Beispiel

Nehmen wir dazu an, es gibt ein Verzeichnis images für Bilder und die Klasse Slider.class. Dann packt folgende Zeile die Klasse und alle Bilder in das Archiv slider.jar:

$ jar cvf slider.jar Slider.class images

adding: Slider.class (in=2790) (out=1506) (deflated 46 %)

adding: images/ (in=0) (out=0) (stored 0 %)

adding: images/darkwing.gif (in=1065) (out=801) (deflated 24 %)

adding: images/volti.gif (in=173) (out=154) (deflated 10 %)

adding: images/superschurke.gif (in=1076)(out=926)(deflated 13 %)

adding: images/aqua.gif (in=884) (out=568) (deflated 35 %)

Während des Komprimierens geht jar alle angegebenen Verzeichnisse und Unterverzeichnisse durch und gibt, da zusätzlich zu cf der Schalter v gesetzt ist, auf dem Bildschirm die Dateien mit einem Kompressionsfaktor an. Statt der Dateinamen können wir auch * oder andere Wildcards angeben. Diese Expansionsfähigkeit ist ohnehin Aufgabe der Shell. Möchten wir die Dateien nicht komprimiert haben, sollten wir den Schalter 0 angeben.

jar behält bei den zusammengefassten Dateien standardmäßig die Verzeichnisstruktur bei. In der oberen Ausgabe ist abzulesen, dass jar für images ein eigenes Verzeichnis im Archiv erstellt und die Bilder dort hineinsetzt. Der Schalter C (genau wie -C beim Kompressionsprogramm GZip) bildet diese hierarchische Struktur flach ohne Verzeichnisstruktur ab. Wenn wir mehrere Verzeichnisse zusammenpacken, lässt sich für jedes Verzeichnis bestimmen, ob die Struktur erhalten bleiben soll oder nicht.

[zB]  Beispiel

Erstellen wir das sliders-Archiv neu mit zusätzlichen Sound-Dateien.

$ jar cfv0 slider.jar Slider.class images -C sounds

Zweierlei ist neu: Zum einen komprimiert jar nicht mehr (der Schalter 0 ist gesetzt), und die Option C erreicht, dass jar in das sound-Verzeichnis geht und dort alle Sound-Dateien in das Basisverzeichnis setzt.

Einer angelegten Archivdatei lassen sich später mit u (für engl. update) noch Dateien hinzufügen.

[zB]  Beispiel

Nehmen wir an, es kommt eine Bilddatei hinzu, so schreiben wir:

$ jar vuf slider.jar images/buchsbaum.gif

JAR-Dateien betrachten

Die zusammengepackten Dateien zeigt die Option tf an.

[zB]  Beispiel
$ jar tf slider.jar

META-INF/MANIFEST.MF

Slider.class

images/volti.gif

Zusätzlich zu unseren Dateien sehen wir eine von jar eigenständig hinzugefügte Manifest-Datei, die wir in Abschnitt 23.5.2, »Das Manifest«, besprechen wollen.

Fehlt die Endung oder ist der Dateiname falsch angegeben, folgt eine etwas ungewöhnliche Fehlermeldung: java.io.FileNotFoundException – das heißt: ein Dateiname und dann ein Stack-Trace. Dies wirkt etwas unprofessionell.

Zum Anzeigen der Archive kommt der Schalter t (für engl. table of contents) zum Einsatz. Mit dem Schalter f geben wir den Dateinamen auf der Kommandozeile an und nicht von der Standardeingabe etwa über eine Pipe.

[zB]  Beispiel

Der Schalter v (für engl. verbose) gibt den Zeitpunkt der letzten Änderung und die Dateigröße aus:

 291 Fri Dec 17 14:51:08 GMT 1999 META-INF/MANIFEST.MF

2790 Thu Dec 16 14:54:06 GMT 1999 Slider.class

173 Mon Oct 14 00:38:00 GMT 1996 images/volti.gif

Dateien aus dem Archiv extrahieren

Der wichtigste Schalter beim Entpacken ist x (für engl. extract). Zusätzlich gilt für den Schalter f (für engl. file) das Gleiche wie beim Anzeigen: Ohne den Schalter erwartet jar die Archivdatei in der Standardeingabe. Als Parameter ist zusätzlich das Archiv erforderlich. Sind optional Dateien oder Verzeichnisse angegeben, packt jar nur diese aus. Nötige Verzeichnisse für die Dateien erzeugt jar automatisch. Hier ist Vorsicht geboten, denn jar überschreibt alle Dateien, die schon mit dem gleichen Namen auf dem Datenträger existieren. Das Archiv bleibt nach dem Auspacken erhalten.

[zB]  Beispiel

Wir wollen jetzt nur die Grafiken aus unserem Archiv slider.jar auspacken. Dazu schreiben wir:

$ jar vxf slider.jar images\*

extracted: images\volti.gif

Mit der Option v sehen wir, was genau jar entpackt. Sonst erfolgt keine Ausgabe auf der Konsole.

 

Zum Seitenanfang

23.5.2    Das Manifest Zur vorigen ÜberschriftZur nächsten Überschrift

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

Sehen wir uns einmal die Manifest-Datei an, die sich ergibt:

$ jar cfv slider.jar Slider.class images/volti.gif

Manifest-Version: 1.0

Name: Slider.class

Digest-Algorithms: SHA MD5

SHA-Digest: /RD8BF1mwd3bYXcaYYkqLjCkYdw=

MD5-Digest: WcnCNJbo08PH/ATqMHqZDw==

Name: images/volti.gif

Digest-Algorithms: SHA MD5

SHA-Digest: 9zeehlViDy0fpfvOKkPECiMYvH0=

MD5-Digest: qv913KlZFi5tdPr2BjatIg==

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.

 

Zum Seitenanfang

23.5.3    Applikationen in JAR-Archiven starten Zur vorigen ÜberschriftZur nächsten Überschrift

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.

Manifest-Dateien mit Main-Class-Einträgen erstellen

Wir können das m-Flag (für engl. merge) beim Dienstprogramm jar nutzen, um Einträge zum Manifest hinzuzufügen und auf diese Weise dem JAR-Archiv die Klasse mit der statischen main(String[])-Methode mitzuteilen. Bevor wir ein Archiv erzeugen, erstellen wir eine Textdatei, die wir hier MainfestMain.txt nennen wollen, mit dem Eintrag Main-Class:

Listing 23.4    MainfestMain.txt

Main-Class: Main

Unser Slider-Programm soll die Hauptklasse Main.class besitzen. Nun lässt sich die Datei MainfestMain.txt mit der Manifest-Datei zusammenbinden und anschließend benutzen:

$ jar cmf MainfestMain.txt slider.jar Main.class

$ java -jar slider.jar

$ java -jar slider.jar Main
[»]  Hinweis

Der Schalter e (für engl. endpoint) bestimmt direkt die ausführbare Klasse in der Manifest-Datei des Java-Archivs:

$ jar cfe application.jar com.tutego.Main com/tutego/Main.class

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.

inline image  Das Fat Jar Eclipse Plug-In (http://fjep.sourceforge.net) entpackt etwaige referenzierte Java-Archive und bündelt sie zu einem neuen großen JAR, das java -jar starten kann. Zur Installation betrachte http://sourceforge.net/p/fjep/discussion/396532/thread/4edb64ed. Üblicherweise erstellt Maven die Fat-JAR.

 


Ihre Meinung?

Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de

<< zurück
 Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Java ist auch eine Insel Java ist auch eine Insel

Jetzt Buch bestellen


 Buchempfehlungen
Zum Rheinwerk-Shop: Captain CiaoCiao erobert Java

Captain CiaoCiao erobert Java




Zum Rheinwerk-Shop: Java SE 9 Standard-Bibliothek

Java SE 9 Standard-Bibliothek




Zum Rheinwerk-Shop: Algorithmen in Java

Algorithmen in Java




Zum Rheinwerk-Shop: Objektorientierte Programmierung

Objektorientierte Programmierung




 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und in die Schweiz

InfoInfo



 

 


Copyright © Rheinwerk Verlag GmbH 2021

Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.

Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

 

[Rheinwerk Computing]



Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de



Cookie-Einstellungen ändern