Déploiement d'applications
Archive Java
1. Présentation
Une archive Java est un format de fichier particulier permettant de regrouper dans un seul fichier (l’archive) plusieurs autres fichiers. En général, on regroupe ainsi tous les fichiers nécessaires au fonctionnement d’une application. Ceci comprend bien sûr les fichiers .class mais également toutes les autres ressources indispensables au bon fonctionnement de l’application. Cette possibilité de regroupement procure de nombreux avantages pour le déploiement d’applications.
-
Le premier, et certainement le plus appréciable, réside dans le fait que le déploiement d’une application se résume à la recopie d’un seul et unique fichier sur le poste client, même si l’application exige pour son fonctionnement plusieurs ressources organisées sous forme d’une arborescence bien précise. Cette arborescence est créée à l’intérieur du fichier archive et n’a pas besoin d’être reproduite sur le poste client.
-
Les fichiers archives peuvent être compressés afin d’optimiser leur stockage et leur transfert sur un réseau.
-
L’application peut embarquer l’ensemble des ressources nécessaires et un environnement d’exécution Java minimaliste nécessaire à l’exécution de l’application sans devoir installer le JRE.
2. Manipulation d’une archive
La manipulation d’une archive Java (fichier jar - Java ARchive) reprend les mêmes principes que la manipulation d’une archive dans le monde Unix avec la commande tar. Les options de la commande jar permettant de manipuler une archive Java sont d’ailleurs étrangement ressemblantes à celles de la commande tar d’Unix. Le format utilisé en interne par les fichiers archives est également bien connu puisqu’il s’agit du format ZIP. Un fichier archive Java peut d’ailleurs être manipulé avec les outils dédiés à la manipulation de fichiers ZIP.
La commande standard de manipulation d’archive est la commande jar. Elle fait partie des outils fournis avec le JDK que l’on peut retrouver dans le répertoire bin de l’installation du JDK.
a. Création d’une application
Avant...
Création d’une application autonome avec jlink
Depuis Java 9, l’API Java est modulaire. L’une des conséquences est qu’il n’est nécessaire, à l’exécution, de charger que les modules dont dépend une application pour qu’elle fonctionne. Oracle est allé encore plus loin en permettant de créer une arborescence de répertoires et fichiers contenant ces modules, l’outil java et l’archive d’une application. Ce répertoire peut être facilement compressé ou intégré à un installeur pour le déployer sur les machines cibles. Un exemple d’utilisation du nouvel outil jpackage montrera la création d’un installeur un peu plus loin dans ce chapitre.
Pour créer l’arborescence de répertoires et fichiers, l’outil jlink est nécessaire. Des outils complémentaires sont aussi utilisés : jdeps et jmod.
-
jmod permet de créer le module correspondant à l’application à partir d’une archive.
-
jdeps permet de déterminer les modules dont dépend l’application.
-
jlink permet de créer l’arborescence de répertoires et fichiers.
La création d’une application autonome demande plusieurs étapes :
-
La création d’une archive Java correspondant au code de l’application sans définir de point d’entrée (pas d’attribut Main-Class dans le fichier manifest).
-
La création d’un fichier module (d’extension .jmod) à partir de l’archive Java.
-
La recherche des dépendances (modules) nécessaires pour la bonne exécution de l’application avec l’outil jdeps.
-
La création de l’arborescence de répertoires et fichiers embarquant l’application et les modules nécessaires.
-
L’ajout manuel des dépendances qui ne sont pas des modules Java. C’est le cas du pilote JDBC de notre exemple.
1. La création de l’archive Java
La création de l’archive Java sans définir de point d’entrée...
Externalisation des paramètres
L’application ainsi packagée est opérationnelle. Le principal problème restant est la chaîne de connexion à la base de données qui est écrite en dur dans la classe fr.eni.editions.jdbc.requete.TestPreparedStatement. Il est nécessaire de l’externaliser pour pouvoir la modifier en fonction du contexte. Cela nécessite de modifier le programme avant de le repackager.
1. Création du fichier de configuration
En Java, les fichiers de configuration sont souvent des fichiers properties ou des fichiers xml. Dans le cadre de cet ouvrage, un fichier properties a été utilisé.
Un fichier de ce type contient des couples clé/valeur écrits sur une ligne sous la forme suivante :
uneClé=uneValeur
uneAutreClé=uneAutreValeur
Le séparateur entre la clé et la valeur est le caractère =.
Pour créer un tel fichier, suivez la procédure suivante :
Créez un répertoire conf (le nom n’a aucun impact) à la racine du projet. Il ne faut pas le mettre dans le répertoire src car il n’a pas pour finalité d’être incorporé dans l’archive.
Faites un clic droit sur ce répertoire et sélectionnez le menu New - File.
Saisissez un nom pour le fichier (configuration.properties par exemple)....
Création d’un installeur avec jpackage
Un nouvel outil a fait son apparition dans l’écosystème Java : jpackage. L’objectif de cet outil est de créer un installeur permettant de faciliter le déploiement d’une application. Cet outil permet de générer un installeur adapté à la plateforme sur laquelle il est exécuté. Dans le cadre d’une machine Linux, le fichier généré par défaut est un fichier *.deb.
Ce fichier est ensuite exécutable pour installer l’application qu’il contient en utilisant la commande suivante :
sudo apt install ./monFichierDExtensionDeb
L’outil jpackage contient un grand nombre d’options permettant de configurer l’installeur. Une présentation de l’outil est disponible dans la documentation officielle sur le site d’Oracle à l’adresse suivante : https://docs.oracle.com/en/java/javase/17/jpackage/packaging-overview.html
Il peut notamment appeler jlink pour réaliser des opérations semblables à celles présentées dans la section précédente. Pour le développeur qui souhaite maîtriser de bout en bout le déploiement et éventuellement apporter des customisations comme c’est le cas dans la section précédente, il est possible de conserver l’utilisation directe...
Conclusion
Ce chapitre a permis de découvrir quelques aspects du déploiement d’une application écrite en Java. Dans un contexte professionnel avec un projet plus complexe, il sera bien sûr nécessaire d’approfondir le sujet. Toutefois, ces quelques pages permettent de bien démarrer.