Suggerimento Java 120: eseguire JAR autoestraenti

Per molti anni, la creazione di archivi di Phil Katz, zip, è stata uno dei formati di archiviazione di file più popolari. Sun ha adottato il formato zip come base per Java Archive (JAR). Sun ha esteso l'utilizzo del formato zip con varie convenzioni in modo da poter impacchettare le classi Java in un file di archivio. Con l'aggiunta del file manifest JAR , il runtime Java può facilmente individuare ed eseguire direttamente la classe principale dell'applicazione Java contenuta nel file jar.

Alcuni zipstrumenti di utilità possono creare archivi autoestraenti per varie piattaforme, come MS Windows. Lo strumento di utilità combina un normale archivio zip con un programma di estrazione per generare un nuovo file eseguibile (exe). I destinatari del file exe devono solo eseguirlo per estrarre il contenuto dell'archivio zip originale. L'eseguibile esegue il programma di estrazione per estrarre i file archiviati in una directory di output specificata dall'utente.

È possibile convertire un file zip o jar di base in un file jar eseguibile su qualsiasi piattaforma Java. Mentre lo zip autoestraente può creare solo eseguibili specifici della piattaforma, il file jar autoestraente può essere distribuito ed eseguito su qualsiasi piattaforma che supporti Java.

La creazione del file jar autoestraente è semplice. È sufficiente uno speciale file manifest JAR, un programma di estrazione basato su Java, il file zip o jar contenente i file di contenuto di base e qualsiasi jarapplicazione di utilità di Java SDK .

Il file manifest

Per creare JAR eseguibili, è necessario prima un file manifest chiamato MANIFEST.MFnella META-INFdirectory. Il file manifest può contenere un numero di voci possibili; tuttavia, per i nostri scopi qui, dobbiamo solo specificare il nome della classe Java che contiene il main()metodo del programma di estrazione basato su Java :

Classe principale: ZipSelfExtractor 

Abbiamo aggiunto un file manifest denominato jarmanifestal codice di esempio di questo suggerimento. Per ulteriori informazioni sul file manifest, vedere la specifica del file Jar.

L'estrattore

È possibile creare il programma di estrazione utilizzando vari approcci. L'approccio che presentiamo qui è semplice e diretto. Per prima cosa, il programma di estrazione calcola il nome del file jar autoestraente. Con quel nome in mano, l'estrattore utilizza le librerie zip / jar Java standard integrate per estrarre i file di contenuto dall'archivio. Puoi trovare il codice sorgente completo per ZipSelfExtractorin ZipSelfExtractor.java.

Ottenere il nome del file jar nel programma di estrazione può essere complicato. Sebbene il nome del file jar venga visualizzato sulla riga di comando, tale nome non viene passato al main()metodo della classe . Pertanto, nel programma estrattore, utilizziamo il seguente codice per estrarre le informazioni dall'URL che punta all'estrattore:

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

Si noti che nel getSystemResource()metodo si passa myClassNameinvece di ZipSelfExtractor.class. Ciò ci consente di modificare il nome del programma di estrazione senza modificare quella parte del codice. Abbiamo impostato myClassNamecercando il nome della classe corrente.

Successivamente, estraiamo il nome del file jar. Innanzitutto, chiediamo un URL al file di classe contenente la classe attualmente in esecuzione (che è il programma di estrazione). Una volta ottenuto l'URL, possiamo ritagliare il nome del file jar. Per definizione, l'URL del programma di estrazione JAR segue il formato di base:

  1. jar:, che mostra che l'eseguibile viene eseguito dall'interno di un file jar
  2. L'URL del file jar, come file:/C:/temp/test.jar, seguito dal !carattere
  3. Il nome del percorso interno del file all'interno del JAR, ad esempio /ZipSelfExtractor.class

Nel caso del programma estrattore, l'URL potrebbe essere simile a:

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

