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

Utilisez votre tablette Android comme second écran pour Linux (Raspberry Pi, MK908II)

Les tablettes Android atteignent désormais des prix qui défient toute concurrence. On trouve désormais des modèles à 39 € TTC en super marché, soit à peine plus cher que le Raspberry PI, mais avec un écran. Ces modèles souvent mono-core 1Ghz ou 1,4 Ghz avec 512 ou 1Go de mémoire ne sont très probablement pas utilisables pour une utilisation régulière sur Internet et ne sont en aucun point comparables à leur équivalent de marque (Samsung, Sony, LG, HTC, Lenovo, etc). Plusieurs tutoriels indiquent comment connecter utiliser une tablette Android comme second écran ( http://www.linux-magazine.com/Online/Blogs/Productivity-Sauce/Use-an-Android-Device-as-Screen-and-Input-for-Raspberry-Pi ). Ces méthodes utilisent généralement l'USB Tethering qui n'est malheureusement disponible que sur les téléphones ou tablettes avec un accès mobile (3G ou 4G) inclus. Dans ce billet, je vais vous montrer comment se connecter à une tablette en utilisant le mode Debug adb (Android Debug Bridge...

Ardublock ou S4A pour développer graphiquement

Si vous n'aimez pas le développement en C, ou C# sur les micro-contrôleurs, vous pouvez vous essayer au développement graphique avec Ardublock. Historique Cet environnement de développement est issu d' OpenBlocks développé par le MIT qui se positionne lui même dans la suite du langage Logo de Seymour Papert . Le langage Logo est un langage issu de l'Intelligence Artificielle dans les années 1970 dont l'objectif était de faciliter l'apprentissage de la programmation à de jeunes enfants par le biais du pilotage d'une tortue munie d'un crayon. Les ordres étaient relativement simples : avance de 90 cm, tourne à droite de 90°, etc. Ceci, permettait de réaliser des dessins assez simple, de piloter un petit robot et d'apprendre la programmation. C'était cependant un langage textuel. Exemple pour tracer un carré : POUR CARRE REPETE 4 [AV 100 TD 90] FIN   Son digne successeur, le langage Scratch désormais intégré à l'image Raspbian du Raspberry Pi...

Hack du RoboSapien en Infra-Rouge

Mon fils a eu un RoboSapien V1 il y a une dizaine d'années. Il prenait la poussière sur le haut d'une armoire, jusqu'à ce que j'ai envie de le ramener à la vie. Il était temps, les piles étaient en train de commencer à couler et vu le nombre de servo moteurs qu'il contient, ses jours étaient comptés. Mais non, j'ai réussi à contenir mon irrésistible envie de tout démonter et j'ai décidé de passer par la télécommande Infrarouge pour le piloter. Le protocole est assez similaire de celui d'une télécommande infrarouge classique avec cependant quelques petites différences. Il est correctement expliqué sur les sites http://www.aibohack.com/robosap/ir_codes.htm et http://www.markcra.com/robot/ir_codes.php . Je vais traduire en français pour ceux qui auraient un peu de difficulté. Il existe des librairies Arduino, mais comme d'habitude, pas toujours de librairie en C#. Voici les choses importantes à connaitre sur le protocole : Le protocole envoie...