1 

Les fichiers .jar

Introduction

Le format d’archive Java, JAR vous permet de regrouper plusieurs fichiers en un seul grâce à une compression de type ZIP.
De manière générale un fichier JAR contiendra les fichiers .class ainsi que les ressources auxiliaires associées à l’application ou à l’applet.
L’intérêt ne s’arrète évidemment pas la puisque ce format offre de nombreuses fonctionalités comme par exemple la possibilité d’éxécuter (lien vers partie éxécution) simplement, voir automatiquement votre application.

Voici les principaux avantages qu’apportent les fichiers JAR :

-Sécurité : il est possible de signer numériquement le contenu de l’archive.

-Rapidité dans les downloads : si votre applet est archivé en JAR, les fichiers class et les ressources associés pourront être downloader vers le navigateur avec une seule transaction http sans avoir besoin d’ouvrir une nouvelle connexion pour chaque fichier.

-Taille réduite : le format JAR permet de compresser les données (format ZIP)

-Portabilité : la gestion des fichiers JAR est un standard de la plateforme Java.

-Vérrouillage de packages : il est possible de vérrouiller les contenus d’un fichier JAR.

-Exécution : le format JAR permet une éxécution facile et rapide des fichiers qu’il contient.

-Extension : le format JAR est utilisé par les extensions de la plate forme Java.

Avant de s’intéresser aux fonctionnalités avancées telles que l’éxécution ou la signature d’archive nous allons d’abord étudier les principes de bases, telle que la création d’un fichier JAR (commandes et options au travers d’un exemple).
Nous verrons ensuite le fonctionnement de l’extraction et de la visualisation de nos archive.

La compréhension du fichier Manifest est indispensable, c’est pourquoi une partie lui sera consacrée avant de nous pencher sur l’éxécution d’une application ou d’une applet depuis le format JAR


1. Création d'un fichier JAR

Commandes et options

La commande de base pour la création d’un fichier JAR est très simple :

jar cf nom-jar noms-fichiers

Voyons les arguments et les options de cette commande en détail :
Tout d’abord « nom-jar » correspond au nom qui sera donné a votre archive, l’option « cf » indique que l’on désire que notre archive soir crée dans un fichier, en l’occurrence le fichier « nom-jar ». L’option « c » correspond à la crétion et « f » au fichier, leur ordre importe peu, cependant il est impératif que ces options ne soient pas séparées par un espace.

L’argument « noms-fichiers » est la liste des fichiers qui seront archivés. Il peut y avoir un ou plusieurs fichiers, dans le deuxième cas, ces derniers seront séparés par des espaces. Dans le cas de dossiers, le contenu de ces derniers sera ajouté à l’archive.Cette commande va donc crée une archive de nos fichiers dans le dossier courant.

Voyons maintenant quelques options que vous pouvez ajouter à votre commande :

v : crée une sortie indiquant le nom de chaque fichier ajouté à notre archive

0 : utilisé pour que les fichiers ne soient pas compréssés

m : indique que l’on ne désire pas la création d’un fichier Manifest par défaut, nous aborderons plus en détail les fichiers manifest ultérieurement dans cet article

-c : permet de ne pas garder l’arborescence des fichiers lorque l’on archive des dossiers


Afin de mieux comprendre cet outil, nous allons nous intéresser à un exemple

Exemple

Prenons une application Helloworld (original n’est-ce pas ?), organisé de cette manière :

Notre dossier Helloworld contient un fichier class Helloworld.class ainsi qu’on dossier avec les images utilisés par l’application.

Pour archiver ces fichiers vous pouvez utiliser la commande :

jar cvf Helloworld.jar Helloworld.class images

Un fichier JAR Helloworld sera alors crée dans le fichier courant, contenant notre .class ainsi que le dossier image et son contenu.
L’option « v » nous a permis d’avoir cet affichage :

adding: Helloworld.class (in=25) (out=20) (deflated 20%)
adding: images/ (in=0) (out=0) (stored 0%)
adding: images/bouton.gif (in=128) (out=130) (deflated -1%)
adding: images/bonhomme.gif (in=153) (out=156) (deflated -1%)

L’on peut voir que notre fichier est compressé, en effet l’option par défaut réalise la comprésion, il faut donc utilisé la ligne

jar -cvf Helloworld.jar Helloworld.class images

pour ne pas compresser notre archive.

Il est possible d’utiliser le symbole « * » pour archiver la totailté du repertoire courant

jar -cvf Helloworld.jar *

Si vous desiré mettre tous vos fichiers au même niveau dans votre archive, vous pouvez utiliser l’option –c :

jar cf Helloworld.jar Helloworld.class –c images