Ora che abbiamo il nome del file jar, possiamo eseguire l'estrazione. Le viscere del programma di estrazione si basano sulle librerie di manipolazione di file zip / jar Java integrate per decomprimere i file di contenuto contenuti nell'archivio. Vedere Risorse per ulteriori informazioni sulle librerie di manipolazione dei file zip / jar.

Per facilità d'uso, l'estrattore è un'applicazione grafica Java. L'applicazione utilizza la JFileChooserclasse per consentire agli utenti di specificare la directory di destinazione in cui desiderano estrarre i file. A ProgressMonitormostra l'avanzamento del processo di estrazione. Se un file potrebbe sovrascrivere un file già esistente, all'utente viene chiesto se sovrascrivere o meno il file esistente. Alla conclusione, una finestra di dialogo standard presenta le statistiche di estrazione.

Infine, il programma estrattore verifica di non estrarre i file che rendono autoestraente il file jar: il file manifest e il .classfile dell'estrattore ; il programma dovrebbe semplicemente estrarre il contenuto JAR originale. Questi due file sono artefatti del file jar autoestraente e non fanno parte dei file di contenuto di base originali.

Imballaggio del file jar

Ora che abbiamo il file manifest e il programma di estrazione, possiamo creare il file jar autoestraente. Possiamo usare manualmente l' jarutilità di JDK per creare un file jar autoestraente. Ad esempio, supponendo che tu abbia un file zip chiamato myzip.zip, puoi eseguire i seguenti passaggi per creare un file autoestraente da esso:

  1. cd alla directory contenente myzip.zip
  2. Scarica zipper.jar
  3. Estrai i file nella directory corrente. Lo abbiamo reso un JAR autoestraente:
    java -jar zipper.jar 
  4. Copia il zipper.classfile inZipSelfExtractor.class
  5. Rinomina myzip.zipcomemyzip.jar
  6. Aggiorna myzip.jarcon i file jarmanifeste ZipSelfExtractor.class:
    jar uvfm myzip.jar jarmanifest ZipSelfExtractor.class 

Ora myzip.jarsi autoestraente su tutte le piattaforme contenenti Java Runtime Environment (JRE) 1.2 o versioni successive. Per eseguire il file jar autoestraente, eseguire:

java -jar myzip.jar 

Si noti che alcune piattaforme potrebbero avere associazioni già impostate in modo da poter eseguire il file jar semplicemente facendo clic myzip.jarsull'icona del file, che eseguirà l'equivalente della riga di comando.

Esercizio per il lettore

La corrente ZipSelfExtractnon si integra bene se si crea un JAR autoestraente da un file jar esistente contenente un file manifest. Aggiungi intelligenza all'autoestrattore e alle istruzioni di creazione in modo da poter gestire i file jar esistenti che contengono file manifest.

Libera la tua mano dal JAR

Un file jar autoestraente è un buon meccanismo per la distribuzione di file multipiattaforma. I JAR autoestraenti sono facili da creare e il requisito minimo per l'utente di un'installazione di JRE 1.2 o successiva è un compromesso ragionevole per ottenere il supporto multipiattaforma.

Invece di creare manualmente il file jar autoestraente, controlla ZipAnywhere. ZipAnywhere è uno strumento completo di funzionalità zip/ jarutilità scritto in Java puro al 100%. È uno strumento gratuito basato su GUI come WinZip e può creare file jar autoestraenti con il clic di un pulsante.

Il Dr. Zunhe Steve Jin è un ingegnere software del personale presso Rational Software e l'autore di ZipAnywhere. John D. Mitchell è il collaboratore dell'editor della colonna JavaWorld Tips 'N Tricks. John è anche il fondatore e capo architetto di Non, Inc., uno studio di consulenza per la gestione dei rischi aziendali tecnologici.

Ulteriori informazioni su questo argomento

  • Scarica i file sorgente per questo suggerimento

    //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

Questa storia, "Java Tip 120: Esegui JAR autoestraenti" è stata originariamente pubblicata da JavaWorld.