Il existe plusieurs manière de lancer une application Java :
Pour exécuter l'application ainsi générée, il suffit d'exécuter :
Le process d'arrêt/re-démarrage peut être automatisé à l'aide du script suivant sous Windows.
- en executant la classe pour des applications qui tiennent en une seule classe
- en indiquant la classe Main dans le fichier .jar et les librairies dans la variable classpath
- en mettant les classes et les librairies associées dans le même fichier .jar (jpackit le fait très bien)
- 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
Enregistrer un commentaire