Programmering

Java Tip 120: Udfør selvudpakkende JAR'er

I mange år har Phil Katz's oprettelse af arkiv, zip, været et af de mest populære filarkiveringsformater. Sun har vedtaget zip-formatet som basis for Java Archive (JAR). Sun har udvidet zip-formatets brug med forskellige konventioner, så du kan pakke Java-klasser i en arkivfil. Med tilføjelsen af ​​JAR manifest Java-runtime kan let finde og udføre hovedklassen i Java-applikationen indeholdt i jar-filen.

Nogle lynlås værktøjsværktøjer kan oprette selvudpakkende arkiver til forskellige platforme, såsom MS Windows. Værktøjsværktøjet kombinerer et almindeligt zip-arkiv med et ekstraktorprogram for at generere en ny eksekverbar (exe) fil. Modtagere af exe-filen behøver kun at køre den for at udtrække det originale zip-arkivs indhold. Den eksekverbare kører ekstraktorprogrammet for at udpakke de arkiverede filer i et brugerdefineret outputkatalog.

Du kan konvertere en base-zip- eller jar-fil til en eksekverbar jar-fil på enhver Java-platform. Mens den selvudpakkende zip kun kan oprette platformsspecifikke eksekverbare filer, kan den selvudpakkende jar-fil distribueres til og køre på enhver platform, der understøtter Java.

Oprettelse af den selvudpakkende jar-fil er ligetil. Du har bare brug for en speciel JAR-manifestfil, et Java-baseret udvindingsprogram, zip- eller jar-filen, der indeholder basisindholdsfilerne, og alle Java SDK'er krukke hjælpeprogram.

Manifestfilen

For at lave eksekverbare JAR'er skal du først have en manifestfil kaldet MANIFEST.MF i META-INF vejviser. Manifestfilen kan indeholde et antal mulige poster; men til vores formål her er vi bare nødt til at specificere navnet på Java-klassen, der indeholder det Java-baserede ekstraktorprogram hoved () metode:

Hovedklasse: ZipSelfExtractor 

Vi har tilføjet en manifestfil med navnet jarmanifest til dette tips eksempelkode. For yderligere oplysninger om manifestfilen, se Jar File Specification.

Emhætten

Du kan lave udsugningsprogrammet ved hjælp af forskellige tilgange. Den tilgang, vi præsenterer her, er enkel og ligetil. For det første regner ekstraktionsprogrammet ud den selvudpakkende jar-fils navn. Med dette navn i hånden bruger udtrækkeren standard, indbyggede Java zip / jar-biblioteker til at udtrække indholdsfilerne fra arkivet. Du kan finde den fulde kildekode til ZipSelfExtractor i ZipSelfExtractor.java.

At få jar-filnavnet i emhætteprogrammet kan være vanskelig. Selvom jar-filens navn vises på kommandolinjen, overføres dette navn ikke til klassens hoved () metode. Derfor bruger vi følgende kode i ekstraktorprogrammet til at udtrække informationen fra URL'en, der peger på emhætten:

 privat streng getJarFileName () {myClassName = this.getClass (). getName () + ".class"; URL urlJar = this.getClass (). GetClassLoader (). GetSystemResource (myClassName); Streng urlStr = urlJar.toString (); int fra = "jar: file:". længde (); int til = urlStr.indexOf ("! /"); returner urlStr.substring (fra, til); } 

Bemærk, at i getSystemResource () metode, vi passerer myClassName i stedet for ZipSelfExtractor.class. Det lader os ændre navnet på ekstraktorprogrammet uden at ændre den del af koden. Vi satte os myClassName ved at slå den aktuelle klasses navn op.

Dernæst udpakker vi jar-filens navn. Først beder vi om en URL til klassefilen, der indeholder den aktuelt kørende klasse (som er ekstraktorprogrammet). Når vi har URL-adressen, kan vi klippe jar-filens navn ud. Per definition følger URL'en til JAR-ekstraktorprogrammet det grundlæggende format:

  1. krukke:, som viser, at den eksekverbare kører indefra en jar-fil
  2. Jar-filens URL, f.eks fil: / C: /temp/test.jarefterfulgt af ! Karakter
  3. Filens interne stienavn inden for JAR, f.eks /ZipSelfExtractor.class

I uddragsprogrammets tilfælde kan URL'en se ud som:

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

Nu hvor vi har jar-filens navn, kan vi udføre ekstraktionen. Ekstraktionsprogrammets indvolde er afhængige af de indbyggede Java-zip / jar-filmanipuleringsbiblioteker til at dekomprimere de indholdsfiler, der findes i arkivet. Se Ressourcer for mere om zip / jar-filmanipuleringsbibliotekerne.

