Accéder au contenu principal

Librairie "launcher" pour simplifier le lancement des applications Java

Il existe plusieurs manière de lancer une application Java :
  1. en executant la classe pour des applications qui tiennent en une seule classe
  2. en indiquant la classe Main dans le fichier .jar et les librairies dans la variable classpath
  3. en mettant les classes et les librairies associées dans le même fichier .jar (jpackit le fait très bien)
  4. en utilisant une librairie qui charge toutes les librairies d'un répertoire dans le CLASSPATH
En fonction de la taille de votre application, chacun de ces choix peut être acceptable. Je vais parler assez rapidement des 3 premiers points qui sont assez standards et revenir sur le dernier point qui reste mon préféré car permettant un déploiement assez simple pour la plupart des grosses applications.

Pour les exemples ci-dessous, j'utiliserai l'exemple classique "Hello World" en mode ligne de commande ou couplé avec d'autres librairies pour un affichage graphique par exemple.

 import java.io.*;  
 public class HelloWorld {  
         public static void main(String[] args) {  
                 System.out.println("Hello World");  
         }  
 }  
Les fichiers seront stockés dans une structure de répertoire simple sous la forme :
+HelloWorld
   ++src
      +++HelloWorld.java
   ++bin
   ++lib

Lancement d'une application mono-classe

Nous avons vu précédemment comment compiler une classe en ligne de commande avec "javac".

 javac -d bin src/HelloWorld.java

Cette commande va générer un fichier class dans le répertoire bin. Pour l'exécuter, il faut indiquer dans quel répertoire se trouvent les classes à l'aide de l'option "-cp bin" suivi du nom de la classe principale à executer.

 java -cp bin HelloWorld  

Créer un fichier Jar et indiquer la classe Main

La création d'un fichier jar est assez simple. Un fichier jar peut être considéré soit comme une librairie, soit comme un exécutable si il contient une classe ayant une méthode "main". Vous pouvez utiliser la commande jar en ligne de commande. Le format d'un fichier jar est en fait le même qu'un fichier zip. L'utilitaire 7-zip permet en plus de garder la structure des répertoires.

jar cvfe lib/hello.jar HelloWorld -C bin/ .

Cette commande ajoute dans le fichier hello.jar les classes contenues dans le répertoire bin ainsi qu'un fichier Manifest qui contient le point d'entrée de l'application (option -e).

Pour exécuter l'application ainsi générée, il suffit d'exécuter :
java -jar lib/hello.jar

Pour mettre à jour un fichier jar, utilisez la commande suivante. Cette commande est très pratique pour des mises à jour ponctuelles : 

jar uf lib/hello.jar -C bin/ .

Packaging d'une application à l'aide de JPackIt et Launch4J

