Java-Tipp 120: Führen Sie selbstextrahierende JARs aus

Seit vielen Jahren ist Phil Katz 'Archiv-Erstellung zip eines der beliebtesten Dateiarchivierungsformate. Sun hat das Zip-Format als Grundlage für das Java-Archiv (JAR) übernommen. Sun hat die Verwendung des Zip-Formats um verschiedene Konventionen erweitert, sodass Sie Java-Klassen in eine Archivdatei packen können. Durch Hinzufügen der JAR- Manifestdatei kann die Java-Laufzeit die Hauptklasse der in der JAR-Datei enthaltenen Java-Anwendung leicht finden und direkt ausführen.

Einige zipDienstprogramme können selbstextrahierende Archive für verschiedene Plattformen erstellen , z. B. MS Windows. Das Dienstprogramm kombiniert ein reguläres Zip-Archiv mit einem Extraktionsprogramm, um eine neue ausführbare Datei (exe) zu generieren. Empfänger der exe-Datei müssen sie nur ausführen, um den Inhalt des ursprünglichen Zip-Archivs zu extrahieren. Die ausführbare Datei führt das Extraktionsprogramm aus, um die archivierten Dateien in ein benutzerdefiniertes Ausgabeverzeichnis zu extrahieren.

Sie können eine Basis-Zip- oder JAR-Datei auf jeder Java-Plattform in eine ausführbare JAR-Datei konvertieren. Während die selbstextrahierende Zip-Datei nur plattformspezifische ausführbare Dateien erstellen kann, kann die selbstextrahierende JAR-Datei auf jede Plattform verteilt und auf dieser ausgeführt werden, die Java unterstützt.

Das Erstellen der selbstextrahierenden JAR-Datei ist unkompliziert. Sie benötigen lediglich eine spezielle JAR-Manifestdatei, ein Java-basiertes Extraktionsprogramm, die Zip- oder JAR-Datei mit den Basisinhaltsdateien und die jarDienstprogrammanwendung eines Java SDK .

Die Manifestdatei

Um ausführbare JARs zu erstellen, benötigen Sie zunächst eine Manifestdatei, die MANIFEST.MFim META-INFVerzeichnis aufgerufen wird . Die Manifestdatei kann eine Reihe möglicher Einträge enthalten. Für unsere Zwecke hier müssen wir jedoch nur den Namen der Java-Klasse angeben, die die main()Methode des Java-basierten Extraktionsprogramms enthält :

Hauptklasse: ZipSelfExtractor 

Wir haben jarmanifestdem Beispielcode dieses Tipps eine Manifestdatei hinzugefügt . Weitere Informationen zur Manifestdatei finden Sie in der Jar-Dateispezifikation.

Der Extraktor

Sie können das Extraktionsprogramm mit verschiedenen Ansätzen erstellen. Der hier vorgestellte Ansatz ist einfach und unkompliziert. Zunächst ermittelt das Extraktionsprogramm den Namen der selbstextrahierenden JAR-Datei. Mit diesem Namen verwendet der Extraktor die in Java integrierten Standard-Zip / JAR-Bibliotheken, um die Inhaltsdateien aus dem Archiv zu extrahieren. Den vollständigen Quellcode finden Sie ZipSelfExtractorin ZipSelfExtractor.java.

Das Abrufen des Dateinamens jar im Extraktionsprogramm kann schwierig sein. Obwohl der Name der JAR-Datei in der Befehlszeile angezeigt wird, wird dieser Name nicht an die main()Methode der Klasse übergeben . Daher verwenden wir im Extraktionsprogramm den folgenden Code, um die Informationen aus der URL zu extrahieren, die auf den Extraktor verweist:

private Zeichenfolge getJarFileName () {myClassName = this.getClass (). getName () + ".class"; URL urlJar = this.getClass (). GetClassLoader (). GetSystemResource (myClassName); String urlStr = urlJar.toString (); int from = "jar: file:". length (); int to = urlStr.indexOf ("! /"); return urlStr.substring (von, bis); }}