Le contenu de votre fichier sera alors :

META-INF/MANIFEST.MF
Helloworld.class
bouton.gif
bonhomme.gif

La même commande sans l’option « -c » donnera :

META-INF/MANIFEST.MF
Helloworld.class
images/bouton.gif
images /bonhomme.gif

2. Extraction et visualisation

Maintenant que nous avons vu la création de nos fichiers, intéressont nous à leur visualisation et extraction.

2.2. Extraction

La commande de base pour l’extraction d’un fichier JAR est la suivante :

jar xf nom-jar [noms-fichiers]

nom-jar est le fichier JAR que nous voulons extraire, l’option « x » permet de réaliser l’extraction, et l’option « f » indique que le nom du fichier à extraire va être passé en ligne ligne de commande.
L’argument « noms-fichiers » permet quant à lui de désigner les fichiers que l’on désire extraire, si jamais il n’est pas utilisé, la totailté de l’archive est alors extraite.

Les fichiers sont copiés depuis l’archive vers le répertoire courant, l’archive reste inchangé, cependant s’il existe deja des fichiers portant le même nom dans le répertoire, ces derniers seront éffacés.

Par exemple, si nous désirons extraire notre fichier Helloworld.jar :

jar xf Helloworld.jar Helloworld.class images/bouton.gif images/bonhomme.gif

Le fichier « Helloworld.class » est copié, le répertoire « images » est crée et les fichiers « bouton.gif, bonhomme.gif » sont copiés dedans.

2.2. Visualisation

La commande de base pour la visualisation d’un fichier JAR est la suivante :

jar tf nom-jar

L’option « t » indique que nous voulons visualiser le contenu de notre archive, « f » indique que le nom de l’archive sera passé en argument et bien sur « nom-jar » est le nom ou le chemin complet du fichier que l’on veut voir.

Pour notre exemple cette commande affichera :

META-INF/MANIFEST.MF
Helloworld.class
images/
images/bouton.gif
images /bonhomme.gif

L’option « v » permettra d’obtenir des informations supplémentaires :

256 Wed May 5 15:28:37 PDT 2004 META-INF/MANIFEST.MF
20 Wed May 5 15:28:37 PDT 2004 Helloworld.class
0 Wed May 5 15:28:37 PDT 2004 images/
130 Wed May 5 15:28:37 PDT 2004 images/cross.gif
156 Wed May 5 15:28:37 PDT 2004 images/not.gif

3. Le fichier Manifest

Lors de la première partie nous avons abordé les différentes options de création d’un fichier JAR, nous allons désormais voir plus en profondeur l’option « m » qui permet de traiter le fichier Manifest.

En effet si l’option « m » n’est pas spécifiée, un fichier META-INF/MANIFEST.MF est alors ajouté à notre archive.Il est possible d’utilisé les fonctions avancés de nos fichiers JAR, comme le vérrouillage de package, en modifiant ce fichier.

jar cmf fichier-manifest nom-jar noms-fichiers

Le principe de cette commande est le suivant :
Un fichier texte contenant les informations que l’on désire ajouté au fichier Manifest par défaut doit avoir préalablement été crée, il s’agit de l’argument « fichier-manifest », cette commande va donc lors de la crétion de notre archive ajouté notre fichier texte au fichier par défaut.
Les autres options et argument de cette commande sont détaillés dans la partie Création d’un fichier JAR (lien)

Prenons comme exemple le vérrouillage d’un package :

Nous possédons 2 packages que nous désirons verrouiller :

mesPackages/premier/
mesPackages/second/

De manière à effectuer cette tâche nous devons écrire un fichier texte « package » contenant les lignes suivantes :

Name: mesPackages/premier/
Sealed: true

Name: mesPackages/premier/
Sealed: true

Notre fichier doit impérativement se terminer par une nouvelle ligne ou un retour, de manière à être intégrés dans le fichier par défaut sans problèmes.
Il n’est pas nécessaire d’écrire la totalité du fichier Manifest puisque notre texte sera ajouté au fichier par défaut.

La commande pour crée notre archive en modifiant le fichier Manifest avec notre fichier « package » sera la suivante :

jar cmf package nom-jar noms-fichiers

Le fichier Manifest de notre archive prendra donc cette forme :

Manifest-Version: 1.0

Name: mesPackages/premier/
Sealed: true

Name: mesPackages/premier/
Sealed: true

4. Compréhension du fichier Manifest

Les archives JAR offrent de nombreuses fonctionnalités telles que le vérouillage de package, la signature électronique, la création d’extension par exemple. Ce que rend cela possible est le fichier Manifest.

