Dans la fin de la section précédente relative au objets distants, nous avons vu comment déployer des applications d'un serveur vers des postes clients distants. Java Web Start propose le même type de service et permet ainsi de déployer également des applications java au moyen d'un serveur Web. A ce titre, Java Web Start est assez similaire aux applets. Nous verrons toutefois qu'il existe un certain nombre de divergences.
Nous retrouvons ainsi le même intérêt de disposer des applications stockées sur une seule machine qui sert alors de service d'applications. La maintenance s'en trouve largement simplifiée. Les mises à jour sont faciles à réaliser, puisqu'il suffit juste de changer l'application concernée sur le serveur. Ainsi, lorsque le client a besoin de cette application, il la retrouve, avec en plus la dernière mise à jour prise en compte.
Il existe toutefois une petite différence entre Java Web Start et la technologie RMI. En effet, dans le cas de RMI, à la fin de l'utilisation de l'application, cette dernière n'existe plus du tout sur la machine cliente. Dans le cas de Java Web Start, l'application demeure éventuellement sur l'ordinateur client. Par ce principe, il n'est plus nécessaire de se reconnecter sur le serveur. D'un côté, cela permet une certaine autonomie, par contre, le fait que l'application reste sur le poste client, une partie de la ressource du disque dur est utilisée. Cela ne présente pas une grosse gène, puisque les applications en Java prennent toujours très peu de place, étant entendu que la plus grosse partie se trouve dans la machine virtuelle Java.
Bien entendu, quelque soit la technologie employée, il est nécessaire que la machine virtuelle soit installée sur tous les postes afin qu'ils puissent interpréter le code Java de toutes les applications stockées.
Ce qui a fait le grand succès de Java, ce sont les applets. En effet, au moyen des applets, nous disposons de l'équivalent de tout ce que nous trouvons dans des applications (des menus, des boutons, des images de fond, des zones d'éditions, des combobox, etc.), et ceci au sein d'une page Web.
De ce fait, et de la même manière, vous n'avez besoin de rien côté client. Il suffit juste de disposer d'un navigateur. Vous retrouvez sur votre poste client, un programme relativement sophistiqué au milieu d'une page Web. La différence entre une application classique et une applet est juste le conteneur. Effectivement, dans un cas, nous avons une fenêtre cadre (JFrame), et de l'autre, nous avons une page Web qui gère cette applet (par le truchement de JApplet).
Nous allons donc recenser quelques petites différences entre Java Web Start et les applets :
Attention, Java Web Start, comme pour l'applet, possède une "bac à sable" qui empêche d'accéder aux ressources locales pour les applications non signées.
§
Vu ce que nous venons déjà de découvrir, je vous propose de mieux connaître le rôle de Java Web Start, de recenser ces principales caractéristiques, et de voir également comment déployer une application Java.
Java Web Start est une technologie relativement rescente destinée à livrer, en Intranet et sur Intenet, des applications qui présentent les caractéristiques suivantes :
Pour préparer une application en vue d'une livraison par Java Web Start, vous devez :
Cette application comporte plusieurs classes ainsi qu'une image à faire afficher en papier peint. Par ailleurs le texte qui s'affiche est sensible au mouvement du curseur de la souris, puisque lorsque ce dernier se déplace sur le texte, celui-ci change alors de couleur. Le texte reprend ensuite sa couleur d'origine lorsque le curseur de la souris s'en va en dehors de la zone de texte.
Cette application comporte en plus plusieurs ressources : le titre de la fenêtre, le message d'invite, ainsi que l'image de fond. Voici donc la vue définitive avec l'architecteure des différents répertoires, suivi pour terminer du code source correspondant :
Principal.java |
---|
package texte; import java.awt.event.*; import java.io.*; import java.util.Scanner; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; public class Principal extends JFrame { public Principal() throws IOException { this.setDefaultCloseOperation(this.EXIT_ON_CLOSE); this.setSize(350, 250); Scanner titre = new Scanner(this.getClass().getResourceAsStream("ressources/titre.txt")); this.setTitle(titre.nextLine()); Image image = ImageIO.read(this.getClass().getResource("ressources/chouette.jpg")); PanneauImage panneau = new PanneauImage(image); this.getContentPane().add(panneau); } public static void main(String[] args) throws IOException { new Principal().setVisible(true); } } class PanneauImage extends JPanel { private Image image; private Texte invite = new Texte("C'est chouette..."); public PanneauImage(Image image) { Scanner message = new Scanner(this.getClass().getResourceAsStream("ressources/message.txt")); invite = new Texte(message.nextLine()); this.image = image; invite.setCouleurSurvol(Color.red); invite.setCouleurNormale(Color.blue); this.add(invite); } protected void paintComponent(Graphics g) { g.drawImage(image, 0, 0, this); } } class Texte extends JLabel implements MouseListener { private Color couleurSurvol, couleurNormale; public Texte(String invite) { super(invite); this.setFont(new Font("Verdana", Font.BOLD, 28)); this.addMouseListener(this); } public void setCouleurSurvol(Color couleur) { couleurSurvol = couleur; } public void setCouleurNormale(Color couleur) { this.setForeground(couleurNormale = couleur); } public void mouseEntered(MouseEvent e) { this.setForeground(couleurSurvol); } public void mouseExited(MouseEvent e) { this.setForeground(couleurNormale); } public void mouseClicked(MouseEvent e) {} public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} } |
D'après la procédure, nous devons donc archiver (packager) l'ensemble de cette application afin d'obtenir un seul fichier qui plus est compressé. Cette démarche paraît indispensable afin d'éviter Pd'avoir un temps de chargement trop important. En effet, il faut bien comprendre que ce temps de chargement n'est pas dû à la taille des fichiers classes, relativement petits, mais à la surcharge considérable découlant d'une connexion avec un serveur Web avec plusieurs requêtes demandées pour chacun des fichiers qui composent notre applications.
Pour packager une application, réunissez tous les fichiers nécessaires à votre application dans un fichier JAR et ajoutez-y un manifeste spécifiant la classe principale de votre programme - celle qui doit être invoquée en premier par le lanceur de programme Java.
Avant la fabrication du fichier archive JAR, préparez le fichier manifeste "manifeste.mf" afin d'indiquer la classe principale de l'application. Créer ensuite votre archive au moyen de la commande jar. Vous avez ci-dessous en image toute la procédure à suivre. Remarquez en dernier lieu le test effectué avec le lancement de l'application au moyen de la commande java, à partir de l'archive qui vient d'être construite.
Pour en savoir plus sur les archives Java.
§
Nous devons maintenant indiquer comment déployer notre application. Pour cela, il est nécessaire de mettre en oeuvre un fichier qui décrit comment réaliser cette opération. Il s'agit d'un fichier de lancement au format XML et qui respecte le protocole prévu à cet effet, c'est-à-dire le protocole JNLP. Nous devons donc préparer ce fichier qui pour notre exemple se nommera texte.jnlp avec le contenu suivant :
texte.jnlp |
---|
1 <?xml version="1.0" encoding="utf-8"?> 2 <jnlp codebase="http://portable:8084/download/"> 3 <information> 4 <title>Application Texte</title> 5 <vendor>Emmanuel REMY</vendor> 6 <icon href="icone.jpg" /> 7 <offline-allowed /> 8 <shortcut> 9 <desktop /> 10 <menu submenu="Applications distantes" /> 11 </shortcut> 12 </information> 13 <resources> 14 <j2se version="1.5+" /> 15 <jar href="texte.jar" /> 16 </resources> 17 <application-desc /> 18 </jnlp> |
<j2se version="1.5+" /> devient <java version="1.5+" />
Comme nous l'avons évoqué plus haut, la technologie Java Web Start utilise le serveur Web comme moyen de déploiement. De toute façon, il faut qu'il ait un service de monter. Autant que ce soit donc celui qui est le plus universel. D'autre part, grâce au serveur Web, vous pourrez du coup déployer vos applications directement sur Internet.
Pour cela, il paraît judicieux de fabriquer une application Web qui soit spécialisée sur les déploiement d'applications à distance. Il suffit donc, dans votre serveur Web, de fabriquer une application Web /download/ à l'intérieur de laquelle vous placerez toutes vos applications à déployer.
Attention, l'application Web doit respecter une certaine architecture pour qu'elle soit opérationnelle. Ceci dit, c'est très simple, il s'agit d'un ensemble de répertoires prédéfinis et d'un descripteur de déploiement <web.xml> vide (ou presque) situé dans le répertoire (privé) <WEB-INF> dont voici le codage interne ci-dessous.
Descriteur de déploiement web.xml + Application Web /downoad/ |
---|
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4"> </web-app> |
Vous devez ensuite placer l'ensemble de vos applications packagées à la racine de votre application Web ainsi que les fichiers de lancement (avec éventuellement les icônes). Ici le répertoire racine est appelé <web>.
Ici, je ne vais pas m'étendre beaucoup plus sur la notion d'application Web. Ce sujet est largement traité dans l'ensemble de mes cours, notamment dans la partie J2EE.
Il ne vous reste plus qu'à lancer votre serveur Web. Tout est prêt pour le déploiement de vos applications vers les postes clients. Une fois que votre serveur Web est actif, pointer le navigateur du poste client vers le fichier JNLP correspondant à l'application que vous désirer récupérer. Dans notre exemple, tapez l'URL suivante :
http://portable:8084/download/texte.jnlp
Une autre alternative consiste à lancer l'application Web /download/ en entier et de choisir l'application désirée au moyen de la souris. Pour cela tapez l'URL suivante :
http://portable:8084/download/
Ce qui donne l'affichage suivant :
Et maintenant, vous pouvez cliquer sur texte.jnlp.
Quelque soit la solution, la première fois, vous avez une boîte de dialogue standard dans le milieu du Web qui apparaît et qui vous demande ce que vous désirez faire avec ce type de fichier. Souhaitez-vous ouvrir ou enregistrer ce fichier sur votre poste local. Par ailleurs, le système reconnaît l'application qui est capable d'interpréter ce type de fichier : ici Java Web Start. Choisissez l'ouverture plutôt que l'enregistrement.
Pour éviter que cette boîte de dialogue s'affiche à chaque fois que vous désirez lancer une nouvelle application, je vous invite à cocher la case "Toujours effectuer cette action pour ce type de fichier".
Vous avez ensuite la fenêtre de lancement de l'application qui s'affiche suivie de la boîte de dialogue éventuelle permettant d'installer les raccourcis.
Et votre application s'affiche enfin :
Remarquez la présence du bandeau : Java Application Window.
.
Vu le choix que nous avons fait, l'application se trouve dans le cache de l'ordinateur client. Si vous avez des raccourcis sur votre poste, il suffit de les solliciter afin de lancer de nouveau l'application concernée. Si le serveur Web est encore actif, Java Web Start va contrôler s'il n'existe pas une version plus récente sur le serveur, auquel cas elle sera déployée est utilisée à la place de l'ancienne version. Dans le cas contraire, l'application présente est tout simplement lancée.
Si vous ne disposez pas de raccourcis, vous pouvez quand même accéder à nouveau au fichier JNLP, l'application est récupérée depuis la mémoire tampon du cache. Vous pouvez consulter le contenu à l'aide du panneau de contrôle du plug-in Java :
De puis le JDK 5.0, ce panneau sert à la fois pour les applets et les applications Java Web Start. Ce panneau de contrôle appelé Visualisateur de cache permet de recenser les applications déjà présentes sur le poste client. Vous pouvez ainsi supprimer les applications que vous n'utilisez plus ou lancer celles qui vous désirez, en local ou depuis le serveur distant.
Lorsque vous supprimer une application, il s'agit en fait d'une désintallation. Si vous avez des icônes sur le bureau ou des raccourcis dans le menu Démarrer, ils sont automatiquement enlevés.
Pour retrouver ce panneau de contrôle sous Windows, vous devez passer par le Panneau de configuration :
Revenons à notre navigateur au moment ou notre application Web /download/ apparaît :
Nous remarquons la présence à la fois de l'application packagée texte.jar ainsi que du lanceur d'application texte.jnlp. A ce niveau, rien ne nous empêche de cliquer sur le lien texte.jar. Si vous effectuez cette action et si votre système d'exploitation est réglé pour rattacher ce type de fichier avec le programme adapté, c'est-à-dire ici la machine virtuelle Java, vous aurez effectivement l'application qui se lance automatiquement comme si elle se trouvait sur le poste local.
Dans ce fichier de lancement JNLP, nous avons très peu de lignes à décrire. C'est très rapide à mettre en oeuvre. Par ailleurs, nous pouvons ainsi choisir le nom que portera l'application, l'icône représentative, etc. Et vu les avantages que nous venons de voir, il est largement avantageux de travailler avec cette technologie.
Finalement, pour éviter de se tromper entre les deux types de fichier, il serait souhaitable de revoir l'application Web afin que seul le choix du fichier de lancement soit proposé. Lorsque nous nous connectons à l'application Web /download/, l'idéal serait donc de présenter une page d'accueil qui affiche l'ensemble des applications téléchargeables. Ainsi, lorsque nous cliquerons sur un des liens proposés, nous activerons automatiquement le fichier JNLP correspondant.
Ceci dit, rien n'empêche de se connecter directement sur le fichier archive au moyen de l'URL suivante http://portable:8084/download/texte.jar. Toutefois, le client n'est pas obligé de le savoir.
Si vous désirez qu'une page d'accueil soit automatiquement lancée lors de la connection à votre application Web, il est souvent souhaitable de respecter le nom par défaut qui est généralement index.html. Toutefois, rien ne vous empêche d'utiliser un autre nom de page. C'est ce que je vais faire ici, je vais l'appeler applications.html. Par contre, il faut que le serveur Web connaissent le nom de cette page d'accueil. Pour cela il faut changer le contenu du descripteur de déploiement <web.xml> et se servir de la balise <welcome-list-file> comme cela vous est montré ci-dessous :
web.xml |
---|
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <welcome-file-list> <welcome-file>applications.html</welcome-file> </welcome-file-list> </web-app> |
Voici maintenant le contenu de notre page d'accueil applications.html qui vous le remarquez est relativement modeste :
Applications.html |
---|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Applications distantes</title> </head> <body> <h2>Liste des applications à déployer</h2> <hr /> <img src="icone.jpg" width="64" height="64" align="middle"/> <a href="texte.jnlp">Application Texte</a> </body> </html> |
L'exemple que nous venons de traiter fonctionne parfaitement. Il faut dire que cette application fonctionne en autonomie sans utiliser les ressources du poste local. Cette application reste dans sa zone bien délimité qui est, ce que nous appelons, le "bac à sable".
Dès lors qu'un code est chargé depuis un site distant, puis exécuté en local, la sécurité devient un enjeu essentiel. Le fait de cliquer sur un seul lien peut lancer une application Java Web Start, téléchargé sur Internet, qui présente donc un risque intrinsèque et s'exécute dans un "bac à sable" avec un accès minimal.
Effectivement, lorsqu'une application se trouve dans "le bac à sable", elle dispose de droits limités. Elle n'utilise que les capacité du processeur et de sa zone mémoire. Elle n'a pas le droit d'accéder aux ressources de la machine locale, comme les fichiers sur le disque dur. Elle n'a pas non plus la possibilité d'accéder à une autre machine au travers du réseau local.
Intérêt du bac à sable : L'affichage d'une page Web lance automatiquement tous les applets de la page. Si vous cliquez sur un lien ou que vous visitiez une page Web, vous pourriez installer un code arbitraire sur l'ordinateur de l'utilisateur. Les criminels n'auraient aucunes difficulté à voler des informations confidentielles, à accéder à des données financieres ou à prendre le contrôle des machines pour envoyer des spams.
Pour que sa technologie ne soit pas employée à des fins coupables, Java propose intrinsèquement un modèle de sécurité élaboré. Un gestionnaire de sécurité vérifie en permanence l'accès à toutes les ressources du système. Par défaut, il n'autorise que les opérations inoffensives.
Pour autoriser des opérations supplémentaires, le code doit être numériquement signé et l'utilisateur doit approuver le certificat de signature.
§
Mais que peut faire un code distant (récupéré sur Intenet) sur toutes les plates-formes locales ?
Vous avez là suffisamment de fonctionnalités pour afficher des faits et des figures ou recevoir une saisie utilisateur visant à passer commande. L'environnement d'exécution restreint est souvent appelé "bac à sable". Le code qui s'y exécute ne peut donc pas modifier le système de l'utilisateur ni l'espionner.
Les programmes du bac à sable présentent notamment les restrictions suivantes :
Nous avons quelque fois besoin de développer des applications qui nécessitent de travailler avec les fichiers du poste local. Voici, par exemple, une application qui est une visionneuse des photos présentes sur la machine locale :
jwsphotos.AfficherPhotos |
---|
package jwsphotos; import java.io.*; import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import javax.imageio.ImageIO; import javax.swing.*; public class AfficherPhotos extends JFrame implements ActionListener { private JButton soumettre = new JButton("Récupérer la photo à afficher"); private PanneauImage panneau = new PanneauImage(); public AfficherPhotos() { setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(500, 400); setTitle("Afficher photos"); soumettre.addActionListener(this); add(soumettre, BorderLayout.NORTH); add(panneau); setVisible(true); } public static void main(String[] args) { new AfficherPhotos(); } public void actionPerformed(ActionEvent e) { JFileChooser fichier = new JFileChooser(); fichier.setDialogTitle("Sélectionner la photo"); fichier.showOpenDialog(this); panneau.setImage(fichier.getSelectedFile()); panneau.repaint(); } } class PanneauImage extends JPanel { private BufferedImage image; private double ratio; public void setImage(File fichier) { try { image = ImageIO.read(fichier); ratio = (double)image.getWidth()/image.getHeight(); } catch (IOException ex) { ex.printStackTrace(); } } protected void paintComponent(Graphics surface) { if (image!=null) surface.drawImage(image, 0, 0, this.getWidth(), (int)(this.getWidth()/ratio), null); } } |
Si nous mettons en oeuvre tout le système de déploiement en utilisant les compétences de Java Web Start, nous obtenons bien le téléchargement automatique de notre application, toutefois cette dernière ne fonctionne pas correctement. En effet, la boîte de dialogue d'ouverture de fichier n'apparaît pas. Ainsi, il est impossible de récupérer l'image à visionner. Effectivement, pour l'instant, nous n'avons rien indiquer de spécial, il est normal que l'application reste dans "le bac à sable", avec donc des droits limités.
Il est possible d'augmenter les droits d'utilisation sur votre application. Pour cela, il faut utiliser la balise <security> dans votre fichier de description jnlp :
En tenant compte de ces nouvelles possibiltés, voici le fichier de description jnlp que nous pouvons mettre en oeuvre :
photos.jnlp |
---|
<?xml version="1.0" encoding="utf-8"?> <jnlp codebase="http://portable:8084/download/" > <information> <title>Visionneuse de photos</title> <vendor>Emmanuel REMY</vendor> <offline-allowed /> <shortcut> <desktop /> <menu submenu="Applications distantes" /> </shortcut> </information> <resources> <j2se version="1.6+" /> <jar href="JWSPhotos.jar" /> </resources> <security> <all-permissions /> </security> <application-desc /> </jnlp> |
Si nous tentons de nouveau de déployer notre application au travers de Java Web Start, cette fois-ci le déploiement ne s'effectue pas correctement, et vous verrez apparaître le message suivant :
Lorsque vous utiliser la balise <all-permissions /> à l'intérieur de la balise <security>, vous devez impérativement signer votre archive, ici JWSPhotos.jar. La signature d'une archive est très importante, elle permet de savoir qui a fait l'archive de manière fiable. C'est une façon de prouver qu'il s'agit bien de votre travail. C'est une sorte de signature électronique. Elle va permettre à notre application d'avoir le droit d'accéder aux fichiers systèmes, à la communication sur le réseau, etc. à l'identique d'un programme java standard.
Le principe de la signature marche sur un cryptage clé privée/clé public. La signature va ajouter quelques lignes dans
le fichier manifest ainsi que d'autres fichiers permettant de confirmer qu'il s'agit de vous et que l'archive n'a pas été
modifiée après signature. La JDK délivre deux utilitaires qui permettent de signer votre archive à déployer, keytool et jarsigner :
Le programme keytool gère des magasins de clés (key stores), bases de données de certificats et de clés privés. Chaque entrée dans le magasin de clés possède un alias. keytool permet ainsi d'obtenir une clé privée associée à des clés publiques. Celles-ci vont être stockées dans un fichier qui va servir plutard pour la signature. Chaque clé est identifiée par un alias, généralement le nom du signataire. Ce fichier peut contenir la signature de plusieurs personnes.
Voici, d'une façon générale, les paramètres à spécifier pour l'utilisation de cet outil :
keytool -genkey -keystore magasinDesClés -alias votreNom
Lorsque vous créez ou ouvrez un magasin de clés, vous êtes invité à fournir un mot de passe pour le magasin de clés. Il convient de choisir un vrai mot de passe et de protéger ce fichier, car il contient les clés de signature privées.
Vous remarquez qu'à la fin de la saisie, vous devez fournir un mot de passe spécifique pour la clé que vous venez de créer, ou appuyer sur Entrée pour utiliser le mot de passe du magasin de clés comme mot de passe de clé.
L'outil keytool utilise les noms distingués X.500 pour identifier les propriétaires de clé et les émetteurs de certificat, avec les composants suivants :
Grâce à cet outil keytools, le fichier de clés est en place :
Supposons que manu veuille donner sa clé publique à Paul. Il doit alors exporter un fichier de certificat au moyen de l'option export de l'outil keytool :
keytool -export -keystore clés -alias manu -file manu.cert
Ensuite manu peut envoyer le certificat à Paul. Lorsque Paul reçoit le certificat, il peut l'imprimer au moyen de l'option printcert de l'outil keytool :
keytool -printcert -file manu.cert
Voici ci-dessous les commandes successives à réaliser à partir du magasin de clés clés :
Ce certificat est autosigné. Par conséquent, Paul ne peut pas utiliser un autre certificat garanti pour vérifier que ce certificat est valide. Il peut, à la place, appeler manu et lui demander de lire l'empreinte du certificat au téléphone.
Lorsque Paul a toute confiance en son certificat, il peut l'importer dans son magasin de clés au moyen de l'option import de l'outil keytool :
N'importez jamais dans un magasin de clés un certificat dont vous n'êtes pas absolument sûr. Une fois que le certificat est ajouté au magasin de clés, n'importe quel programme utilisant le magasin de clés suppose que le certificat peut être utilisé pour vérifier les signatures.
A présent manu peut commencer à envoyer des documents signés à Paul. L'outil jarsigner signe et vérifie les fichiers JAR.
A l'aide de ce fichier de clés, nous pouvons maintenant signer notre archive JWSPhotos.jar, et ceci grâce à l'utilitaire jarsigner. Voici d'ailleurs la commande générale à soumettre :
jarsigner -keystore magasinDesClés archive votreNom
Dans cet outil, vous avez juste à spécifier le même mot de passe que vous utilisez lors de l'élaboration des clés :
Vous remarquez que votre certificat possède une durée de vie limité à six mois. Si vous ouvrez l'archive signée, vous voyez alors apparaître deux fichiers supplémentaires :
Placez maintenant votre archive signée dans votre application Web de déploiement Java Web Start. Cette fois-ci, le déploiement s'effectue correctement. L'utilisateur doit, par contre, confirmer son utilisation sur son ordinateur :
Après avoir validé, voici donc le programme de votre application qui se lance, cette fois-ci, et contrairement aux applications qui tournent dans "le bac à sable", sans la présence du bandeau Java Application Windows :
jarsigner -verify -keystore Paul.store JWSPhotos.jar
Paul n'a pas besoin de spécifier l'alias de clé. Le programme jarsigner trouve le nom X.500 du propriétaire de clés dans la signature numérique et recherche les certificats correspondants dans le magasin de clés.
Si le fichier JAR n'est pas corrompu et que la signature corresponde, le programme jarsigner imprime le texte suivant : jar verified :