Beachten Sie, dass in der getSystemResource()Methode wir myClassNameanstelle von übergeben ZipSelfExtractor.class. Auf diese Weise können wir den Namen des Extraktionsprogramms ändern, ohne diesen Teil des Codes zu ändern. Wir setzen, myClassNameindem wir den Namen der aktuellen Klasse nachschlagen.

Als nächstes extrahieren wir den Namen der JAR-Datei. Zuerst fragen wir nach einer URL zu der Klassendatei, die die aktuell ausgeführte Klasse enthält (das ist das Extraktionsprogramm). Sobald wir die URL haben, können wir den Namen der JAR-Datei herausschneiden. Per Definition folgt die URL des JAR-Extraktionsprogramms dem Grundformat:

  1. jar:Dies zeigt, dass die ausführbare Datei in einer JAR-Datei ausgeführt wird
  2. Die URL der JAR-Datei, z. B. file:/C:/temp/test.jargefolgt vom !Zeichen
  3. Der interne Pfadname der Datei innerhalb der JAR, z /ZipSelfExtractor.class

Im Fall des Extraktionsprogramms könnte die URL folgendermaßen aussehen:

jar: file: /home/johnm/test/zipper.jar! /ZipSelfExtractor.class 

Nachdem wir den Namen der JAR-Datei haben, können wir die Extraktion durchführen. Der Mut des Extraktionsprogramms beruht auf den integrierten Java-Bibliotheken zur Manipulation von Zip- / JAR-Dateien, um die im Archiv enthaltenen Inhaltsdateien zu dekomprimieren. Weitere Informationen zu den Manipulationsbibliotheken für zip / jar-Dateien finden Sie unter Ressourcen.

Zur Vereinfachung der Verwendung ist der Extraktor eine grafische Java-Anwendung. Die Anwendung verwendet die JFileChooserKlasse, damit Benutzer das Zielverzeichnis angeben können, in das die Dateien extrahiert werden sollen. A ProgressMonitorzeigt den Fortschritt des Extraktionsprozesses. Wenn eine Datei möglicherweise eine bereits vorhandene Datei überschreibt, wird der Benutzer gefragt, ob die vorhandene Datei überschrieben werden soll oder nicht. Am Ende werden in einem Standarddialogfeld Extraktionsstatistiken angezeigt.

Schließlich prüft das Extraktionsprogramm, ob die Dateien, die die JAR-Datei selbst extrahieren, nicht extrahiert werden - die Manifestdatei und die Extraktordatei .class. Das Programm sollte nur den ursprünglichen JAR-Inhalt extrahieren. Diese beiden Dateien sind Artefakte der selbstextrahierenden JAR-Datei und nicht Teil der ursprünglichen Basisinhaltsdateien.

JAR-Datei packen

Nachdem wir die Manifestdatei und das Extraktionsprogramm haben, können wir die selbstextrahierende JAR-Datei erstellen. Wir können das JDK- jarDienstprogramm manuell verwenden , um eine selbstextrahierende JAR-Datei zu erstellen. Angenommen, Sie haben eine Zip-Datei mit dem Namen myzip.zip, können Sie die folgenden Schritte ausführen, um eine selbstextrahierende Datei daraus zu erstellen:

  1. cd in das Verzeichnis mit myzip.zip
  2. Herunterladen zipper.jar
  3. Extrahieren Sie die Dateien in das aktuelle Verzeichnis. Wir haben es zu einem selbstextrahierenden JAR gemacht:
    java -jar zipper.jar 
  4. Kopieren Sie die zipper.classDatei nachZipSelfExtractor.class
  5. Umbenennen myzip.zipinmyzip.jar
  6. Update myzip.jarmit den jarmanifestund ZipSelfExtractor.classDateien:
    jar uvfm myzip.jar jarmanifest ZipSelfExtractor.class 