For nemheds skyld er emhætten et grafisk Java-program. Applikationen bruger JFileChooser klasse for at lade brugerne specificere destinationsmappen, som de vil have filerne udpakket til. EN ProgressMonitor viser forløbet af udvindingsprocessen. Hvis en fil muligvis overskriver en allerede eksisterende fil, bliver brugeren bedt om at overskrive den eksisterende fil eller ej. Ved afslutningen præsenterer en standarddialogboks ekstraktionsstatistikker.

Endelig kontrollerer udpakningsprogrammet, at det ikke udpakker de filer, der gør jar-filen selvudpakkende - manifestfilen og udpakkerens .klasse fil; programmet skal bare udtrække det originale JAR-indhold. Disse to filer er artefakter af den selvudpakkende jar-fil og ikke en del af de originale, basale indholdsfiler.

Pakning af jar-filen

Nu hvor vi har manifestfilen og ekstraktorprogrammet, kan vi oprette den selvudpakkende jar-fil. Vi kan manuelt bruge JDK'erne krukke værktøj til at lave en selvudpakkende jar-fil. For eksempel forudsat at du har en zip-fil kaldet myzip.zip, kan du udføre følgende trin for at lave en selvudpakkende fil ud fra den:

  1. cd til den mappe, der indeholder myzip.zip
  2. Hent lynlås.jar
  3. Uddrag filerne i det aktuelle bibliotek. Vi har gjort det til en selvudpakkende JAR:
    java -jar lynlås.jar 
  4. Kopier lynlås. klasse fil til ZipSelfExtractor.class
  5. Omdøb myzip.zip som myzip.jar
  6. Opdatering myzip.jar med jarmanifest og ZipSelfExtractor.class filer:
    jar uvfm myzip.jar jarmanifest ZipSelfExtractor.class 

Nu myzip.jar er selvudpakkende på alle platforme, der indeholder Java Runtime Environment (JRE) 1.2 eller nyere. For at udføre den selvudpakkende jar-fil skal du køre:

java -jar myzip.jar 

Bemærk, at nogle platforme muligvis allerede har konfigureret bindinger, så du kan udføre jar-filen bare ved at klikke på myzip.jar filikon, som kører kommandolinjens ækvivalent.

Motion for læseren

Den nuværende ZipSelfExtract integreres ikke godt, hvis du laver en selvudpakkende JAR ud af en eksisterende jar-fil, der indeholder en manifestfil. Føj intelligens til selvudtrækkeren og oprettelsesinstruktionerne, så du kan håndtere eksisterende jar-filer, der indeholder manifestfiler.

Befri din hånd fra JAR

En selvudpakkende jar-fil er en god mekanisme til distribution af platform på tværs af platforme. Selvudpakkende JAR'er er nemme at oprette, og det minimale brugerkrav til en JRE 1.2 eller nyere installation er en rimelig afvejning for at få support på tværs af platforme.

I stedet for manuelt at oprette den selvudpakkende jar-fil, skal du tjekke ZipAnywhere. ZipAnywhere er en komplet funktion lynlås/krukke hjælpeværktøj skrevet i 100% ren Java. Det er et gratis GUI-baseret værktøj a la WinZip og kan oprette selvudpakkende jar-filer med et klik på en knap.

Dr. Zunhe Steve Jin er en softwareudvikler hos Rational Software og forfatter af ZipAnywhere. John D. Mitchell er den bidragydende redaktør for kolonnen JavaWorld Tips 'N Tricks. John er også grundlægger og chefarkitekt for Non, Inc., en teknologisk forretningsrisikostyringsrådgivning.

Lær mere om dette emne

  • Download kildefilerne til dette tip

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

  • "Java Tip 49Hvordan udtrække Java-ressourcer fra JAR og zip-arkiver," John D. Mitchell og Arthur Choi (JavaWorld)

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

  • "Java Tip 70 Opret objekter fra Jar-filer!" 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 kommandolinjeguide

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

  • ZipAnywhere, GUI-baseret selvudpakkende JAR-oprettelsesværktøj

    //www.geocities.com/zipanywhere

  • Se alle forrige Java-tip og indsend din egen

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

  • Lær Java fra bunden i JavaWorld 's Java 101 kolonne

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

  • Java-eksperter besvarer dine hårdeste Java-spørgsmål i JavaWorld 's Java Q&A kolonne

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

  • Gennemse artikler efter emne i JavaWorld 's Aktuelt indeks

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

  • Tal ud i vores Java Forum

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

  • Tilmeld dig JavaWorld 's gratis ugentlige e-mail-nyhedsbreve

    //www.idg.net/jw- abonnement

  • Du finder et væld af it-relaterede artikler fra vores søsterpublikationer på .net

Denne historie, "Java Tip 120: Execute self-extracting JARs" blev oprindeligt udgivet af JavaWorld.