Sur les systèmes Windows, les applications Java s'exécutent dans une invite de commandes. Cela nécessite qu'un compte utilisateur soit connecté au système en permanence, et qu'une invite de commandes soit ouverte et en cours d'exécution sur le bureau.

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 la mauvaise touche dans l'invite de commandes et tue l'application Java.

Serveur d'applications Java

Qu'est-ce qu'un service ?

Windows a la capacité d'exécuter des applications en arrière-plan en tant que service afin de résoudre ces problèmes. Les services sont lancés au démarrage du système et ne nécessitent pas qu'un utilisateur soit connecté. Cela augmente considérablement la sécurité et la stabilité globale du système, car il n'est pas possible pour un utilisateur de les arrêter, de les démarrer ou de les altérer d'une quelconque manière, sauf s'il est administrateur.

Le problème est que Java, à lui seul, ne peut pas s'exécuter en tant que service. De nombreux outils simples comme la commande sc de Windows peuvent être utilisés pour exécuter Java en tant que service, mais le simple fait qu'un utilisateur se déconnecte de la machine entraînera l'arrêt de Java.

Le Java Service Wrapper non seulement rend cela possible, mais facilite également l'exécution de n'importe quelle application Java en tant que service Windows. 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 fonctionnement maximal possible.

Classe Java HelloWorldServer simple

Pour cet exemple, nous utiliserons une application HelloWorldServer simple qui nous permettra de l'exécuter en arrière-plan et de nous y connecter depuis un client à l'aide de telnet. Veuillez consulter la présentation complète de l'application pour apprendre à créer et à compiler l'application HelloWorldServer pour cet exemple.

À moins que vous ne souhaitiez réellement exécuter l'exemple, il suffit de dire qu'il peut être lancé à l'aide de la ligne de commande Java suivante.

Exécuter l'exemple :
java -classpath lib\classes HelloWorldServer

Encapsulation de la classe HelloWorldServer

La première étape pour transformer notre classe HelloWorldServer en service consiste à configurer le Java Service Wrapper afin d'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 et réutilisable même pour des applications assez complexes. Veuillez recréer la structure de répertoires suivante sous un répertoire arbitraire 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 système d'exploitation depuis la page Téléchargement, puis 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 se compose de trois composants principaux. Le binaire Wrapper, un fichier jar et une bibliothèque native utilisée par le fichier jar. Veuillez copier ces trois fichiers comme suit :

Copier les fichiers :
%WRAPPER_HOME%\bin\wrapper.exe -> %EXAMPLE_HOME%\bin\wrapper.exe
%WRAPPER_HOME%\lib\wrapper.jar -> %EXAMPLE_HOME%\lib\wrapper.jar
%WRAPPER_HOME%\lib\wrapper.dll -> %EXAMPLE_HOME%\lib\wrapper.dll

Le Wrapper peut être contrôlé directement ou à l'aide de fichiers batch. Ces fichiers sont décrits en détail sur la page Lancement sous Windows. Dans cet exemple, nous exécuterons le Wrapper directement.

Internationalisation / Localisation :

Si vous souhaitez utiliser le Wrapper dans une langue autre que l'anglais, veuillez copier les ressources de localisation en copiant l'intégralité du répertoire lang.

Copier un fichier de langue :
%WRAPPER_HOME%\lang -> %EXAMPLE_HOME%\lang

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 à long terme en cliquant sur le bouton Essai gratuit en haut de la page.

Copier le fichier de licence :
%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 le modifierons dans la section suivante.

Copier le fichier de configuration :
%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. Le Bloc-notes conviendra parfaitement.

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

wrapper.console.title=Hello World Server
wrapper.name=helloworldserver
wrapper.displayname=Hello World Server
wrapper.description=Hello World Server
  • 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 vous 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 de l'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 en tant que 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 wrapper.app.parameter.2=P1, par exemple.

    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, wrapper.dll, pour implémenter certaines de ses fonctionnalités. Les bibliothèques natives ne sont pas utilisées par de nombreuses applications Java, il se peut donc que vous ne les ayez 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.

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

Il ne reste plus que quelques propriétés à configurer.

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

Outre les propriétés que nous configurons, il existe quelques autres éléments clés du fichier de configuration dont vous devez avoir connaissance.

  • Le haut du fichier contient un encodage pour le fichier.

  • La ligne @include ../conf/wrapper-license.conf utilise la fonctionnalité de fichier d'inclusion pour inclure les propriétés de la clé de licence. Notez que le # initial est obligatoire.

  • La propriété wrapper.lang.folder est utilisée pour spécifier l'emplacement des fichiers de localisation du Wrapper.