Jetzt myzip.jarwird auf allen Plattformen, die Java Runtime Environment (JRE) 1.2 oder höher enthalten, selbstextrahiert. Führen Sie Folgendes aus, um die selbstextrahierende JAR-Datei auszuführen:

java -jar myzip.jar 

Beachten Sie, dass auf einigen Plattformen möglicherweise bereits Bindungen eingerichtet sind, sodass Sie die JAR-Datei ausführen können, indem Sie einfach auf das myzip.jarDateisymbol klicken , wodurch die entsprechende Befehlszeile ausgeführt wird.

Übung für den Leser

Die aktuelle ZipSelfExtractVersion lässt sich nicht gut integrieren, wenn Sie aus einer vorhandenen JAR-Datei, die eine Manifestdatei enthält, eine selbstextrahierende JAR erstellen. Fügen Sie dem Selbstextraktor und den Erstellungsanweisungen Intelligenz hinzu, damit Sie mit vorhandenen JAR-Dateien arbeiten können, die Manifestdateien enthalten.

Befreie deine Hand vom JAR

Eine selbstextrahierende JAR-Datei ist ein guter Mechanismus für die plattformübergreifende Verteilung von Dateien. Selbstextrahierende JARs sind einfach zu erstellen, und die minimale Benutzeranforderung für eine Installation mit JRE 1.2 oder höher ist ein angemessener Kompromiss, um plattformübergreifende Unterstützung zu erhalten.

Schauen Sie sich ZipAnywhere an, anstatt die selbstextrahierende JAR-Datei manuell zu erstellen. ZipAnywhere ist ein voll ausgestattetes zip/ jarUtility - Tool in 100% pure Java geschrieben. Es ist ein kostenloses GUI-basiertes Tool a la WinZip und kann mit einem Klick selbstextrahierende JAR-Dateien erstellen.

Dr. Zunhe Steve Jin ist Software-Ingenieur bei Rational Software und Autor von ZipAnywhere. John D. Mitchell ist der mitwirkende Herausgeber der JavaWorld Tips 'N Tricks-Spalte. John ist außerdem Gründer und Chefarchitekt von Non, Inc., einer Beratungspraxis für technologisches Geschäftsrisikomanagement.

Erfahren Sie mehr über dieses Thema

  • Laden Sie die Quelldateien für diesen Tipp herunter

    //www.javaworld.com/javaworld/javatips/javatip120/zipper.jar

  • "Java Tip 49How to Extract Java Resources from JAR and Zip Archives," John D. Mitchell and Arthur Choi (JavaWorld)

    //www.javaworld.com/javaworld/javatips/jw-javatip49.html

  • "Java Tip 70Create Objects from Jar Files!" John D. Mitchell (JavaWorld)

    //www.javaworld.com/javaworld/javatips/jw-javatip70.html

  • Jar File Specification

    //java.sun.com/j2se/1.3/docs/guide/jar/jar.html

  • JAR command line guide

    //java.sun.com/j2se/1.3/docs/tooldocs/win32/jar.html

  • ZipAnywhere, GUI-based self-extracting JAR creation tool

    //www.geocities.com/zipanywhere

  • View all previous Java Tips and submit your own

    //www.javaworld.com/javatips/jw-javatips.index.html

  • Learn Java from the ground up in JavaWorld's Java 101 column

    //www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html

  • Java experts answer your toughest Java questions in JavaWorld's Java Q&A column

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

  • Browse articles by topic in JavaWorld's Topical Index

    //www.javaworld.com/channel_content/jw-topical-index.shtml

  • Speak out in our Java Forum

    //forums.idg.net/[email protected]@.ee6b802

  • Sign up for JavaWorld's free weekly email newsletters

    //www.idg.net/jw-subscribe

  • You'll find a wealth of IT-related articles from our sister publications at .net

Diese Geschichte "Java-Tipp 120: Ausführen selbstextrahierender JARs" wurde ursprünglich von JavaWorld veröffentlicht.