Astuce Java 120: exécutez des fichiers JAR auto-extractibles

Depuis de nombreuses années, la création d'archives de Phil Katz, zip, est l'un des formats d'archivage de fichiers les plus populaires. Sun a adopté le format zip comme base de l'archive Java (JAR). Sun a étendu l'utilisation du format zip avec diverses conventions afin que vous puissiez regrouper les classes Java dans un fichier archive. Avec l'ajout du fichier manifeste JAR , le moteur d'exécution Java peut facilement localiser et exécuter directement la classe principale de l'application Java contenue dans le fichier jar.

Certains zipoutils utilitaires peuvent créer des archives auto-extractibles pour diverses plates-formes, telles que MS Windows. L'outil utilitaire combine une archive zip régulière avec un programme d'extraction pour générer un nouveau fichier exécutable (exe). Les destinataires du fichier exe n'ont besoin de l'exécuter que pour extraire le contenu de l'archive zip d'origine. L'exécutable exécute le programme d'extraction pour extraire les fichiers archivés dans un répertoire de sortie spécifié par l'utilisateur.

Vous pouvez convertir un fichier zip ou jar de base en un fichier jar exécutable sur n'importe quelle plate-forme Java. Alors que le zip auto-extractible ne peut créer que des exécutables spécifiques à la plate-forme, le fichier jar auto-extractible peut être distribué et exécuté sur n'importe quelle plate-forme prenant en charge Java.

La création du fichier jar auto-extractible est simple. Vous avez juste besoin d'un fichier manifeste JAR spécial, d'un programme d'extraction basé sur Java, du fichier zip ou jar contenant les fichiers de contenu de base et de toute jarapplication utilitaire du SDK Java .

Le fichier manifeste

Pour créer des fichiers JAR exécutables, vous avez d'abord besoin d'un fichier manifeste appelé MANIFEST.MFdans le META-INFrépertoire. Le fichier manifeste peut contenir un certain nombre d'entrées possibles; cependant, pour nos besoins ici, nous avons juste besoin de spécifier le nom de la classe Java qui contient la main()méthode du programme d'extraction basé sur Java :

Classe principale: ZipSelfExtractor 

Nous avons ajouté un fichier manifeste nommé jarmanifestà l'exemple de code de cette astuce. Pour plus d'informations sur le fichier manifeste, consultez la spécification du fichier Jar.

L'extracteur

Vous pouvez créer le programme d'extraction en utilisant différentes approches. L'approche que nous présentons ici est simple et directe. Tout d'abord, le programme d'extraction détermine le nom du fichier jar auto-extractible. Avec ce nom en main, l'extracteur utilise les bibliothèques Java zip / jar standard intégrées pour extraire les fichiers de contenu de l'archive. Vous pouvez trouver le code source complet pour ZipSelfExtractorin ZipSelfExtractor.java.

Obtenir le nom de fichier jar dans le programme d'extraction peut être délicat. Bien que le nom du fichier jar apparaisse sur la ligne de commande, ce nom n'est pas passé à la main()méthode de la classe . Par conséquent, dans le programme d'extraction, nous utilisons le code suivant pour extraire les informations de l'URL qui pointe vers l'extracteur:

Chaîne privée getJarFileName () {myClassName = this.getClass (). getName () + ".class"; URL urlJar = this.getClass (). GetClassLoader (). GetSystemResource (myClassName); Chaîne urlStr = urlJar.toString (); int from = "jar: fichier:". length (); int à = urlStr.indexOf ("! /"); return urlStr.substring (de, à); }

Notez que dans la getSystemResource()méthode nous passons à la myClassNameplace de ZipSelfExtractor.class. Cela nous permet de changer le nom du programme d'extraction sans changer cette partie du code. Nous définissons myClassNameen recherchant le nom de la classe actuelle.

