Habituellement, les applications Java sont exécutées dans un terminal sur les systèmes Unix. Cela nécessite qu'un compte utilisateur soit connecté au système en permanence et qu'un terminal reste ouvert.

Cela présente plusieurs inconvénients, allant de la sécurité aux performances du système, jusqu'au simple risque qu'un utilisateur appuie sur une mauvaise touche dans le terminal et tue l'application Java.

Le Java Service Wrapper résout ces problèmes en permettant d'installer votre application Java en tant que démon. Il offre une détection automatique des outils de gestion de services (également appelés systèmes d'init) disponibles sur votre OS, ou vous laisse configurer un système spécifique à utiliser lors du lancement de votre application en tant que démon.

Vous utilisez Windows ? Consultez notre QNA pour Windows.

Qu'est-ce qu'un démon ?

Les démons UNIX sont similaires aux services Windows. Ils vous permettent d'exécuter votre application en arrière-plan et sont lancés automatiquement au démarrage du système.

Le problème est que Java, à lui seul, ne peut pas s'exécuter en tant que démon. Un utilisateur qui se contente de se déconnecter de la machine provoquera l'arrêt de Java.

Le Java Service Wrapper ne se contente pas de le rendre possible, il rend également facile l'exécution de n'importe quelle application Java en tant que démon. Il ajoute également des fonctionnalités de basculement avancé, de récupération d'erreurs et d'analyse afin de garantir à votre application le temps de disponibilité maximal possible.

Classe Java HelloWorldServer simple

Pour cet exemple, nous utiliserons une application HelloWorldServer simple qui s'exécutera en arrière-plan. Veuillez consulter la présentation complète de l'application pour apprendre à créer et compiler l'application HelloWorldServer pour cet exemple.

Encapsulation de la classe HelloWorldServer

La première étape pour transformer notre classe HelloWorldServer en démon consiste à configurer le Java Service Wrapper pour exécuter notre application. Pour la majorité des applications, cela peut être fait sans écrire de code Java.

Structure des répertoires

Le Wrapper est très flexible et peut être configuré pour fonctionner avec n'importe quelle structure de répertoires. Pour cet exemple, nous suggérons une structure de répertoires claire, réutilisable même pour des applications assez complexes. Veuillez recréer la structure de répertoires suivante sous un répertoire de votre choix. Nous appellerons ce répertoire racine $(EXAMPLE_HOME). Il s'agit d'une extension de la structure de répertoires décrite dans la présentation de HelloWorldServer.

Structure des répertoires :
$(EXAMPLE_HOME)/
$(EXAMPLE_HOME)/bin/
$(EXAMPLE_HOME)/conf/
$(EXAMPLE_HOME)/lang/
$(EXAMPLE_HOME)/lib/
$(EXAMPLE_HOME)/lib/classes/
$(EXAMPLE_HOME)/logs/

Obtenir le Java Service Wrapper

Veuillez télécharger la dernière version du Java Service Wrapper pour votre OS depuis la page Téléchargement, et extraire l'archive dans un répertoire de votre choix. Nous appellerons le répertoire extrait $(WRAPPER_HOME).

Copier les fichiers du Wrapper

Le Java Service Wrapper sous UNIX se compose de quatre composants principaux : le binaire Wrapper, un fichier jar, une bibliothèque native utilisée par le fichier jar, et un script shell utilisé pour lancer le Wrapper et effectuer des actions telles que le contrôler en tant que démon. Veuillez copier ces fichiers comme suit :

Copier les fichiers :
cp $(WRAPPER_HOME)/bin/wrapper $(EXAMPLE_HOME)/bin/wrapper
cp $(WRAPPER_HOME)/lib/wrapper.jar $(EXAMPLE_HOME)/lib/wrapper.jar
cp $(WRAPPER_HOME)/lib/libwrapper.so $(EXAMPLE_HOME)/lib/libwrapper.so
cp $(WRAPPER_HOME)/src/bin/App.sh.in $(EXAMPLE_HOME)/bin/helloworldserver

Ensuite, vous devez rendre le fichier de script exécutable :

chmod +x helloworldserver

Clé de licence :

Les éditions Standard et Professional du Java Service Wrapper nécessitent une clé de licence pour pouvoir s'exécuter. Le Wrapper est livré avec une clé de licence simple qui vous permettra d'exécuter le Wrapper pendant 15 minutes. Veuillez la copier pour le moment. Vous pouvez obtenir une licence d'essai longue durée en cliquant sur le bouton Essai gratuit en haut de la page.

Copier le fichier de licence :
cp $(WRAPPER_HOME)/src/conf/wrapper-license-time.conf $(EXAMPLE_HOME)/conf/wrapper-license.conf