Ce fichier contient des informations à propos du contenu de l’archive et offre donc de nombreuses possibilités. Avant de nous y plonger, voyons tout d’abord le contenu du fichier Manifest par défaut qui est crée si vous n’utilisez pas l’option « m »

En effet quand vous créez une archive JAR un fichier Manifest par défaut y est ajouté.
Il ne peut y avoir qu’un seul Manifest par archive, son chemin est toujours le suivant :

META-INF/MANIFEST.MF

Le contenu de ce fichier est simple : Manifest-Version: 1.0, car il ne contient pas d’information à propos des autres fichiers, c’est information seront rajoutés si vous désirez utilisez les fonctionalités avancés des fichiers JAR.

Il faut donc ajoutés des informations à ce fichier, nous allons donc nous penchez sur les principales fonctionnalités ainsi que les moyens de les mettre en œuvre au travers du fichier Manifest.

Application

Si votre fichier contient toutes les données d’une application, pour permettre l’éxécution de cette dernière il faut rajouter l’entête « Main-Class » suivi du nom de la classe:

Main-Class: nom-classe


Vérouillage de package

Il est possible d’assurer le vérrouillage de package, pour cela on utilise l’entête « Name » suivi de l’entête « Sealed » :

Name: mesPackages/premier/
Sealed: true

L’entête Name prend la valeur du chemin du package, l’entête « Sealed » prend la valeur « true ».
Ces deux lignes ne sont pas séparées, en effet du moment qu’il n’y a pas de saut de ligne entre deux entêtes, on considère qu’ils sont liés, la valeur « true » s’applique donc à « mesPackages/premier/ ».

Quelques règles concernant ce fichier

• La ligne Manifest-Version est toujours la première, l’ordre du reste des entête n’est pas important.
• L’entête Name doit contenir un nom, chemin complet d’un fichier ou une URL complète
• Un entête non compris est ignoré
• Les entêtes sont sensibles à la casse

5. Exécution d’un fichier JAR

Maintenant que nous avons vu comment crée nos fichiers JAR, ainsi que les moyens de disposer de certaines de leurs fonctionnalités, nous allons voir comment les éxécuter.

Prenons le cas d’une application que nous désirons lancer depuis la ligne de commande, la commande est alors la suivante :

java -jar nom-jar

-jar indique à l’interpreteur de commande que notre application est archivé.

« nom-jar » est bien évidemment le nom ou le chemin de notre archive.

Pour que l’éxecution s’effectue correctement à partir de cette ligne de commande, il faut que le fichier Manifest par défaut est été modifié comme vu précedemment.

Reprenons notre exemple du début de manière à synthétiser la totalité du processus :

Création du fichier Manifest (monManifest.txt):

Main-Class: Helloworld.class

Création de l’archive :

jar cmf monManifest.txt Helloworld.jar Helloworld.class images

Exécution de l’archive:

java -jar Helloworld.jar


Nous avons donc avec cet article abordé le traitement des fichiers JAR, ils pourront être d’une grande utilité dans le processus de vie de vos applications.
Pour toutes informations supplémentaires n’hésitez pas à m’écrire.


1 

Retrouvez ci-dessous les autres sections du Laboratoire Sun
Evènements
Java Sun Net Talk LIVE CHAT le 2 Avril à 16h303/29/08
SolarisSunDécouvrez les nouveaux Sun Fire sous Intel10/11/07
JavaValtech Days10/9/07
JavaApacheCon du 1 au 4 mai à Amsterdam2/13/07

Exemples de code
JavaManipuler les looks and feel (lister et affecter)10/15/07
JavaFaire sa propre injection de dépendance avec les annotations5/9/06
JavaSplash screen avec progress Bar5/5/06
JavaFaire un splash screen en swing5/5/06

Actualités
SunProjet Kenai: une nouvelle forge open source10/3/08
SunSun Microsystems en forme !8/4/08
SunOpenDS un ldap 100% java7/24/08
SunSun et Fujitsu annoncent un nouveau Sparc647/16/08
SunVisualVM, un outil de surveillance des applications Java7/10/08

Tips du laboratoire
EclipseVisual Editor avec Eclipse Europa, c'est possible3/28/08
EclipseGérer les projets dans un workspace.10/16/07
JavaManager votre server d'application avec Eclipse4/21/07
JavaVue des sub-packages avec Eclipse4/21/07
JavaGlisser-déposer avec Eclipse4/21/07

Laboratoire SUPINFO des technologies Sun
labo-sun@supinfo.com


Conditions d'utilisation et © Copyright SUPINFO International University
23, rue de Château Landon - 75010 PARIS - Tél : +33 (0) 153359700 Fax : +33 (0) 153359701
Respect de la vie privée