JPackIt (http://sourceforge.net/projects/jpackit/files/jpackit/) est une petite application Java qui permet de construire un fichier Jar contenant à la fois les classes et les librairies. Un tel packaging permet de simplifier la livraison de petites applications. Il faut préalablement avoir construit un fichier jar contenant la classe principale.


Indiquez le fichier Jar, la classe principale, le nom du fichier destination, les librairies dépendantes et le tour est joué.
Cette méthode marche bien pour des projets avec une taille allant jusqu'à 5 Mo. Au delà, le fichier jar devient trop lourd à gérer et on perd le bénéfice de la solution.

Sous Windows, il est possible de générer une application Native (.exe) qui peut ainsi être exécutée d'un simple click pour peu que Java soit déjà installé sur la machine. L'application Launch4J (sourceforge.net/projects/launch4j) joue parfaitement ce rôle.

Indiquez le fichier jar qui contient le Classpath ainsi que le chemin destinataire. Pour une application console, sélectionnez l'onglet "Header" et le Header Type "Console".

Vous obtiendrez ainsi une application native Windows avec en plus la sécurité que peu de gens pourront la décompiler.

Utilisez un lanceur d'application

Pour les applications qui font appel à de très nombreuses librairies (appels de Web Services avec Axis2 et Rampart par exemple), le CLASSPATH peut être si grand qu'il dépasse les limites autorisées en ligne de commande ou même dans un fichier Manifeste. J'utilise dans ce cas un lanceur d'application qui charge toutes les librairies contenues dans le répertoire "lib" en les rajoutant dynamiquement au CLASSPATH. Cette méthode est également utilisée par les serveurs applicatifs tels que Tomcat. La méthode que je vais présenter tiens en une seule et unique classe. Le point de départ de cette classe utilitaire vient de JavaLauncher (http://javalauncher.sourceforge.net/) de Christian Robert que j'ai modifiée afin de pouvoir passer les paramètres en ligne de commande et également de pouvoir stopper l'application proprement afin de la même à jour. Voici le code source, ainsi que le fichier jar associé. Copiez le fichier "launcher.jar" dans le répertoire lib et exécutez :

java -jar lib/launcher.jar HelloWorld

Le gros avantage de cette méthode c'est que le fichier Manifest n'est plus nécessaire pour pouvoir exécuter une classe contenant un main. Il est également possible de passer des paramètres comme pour une application classique.
Cette classe permet également de mettre à jour un fichier jar à partir d'un répertoire "updates". Contrairement à Unix, Windows ne permet pas de modifier un fichier jar lorsqu'il est en cours d'utilisation. Avec cette nouvelle classe, il suffit de mettre le fichier jar dans un répertoire et de demander l'arrêt de l'application de façon "propre" en créant un fichier vide "update". Le launcher demandera à l'application de se terminer "proprement". Au lancement de l'application, les fichiers du répertoire "updates" seront copiés dans le répertoire "lib".

Le process d'arrêt/re-démarrage peut être automatisé à l'aide du script suivant sous Windows.

 :restart  
 java -jar lib/launcher.jar HelloWorld  
 if %errorlevel%==100 GOTO restart  

Lorsque l'application est stoppée pour un update, elle doit renvoyer un code de retour 100 par un appel à "System.exit(100)". Ce code est récupéré pour relancer l'application.


Commentaires

Posts les plus consultés de ce blog

Supprimer les partitions Raspberry sur une carte SD sous Windows 7 avec Diskpart

Si vous souhaitez récupérer une ancienne carte SD utilisée pour démarrer un Raspberry pour un autre usage (appareil photo, etc), il vous faudra supprimer les deux partitions créées au moment de l'écriture de l'image sur la carte SD. Vous pouvez voir les partition en sélectionnant Menu Windows/Ordinateur/bouton droit "Gérer". Voici un exemple du résultat final. Vous pouvez supprimer la partition Unix de 7 Gb (ou 4Gb en fonction de la taille de votre carte) en sélectionnant la partition puis en faisant "bouton droit Supprimer". Laissez juste une partition pour pouvoir faire les autres manipulations avec DISKPART. Démarrez l'outil DISKPART en ligne de commande. Une nouvelle fenêtre s'ouvrira. Microsoft DiskPart version 6.1.7601 Copyright (C) 1999-2008 Microsoft Corporation. Sur l'ordinateur : FRVILN0H305806 DISKPART> list disk   N° disque  Statut         Taille   Libre    Dyn  GPT   ---------  -------------  -------  -------  ---  ---   D

Comment lire son écran de téléphone Android sur PC (2)

Voici une nouvelle manière d'accéder à votre téléphone depuis votre PC. Cette méthode utilise le câble USB et Google Chrome. Elle fonctionne donc sur Windows, Mac et Linux. Les pré-requis sont les mêmes que ceux du billet précédent : Téléphone configuré en mode Développement Drivers USB installés sur le PC Google Chrome installé L'application Vysor s'installe comme une extension de Google Chrome. Cherchez dans le Webstore et lancez l'installation. Une fois installée, l'application apparaît dans les extensions. Vous pouvez la lancer de différentes manières. La manière la plus simple est d'ouvrir la fenêtre des applications : chrome://apps/ Une autre manière est de créer un raccourci en cliquant sur « Détails ». Ensuite créez un raccourci sur le bureau, le menu démarrer et/ou la barre de tâche. Vous pouvez également cliquer sur afficher dans la boutique et lancer l'application depuis la boutique. Une fois

Serveur d'impression CUPS sur Raspberry Pi

Je possède une très vieille imprimante laser HP Laserjet 6L noir et blanc de 12 ans d'age qui a survécu à plusieurs imprimantes jet d'encre couleurs tombées en désuétude pour obsolescence programmée. J'envisage tout de même sérieusement de les démanteler pour les recycler en CNC, graveur ou autre.   Je continue donc a utiliser cette bonne petite imprimante parallèle qui me rend bien des services (en 12 ans, j'ai changé le toner 3 fois pour un coût de 20 € la cartouche). J'ai donc dû m'équiper d'une adaptateur USB/Parallèle pour pouvoir la connecter sur un PC récent. Le problème principal est que le driver de cette imprimate n'est reconnu que par un seul de mes PC sous Windows 7. Les autres PC sous Windows 8 ou Windows 10 reconnaissent bien l'imprimante, mais sortent des feuilles avec le code Postscript. L'impression depuis une tablette ou un téléphone Androïd est également tout simplement impossible. Pour remédier à ce problème, j'ai don