Fichier de configuration du Wrapper :

Enfin, copiez le fichier de configuration par défaut du Wrapper. Nous l'éditerons dans la section suivante.

Copier le fichier de configuration :
cp $(WRAPPER_HOME)/src/conf/wrapper.conf.in $(EXAMPLE_HOME)/conf/wrapper.conf

Fichier de configuration du Wrapper

Ouvrez le fichier $(EXAMPLE_HOME)/conf/wrapper.conf dans l'éditeur de texte de votre choix.

Veuillez localiser et modifier les propriétés suivantes.

Fichier de configuration
wrapper.java.command=java
wrapper.java.command.loglevel=INFO

wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
wrapper.app.parameter.1=HelloWorldServer

wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=../lib/classes

wrapper.java.library.path.1=../lib

wrapper.logfile=../logs/wrapper.log
  • La propriété wrapper.java.command est utilisée pour spécifier l'emplacement de la commande Java qui sera utilisée. La valeur que nous avons spécifiée sera recherchée dans le chemin système. Il est également possible de spécifier un chemin absolu.

  • La propriété wrapper.java.command.loglevel est facultative, mais elle est utile pour déboguer la ligne de commande Java générée par le Wrapper. Nous recommandons de l'inclure au début, mais elle peut être commentée une fois que votre application fonctionne.

  • La propriété wrapper.java.mainclass est utilisée pour spécifier la classe principale transmise à Java lors de son lancement. C'est un point de confusion pour les nouveaux utilisateurs, mais dans la plupart des cas, il s'agira d'une des classes d'aide du Wrapper plutôt que de la classe principale de votre application. Le Wrapper prend en charge plusieurs méthodes d'intégration, mais pour cet exemple, nous utilisons la méthode la plus simple appelée Méthode d'intégration n°1 (WrapperSimpleApp).
    Cette méthode utilise la classe d'aide org.tanukisoftware.wrapper.WrapperSimpleApp pour gérer le cycle de vie de la JVM et la communication avec le Wrapper. Pour l'instant, ne vous préoccupez pas de ce point.

  • La classe principale réelle de notre application HelloWorldServer est transmise comme premier paramètre à l'aide de la propriété wrapper.app.parameter.1. Il est possible de transmettre des paramètres supplémentaires à HelloWorldServer en ajoutant des propriétés supplémentaires avec des index croissants, par exemple wrapper.app.parameter.2=P1.

    Nous ne les montrons pas ici, mais il est également possible d'ajouter des paramètres Java supplémentaires à l'aide des propriétés wrapper.java.additional.<n>.

  • L'étape suivante consiste à spécifier le classpath. Cela se fait à l'aide des propriétés wrapper.java.classpath.<n>. Nous avons besoin de deux entrées de classpath pour notre application. La première consiste à inclure le fichier wrapper.jar requis, qui contient les classes d'aide du Wrapper. La seconde inclut le répertoire lib/classes où se trouve notre classe HelloWorldServer.

  • Le Wrapper utilise une bibliothèque native, libwrapper.so, pour implémenter certaines de ses fonctionnalités. Les bibliothèques natives ne sont pas utilisées par de nombreuses applications Java, vous ne les avez donc peut-être jamais rencontrées. Les propriétés wrapper.java.library.path.<n> sont utilisées pour spécifier l'emplacement de ces bibliothèques. Pour l'instant, ne vous préoccupez pas de ce point.

  • La propriété wrapper.logfile est utilisée pour indiquer au Wrapper où écrire son fichier journal.

Nous avons maintenant indiqué au Wrapper comment exécuter notre application Java.

Un point important à noter concernant toutes les valeurs de propriétés est qu'elles sont toujours spécifiées avec des valeurs de chemin qui sont relatives à l'emplacement du binaire Wrapper.

Script shell

Ouvrez le fichier de script shell $(EXAMPLE_HOME)/bin/helloworldserver dans l'éditeur de texte de votre choix.

Quelque part près du début du fichier, vous verrez deux variables : APP_NAME et APP_LONG_NAME. Veuillez remplacer les valeurs par le nom de votre application.

Script shell
# Application
APP_NAME="helloworldserver"
APP_LONG_NAME="Hello World Server"

Il existe quelques autres variables utiles pour configurer le Wrapper en tant que démon, mais nous les verrons un peu plus loin dans ce tutoriel.

Exécuter HelloWorldServer dans un terminal

Le Wrapper est maintenant configuré. Commençons à tester notre configuration en exécutant le Wrapper dans le terminal.

