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

Supprimer les partitions Raspberry sur une carte SD sous Windows 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. DISKPART> list disk   N° disque  Statut         Taille   Libre    Dyn  GPT   ---------  -------------  -------  -------  ---  ---   Disque 0    En ligne        238 G octe

Emulateur Raspberry Pi sous Windows

Si vous souhaitez développer ou tester des applications pour Raspberry Pi, vous pouvez, soit compiler directement l'application sur Raspberry, soit la développer sous Linux ou Windows et la compiler pour Raspberry. La seconde solution est souvent plus simple car elle permet de disposer d'un environnement de compilation complet tel qu'Eclipse pour le développement. Une fois l'application développée, il faut la tester sur Raspberry. Là, il faut copier l'application en utilisant un client FTP ou SCP, puis se connecter en SSH et lancer l'exécutable. Il existe un autre moyen de tester une application Raspberry sans avoir à l'allumer. Il suffit de passer par un émulateur tel que QEMU qui permet de lancer un OS pour processeur ARM sous Linux ou Windows. L'émulateur sous Windows 1. Récupérez l'émulateur à l'adresse suivante : http://sourceforge.net/projects/rpi-emulator-win32/ . 2. Dézippés le contenu de l'image Rpi-Occidentalis-v02-qemu.7z av