Ensuite, nous extrayons le nom du fichier jar. Tout d'abord, nous demandons une URL vers le fichier de classe contenant la classe en cours d'exécution (qui est le programme d'extraction). Une fois que nous avons l'URL, nous pouvons extraire le nom du fichier jar. Par définition, l'URL du programme d'extraction JAR suit le format de base:

  1. jar:, qui montre que l'exécutable s'exécute à partir d'un fichier jar
  2. L'URL du fichier jar, par exemple file:/C:/temp/test.jar, suivie du !caractère
  3. Le nom de chemin interne du fichier dans le JAR, tel que /ZipSelfExtractor.class

Dans le cas du programme d'extraction, l'URL peut ressembler à:

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

Maintenant que nous avons le nom du fichier jar, nous pouvons effectuer l'extraction. Les tripes du programme d'extraction s'appuient sur les bibliothèques intégrées de manipulation de fichiers zip / jar Java pour décompresser les fichiers de contenu contenus dans l'archive. Voir Ressources pour plus d'informations sur les bibliothèques de manipulation de fichiers zip / jar.

Pour faciliter son utilisation, l'extracteur est une application graphique Java. L'application utilise la JFileChooserclasse pour permettre aux utilisateurs de spécifier le répertoire de destination dans lequel ils souhaitent que les fichiers soient extraits. A ProgressMonitormontre la progression du processus d'extraction. Si un fichier peut écraser un fichier déjà existant, l'utilisateur est invité à remplacer ou non le fichier existant. En conclusion, une boîte de dialogue standard présente les statistiques d'extraction.

Enfin, le programme d'extraction vérifie qu'il n'extrait pas les fichiers qui rendent le fichier jar auto-extractible - le fichier manifeste et le fichier de l'extracteur .class; le programme doit simplement extraire le contenu original du JAR. Ces deux fichiers sont des artefacts du fichier jar auto-extractible et ne font pas partie des fichiers de contenu de base d'origine.

Emballage du fichier jar

Maintenant que nous avons le fichier manifeste et le programme d'extraction, nous pouvons créer le fichier jar auto-extractible. Nous pouvons utiliser manuellement l' jarutilitaire du JDK pour créer un fichier jar auto-extractible. Par exemple, en supposant que vous ayez un fichier zip appelé myzip.zip, vous pouvez effectuer les étapes suivantes pour en créer un fichier auto-extractible:

  1. cd vers le répertoire contenant myzip.zip
  2. Télécharger zipper.jar
  3. Extrayez les fichiers dans le répertoire courant. Nous en avons fait un JAR auto-extractible:
    java -jar zipper.jar 
  4. Copiez le zipper.classfichier dansZipSelfExtractor.class
  5. Renommer myzip.zipenmyzip.jar
  6. Mettre myzip.jarà jour avec les fichiers jarmanifestet ZipSelfExtractor.class:
    jar uvfm myzip.jar jarmanifest ZipSelfExtractor.class 

Désormais myzip.jarauto-extractible sur toutes les plates-formes contenant Java Runtime Environment (JRE) 1.2 ou version ultérieure. Pour exécuter le fichier jar auto-extractible, exécutez:

java -jar myzip.jar 

Notez que certaines plates-formes peuvent avoir des liaisons déjà configurées de sorte que vous pouvez exécuter le fichier jar simplement en cliquant sur l' myzip.jaricône du fichier, ce qui exécutera l'équivalent de la ligne de commande.

Exercice pour le lecteur

Le courant ZipSelfExtractne s'intègre pas bien si vous créez un JAR auto-extractible à partir d'un fichier jar existant contenant un fichier manifeste. Ajoutez de l'intelligence à l'auto-extracteur et aux instructions de création afin de pouvoir gérer les fichiers jar existants contenant des fichiers manifestes.

Libérez votre main du JAR

Un fichier jar auto-extractible est un bon mécanisme pour la distribution de fichiers multiplateforme. Les fichiers JAR auto-extractibles sont faciles à créer et l'exigence minimale de l'utilisateur d'une installation JRE 1.2 ou ultérieure est un compromis raisonnable pour obtenir une prise en charge multiplateforme.

Au lieu de créer manuellement le fichier jar auto-extractible, consultez ZipAnywhere. ZipAnywhere est un complet zip/ jaroutil utilitaire écrit en 100% pur Java. Il s'agit d'un outil gratuit basé sur une interface graphique à la WinZip et peut créer des fichiers jar auto-extractibles en un seul clic.

Dr Zunhe Steve Jin est ingénieur logiciel chez Rational Software et auteur de ZipAnywhere. John D. Mitchell est le rédacteur en chef de la colonne N Tricks de JavaWorld Tips. John est également le fondateur et l'architecte en chef de Non, Inc., un cabinet de conseil en gestion des risques commerciaux technologiques.

En savoir plus sur ce sujet

  • Téléchargez les fichiers source de cette astuce

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

Cette histoire, "Java Tip 120: Exécuter des fichiers JAR auto-extractibles" a été publiée à l'origine par JavaWorld.