Veuillez ouvrir un nouveau terminal et aller dans notre répertoire $(EXAMPLE_HOME) avec la commande cd. Le Wrapper et notre application encapsulée peuvent maintenant être démarrés comme suit :

bin/helloworldserver console

Notez que l'emplacement du fichier de configuration est relatif à l'emplacement du binaire Wrapper. C'est un peu contre-intuitif, mais cela augmente considérablement la fiabilité du Wrapper lorsqu'il est lancé par différentes méthodes.

Vous devriez voir une sortie similaire à celle ci-dessous après le démarrage du Wrapper :

wrapper  | --> Wrapper Started as Console
wrapper  | Java Service Wrapper Professional Edition 64-bit {version}
wrapper  |   Copyright (C) 1999-2010 Tanuki Software, Ltd. All Rights Reserved.
wrapper  |     https://wrapper.tanukisoftware.com
wrapper  |
wrapper  | --------------------------------------------------------------------
wrapper  | Thank you for your interest in the Java Service Wrapper.
wrapper  |
wrapper  | You are running with a full featured trial License Key which will
wrapper  | allow you to run or restart the Java Service Wrapper as many times
wrapper  | as you like.  Each invocation of the Wrapper will shutdown
wrapper  | automatically after 15 minutes.
wrapper  |
wrapper  | This limited trial License Key is useful for quick configuration
wrapper  | tests on various machines without the need to request a trial
wrapper  | license.  If more time is required, you can also immediately obtain
wrapper  | a one-month Free trial license:
wrapper  |   https://wrapper.tanukisoftware.com/trial
wrapper  |
wrapper  | The Java Service Wrapper requires a License Key to activate the
wrapper  | software.  License Keys can be purchased on the Java Service Wrapper
wrapper  | web site:
wrapper  |   https://wrapper.tanukisoftware.com/purchase
wrapper  |
wrapper  | This trial License Key in intended for testing and development and
wrapper  | should not be used as part of a production environment.
wrapper  | --------------------------------------------------------------------
wrapper  | 
wrapper  | 
wrapper  | Launching a JVM...
wrapper  | Java Command Line:
wrapper  |   Command[0] : /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java
wrapper  |   Command[1] : -Djava.library.path=../lib
wrapper  |   Command[2] : -classpath
wrapper  |   Command[3] : ../lib/wrapper.jar:../lib/classes
wrapper  |   Command[4] : -Dwrapper.key=sSRU9TooPnyds7IrRI2rFtKRHEgc8E4A
wrapper  |   Command[5] : -Dwrapper.port=32000
wrapper  |   Command[6] : -Dwrapper.jvm.port.min=31000
wrapper  |   Command[7] : -Dwrapper.jvm.port.max=31999
wrapper  |   Command[8] : -Dwrapper.pid=8557
wrapper  |   Command[9] : -Dwrapper.version=3.5.32-pro
wrapper  |   Command[10] : -Dwrapper.native_library=wrapper
wrapper  |   Command[11] : -Dwrapper.arch=x86
wrapper  |   Command[12] : -Dwrapper.cpu.timeout=10
wrapper  |   Command[13] : -Dwrapper.jvmid=1
wrapper  |   Command[14] : org.tanukisoftware.wrapper.WrapperSimpleApp
wrapper  |   Command[15] : HelloWorldServer
jvm 1    | WrapperManager: Initializing...
jvm 1    | Accepting connections on port: 9000

La bannière en haut du journal apparaît parce que nous utilisons une licence d'essai temporaire. Elle vous indique où obtenir une licence d'essai longue durée ou acheter une licence plus tard.

Les lignes suivant "Java Command Line:" montrent tous les arguments de la commande que le Wrapper utilise pour lancer la JVM. C'est très utile pour résoudre les problèmes. Une fois que cela fonctionne, veuillez commenter la propriété wrapper.java.command.loglevel. Le reste de cet exemple suppose que vous l'avez fait.

Si vous avez acheté une licence, voici ce que vous verriez :

wrapper  | --> Wrapper Started as Console
wrapper  | Java Service Wrapper Professional Edition 64-bit {version}
wrapper  |   Copyright (C) 1999-2010 Tanuki Software, Ltd. All Rights Reserved.
wrapper  |     https://wrapper.tanukisoftware.com
wrapper  |   Licensed to {licensee}
wrapper  |
wrapper  | Launching a JVM...
jvm 1    | WrapperManager: Initializing...
jvm 1    | Accepting connections on port: 9000

Vous pouvez arrêter votre application à tout moment en appuyant sur CTRL-C. Le Wrapper conserve toujours une trace de la raison pour laquelle une application a été arrêtée , vous verrez donc quelque chose comme ce qui suit dans votre journal.