Exécution de HelloWorldServer dans une console

Le Wrapper est maintenant configuré. Commençons à tester notre configuration en exécutant le Wrapper dans une invite de commandes Windows.

Veuillez ouvrir une nouvelle invite de commandes et vous placer 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\wrapper.exe -c ..\conf\wrapper.conf

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

Lorsque le Wrapper démarre, vous devriez voir quelque chose comme ceci :

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  | Command: "C:\Sun\jdk1.6.0_10_x64\bin\java.exe" -Djava.library.path="../lib" \
                     -classpath "../lib/wrapper.jar;../lib/classes" -Dwrapper.key="BBXKL6wk_SGpOV-i1z3E6yTeW1NQr62T" \
                     -Dwrapper.port=32000 -Dwrapper.jvm.port.min=31000 -Dwrapper.jvm.port.max=31999 -Dwrapper.pid=464 \
                     -Dwrapper.version="x.y.z" -Dwrapper.native_library="wrapper" -Dwrapper.cpu.timeout="10" \
                     -Dwrapper.jvmid=1 org.tanukisoftware.wrapper.WrapperSimpleApp 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ù vous pouvez obtenir une licence d'essai à long terme ou acheter une licence plus tard.

La ligne qui commence par « Command: » est un message de débogage ; elle affiche la ligne de commande Java exacte que le Wrapper exécute pour démarrer la JVM. Elle 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

Simuler un plantage

Voyons maintenant un exemple très simple de la façon dont le Wrapper est capable de se rétablir après un certain nombre de pannes. Veuillez redémarrer le Wrapper. Ensuite, ouvrez le Gestionnaire des tâches Windows. Cela peut se faire en appuyant sur CTRL-ALT-DEL.

Affichez l'onglet Processus et localisez le processus java.exe. Sélectionnez-le et cliquez sur Terminer le processus. Cela indiquera à Windows de tuer immédiatement le processus Java sans lui donner la possibilité de s'arrêter proprement.

Lorsque le processus Java meurt, vous verrez quelque chose comme ce qui suit dans le journal du Wrapper. Remarquez comment le Wrapper détecte que la JVM est morte et lance un remplacement en quelques secondes.

wrapper  | JVM exited unexpectedly.
wrapper  | Launching a JVM...
jvm 2    | WrapperManager: Initializing...
jvm 2    | Accepting connections on port: 9000

Le fichier journal conserve le nombre de fois que la JVM a été redémarrée. C'est très utile pour les administrateurs système, car ils peuvent facilement voir s'il y a eu des problèmes simplement en regardant la fin du fichier.

Exécution de HelloWorldServer en tant que service

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

Installation du service

Cela peut se faire en utilisant la commande -i du Wrapper comme suit.

NOTE

Veuillez noter que vous devrez être administrateur système pour le faire. À partir de Windows 7 et Windows 2008, vous devrez également exécuter cela depuis une console avec des privilèges élevés.

bin\wrapper.exe -i ..\conf\wrapper.conf

Vous devriez voir quelque chose comme ce qui suit, confirmant que le service a été installé.

wrapper  | Hello World Server service installed.

Démarrage du service

Vous pouvez maintenant démarrer votre service comme n'importe quel autre service Windows. Cela peut se faire depuis le Panneau de configuration des services Windows [Panneau de configuration] - [Outils d'administration] - [Services].

La commande Windows net start peut également être utilisée :

net start helloworld

Il est également possible de démarrer le Wrapper à l'aide du binaire Wrapper comme suit :

bin\wrapper.exe -t ..\conf\wrapper.conf

Dans ce cas, vous verrez :

wrapper  | Starting the Hello World Server service...
wrapper  | Hello World Server started.

Vous pouvez maintenant confirmer que le service est en cours d'exécution en consultant le Panneau de configuration des services [Panneau de configuration] - [Outils d'administration] - [Services], le Gestionnaire des tâches et le fichier WRAPPER_HOME\logs\wrapper.log.

Arrêt du service

Lorsque vous êtes prêt à arrêter le service, vous pouvez le faire comme ci-dessus, ou en utilisant le Wrapper lui-même :

bin\wrapper.exe -p ..\conf\wrapper.conf

Désinstallation du service

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 service comme suit :

bin\wrapper.exe -r ..\conf\wrapper.conf

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