wrapper  | CTRL-C trapped.  Shutting down.
wrapper  | <-- Wrapper Stopped

Exécuter HelloWorldServer en tant que démon

Une fois que la configuration du Wrapper a été vérifiée comme correcte, nous sommes prêts à installer le Wrapper en tant que démon.

Installer le démon

Cela peut être fait en utilisant la commande install du script shell comme suit.

sudo bin/helloworldserver install

NOTE

Veuillez noter que vous devez être root pour le faire.

Vous devriez voir une sortie similaire à celle ci-dessous, confirmant que le démon a été installé.

Detected Ubuntu or Debian:
Installing the Hello World Server Application daemon using systemd...
creating default service file...
Created symlink from /etc/systemd/system/multi-user.target.wants/testwrapper.service to /etc/systemd/system/testwrapper.service.

NOTE

Les messages peuvent différer selon l'OS et l'outil de gestion de services utilisé pour installer le démon. Il en va de même pour les autres commandes présentées plus bas sur cette page.

Démarrer le démon

Vous pouvez maintenant démarrer votre démon en utilisant à nouveau le fichier de script shell en tant que root.

sudo bin/helloworldserver start

Vous devriez voir une sortie similaire à celle ci-dessous, confirmant que le démon a été démarré.

Waiting for Hello World Server Application...
running: PID:17548

Cela indique que le script demande réellement au système d'init de démarrer le démon et attend que le processus soit détecté comme en cours d'exécution, puis affiche son PID. Ensuite, le terminal vous permettra de saisir d'autres commandes, mais le Wrapper continuera de s'exécuter en arrière-plan.

Vous pouvez confirmer que le Wrapper est en cours d'exécution en ouvrant le fichier journal ou en utilisant la commande status :

bin/helloworldserver status
Hello World Server Application (installed with systemd) is running: PID:17548, Wrapper:STARTED, Java:STARTED

Cela indique que le Wrapper a démarré et a lancé l'application Java avec succès.

Installer et démarrer le démon en une seule opération

Depuis la version 3.5.28, le script dispose également de la commande installstart pour effectuer à la fois une installation et un démarrage en une seule opération.

sudo bin/helloworldserver installstart

Si le démon parvient à s'installer et à démarrer, vous devriez voir la sortie suivante :

Detected Ubuntu or Debian:
Installing the Test Wrapper Sample Application daemon using systemd...
creating default service file...
Created symlink from /etc/systemd/system/multi-user.target.wants/testwrapper.service to /etc/systemd/system/testwrapper.service.
Waiting for Test Wrapper Sample Application...
running: PID:20720

Arrêter le démon

Lorsque vous êtes prêt à arrêter le démon, vous pouvez utiliser la commande stop du fichier de script shell en tant que root.

sudo bin/helloworldserver stop

Vous pouvez confirmer que le Wrapper est en cours d'exécution en ouvrant le fichier journal ou en utilisant la commande status :

bin/helloworldserver status
Hello World Server (installed with systemd) is not running.

Redémarrer le démon

Le démon peut être redémarré à l'aide des commandes restart ou condrestart. restart arrêtera le démon s'il est en cours d'exécution, puis le démarrera. Si le démon n'est pas en cours d'exécution, la commande le démarrera simplement. condrestart redémarrera le démon uniquement s'il est en état d'exécution.

sudo bin/helloworldserver restart
sudo bin/helloworldserver condrestart

Mettre en pause et reprendre le démon

Depuis la version 3.5.31, le Wrapper peut être mis en pause et repris à l'aide du script shell. Mais vous devez d'abord le configurer comme pouvant être mis en pause. Cela peut être fait en décommentant la ligne "#PAUSABLE=true" (supprimez le caractère '#') située en haut du script. Notez que le démon doit être redémarré pour que cette propriété prenne effet.

PAUSABLE=true

Juste en dessous dans le script, vous verrez la ligne "#PAUSABLE_MODE=signals" qui permet de configurer le mode utilisé pour mettre en pause et reprendre le démon. Deux modes sont actuellement disponibles :

- 'signals' qui utilise SIGUSR1 et SIGUSR2 pour communiquer les actions de pause et de reprise au Wrapper

- 'file' qui utilise le fichier de commandes.

La valeur par défaut est 'signals' car elle est plus rapide à exécuter et plus sûre, puisqu'il n'est pas nécessaire de se préoccuper des permissions du fichier de commandes.

PAUSABLE_MODE=signals

Vous pouvez maintenant démarrer le Wrapper et exécuter la commande pause. La sortie devrait ressembler à ceci :

bin/helloworldserver pause
Pausing Hello World Server.

Vous pouvez confirmer que le Wrapper est bien en pause à l'aide de la commande status :

bin/helloworldserver status
Hello World Server (installed with systemd) is running: PID:7050, Wrapper:PAUSED, Java:DOWN_CLEAN

Vous pouvez ensuite reprendre l'application à l'aide de la commande resume :

bin/helloworldserver resume
Resuming Hello World Server.

Et confirmer que le Wrapper est à nouveau en cours d'exécution à l'aide de la commande status :

bin/helloworldserver status
Hello World Server (installed with systemd) is running: PID:7050, Wrapper:PAUSED, Java:DOWN_CLEAN

Désinstaller le démon

Le Wrapper est actuellement configuré pour redémarrer lorsque votre système est redémarré. Comme il s'agit d'un test, vous souhaiterez probablement supprimer le démon comme suit :

sudo bin/helloworldserver remove

Vous devriez voir une sortie similaire à celle ci-dessous, confirmant que le démon a été désinstallé.

sudo bin/testwrapper remove
Detected Ubuntu or Debian:
Stopping Test Wrapper Sample Application...
Test Wrapper Sample Application was not running.
Removing Test Wrapper Sample Application daemon from systemd...
Removed symlink /etc/systemd/system/multi-user.target.wants/testwrapper.service.

Notez que le script s'assurera d'abord que le Wrapper n'est pas en cours d'exécution avant de le désinstaller.

Après la désinstallation, la commande status devrait afficher ce qui suit :

bin/helloworldserver status
Hello World Server (not installed) is not running.

Choisir l'outil de gestion de services

Selon la plateforme, il existe différents systèmes avec lesquels un démon peut être installé et exécuté. Par exemple, sous Linux, systemd, upstart et initd sont couramment utilisés. Sous AIX, un démon peut être installé avec SRC ou initd.

Le tableau ci-dessous donne un aperçu des différents outils de gestion de services utilisés par le Wrapper pour installer un démon selon la plateforme. Ceux listés en haut sont plus avancés et généralement préférés.

Linux
AIX
MacOSX
FreeBSD
Autres plateformes UNIX
SystemdSrcLaunchdrc.dInit.d
UpstartInit.d
Init.d

Selon la distribution (Linux), la version de l'OS et la configuration de l'OS, certains des outils de gestion de services listés ci-dessus peuvent ne pas être installés. Le script shell du Wrapper a toutefois la capacité de détecter quel(s) outil(s) de gestion de services est (sont) présent(s) sur la machine. Lorsque plusieurs outils sont possibles pour un OS donné (c'est-à-dire sous Linux et AIX), le Wrapper choisira automatiquement celui recommandé selon un ordre de priorité. Par exemple, sous Linux, systemd est préféré à upstart, lui-même préféré à initd. Ce comportement par défaut a été introduit dans la version 3.5.31 et est configuré par la ligne suivante située près du début du script :

SERVICE_MANAGEMENT_TOOL=auto

Vous pouvez souhaiter spécifier explicitement un autre outil de gestion de services que celui choisi automatiquement par le Wrapper. Dans ce cas, vous définiriez la propriété ci-dessus avec le nom d'un autre système.

SERVICE_MANAGEMENT_TOOL=initd

NOTE

Notez que le démon doit être réinstallé pour que cette propriété prenne effet.

Vous devriez voir la sortie suivante après la réinstallation du service :

sudo bin/helloworldserver install
Detected Ubuntu or Debian:
Installing the Hello World Server daemon using init.d..
 Adding system startup for /etc/init.d/helloworldserver ...
   /etc/rc0.d/K20helloworldserver -> ../init.d/helloworldserver
   /etc/rc1.d/K20helloworldserver -> ../init.d/helloworldserver
   /etc/rc6.d/K20helloworldserver -> ../init.d/helloworldserver
   /etc/rc2.d/S20helloworldserver -> ../init.d/helloworldserver
   /etc/rc3.d/S20helloworldserver -> ../init.d/helloworldserver
   /etc/rc4.d/S20helloworldserver -> ../init.d/helloworldserver
   /etc/rc5.d/S20helloworldserver -> ../init.d/helloworldserver

Ensuite, le démon utilisera initd au prochain démarrage.

AVERTISSEMENT

Si l'outil de gestion de services spécifié n'est pas présent sur le système ou si l'installation a échoué pour une raison quelconque, le script shell renverra un code d'erreur de 1.

Lorsque vos tests sont terminés, n'oubliez pas de désinstaller le démon afin d'empêcher son démarrage au prochain démarrage du système.

Référence : Lancement de votre application avec le Wrapper