Comment créer un service Windows à partir de l’application Java

Je viens de recevoir une application Java qui doit être installée en tant que service sur XP et Vista. Cela fait environ 8 ans que j’ai utilisé Windows sous quelque forme que ce soit et je n’ai jamais eu à créer un service, et encore moins quelque chose comme une application java (j’ai un pot pour l’application et un seul pot de dépendance – log4j ). Quelle est la magie nécessaire pour que cela fonctionne comme un service? J’ai la source, donc des modifications de code, bien que de préférence évitées, sont possibles.

J’ai eu de la chance avec Java Service Wrapper

Apache Commons Daemon est une bonne alternative. Il a Procrun pour les services Windows et Jsvc pour les démons Unix. Il utilise une licence Apache moins ressortingctive, et Apache Tomcat l’utilise comme partie d’elle-même pour fonctionner sous Windows et Linux! Pour le faire fonctionner est un peu délicat, mais il y a un article exhaustif avec exemple de travail.

En plus de cela, vous pouvez regarder le bin \ service.bat dans Apache Tomcat pour avoir une idée de la configuration du service. Dans Tomcat, ils renomment les fichiers binarys Procrun (prunsrv.exe -> tomcat6.exe, prunmgr.exe -> tomcat6w.exe).

Quelque chose que j’ai eu du mal à utiliser avec Procrun, vos méthodes de démarrage et d’arrêt doivent accepter les parameters (Ssortingng [] argv). Par exemple, “start (Ssortingng [] argv)” et “stop (Ssortingng [] argv)” fonctionneraient, mais “start ()” et “stop ()” provoqueraient des erreurs. Si vous ne pouvez pas modifier ces appels, envisagez de créer une classe bootstrapper capable de masser ces appels en fonction de vos besoins.

Avec Apache Commons Daemon, vous pouvez maintenant avoir un nom et une icône de fichier exécutable personnalisé! Vous pouvez également obtenir un moniteur de plateau Windows personnalisé avec votre propre nom et icône!

J’ai maintenant mon service en cours d’exécution avec mon propre nom et icône (prunsrv.exe) et le moniteur de la barre d’état système (prunmgr.exe) possède également mon propre nom et icône personnalisé!

  1. Téléchargez les binarys Apache Commons Daemon (vous aurez besoin de prunsrv.exe et de prunmgr.exe).
  2. Renommez-les respectivement MyServiceName.exe et MyServiceNamew.exe .
  3. Téléchargez WinRun4J et utilisez le programme RCEDIT.exe qui l’accompagne pour modifier l’exécutable Apache afin d’intégrer votre propre icône personnalisée comme ceci:

     > RCEDIT.exe /I MyServiceName.exe customIcon.ico > RCEDIT.exe /I MyServiceNamew.exe customTrayIcon.ico 
  4. Maintenant, installez votre service Windows comme ceci (voir la documentation pour plus de détails et d’options):

     > MyServiceName.exe //IS//MyServiceName \ --Install="C:\path-to\MyServiceName.exe" \ --Jvm=auto --Startup=auto --StartMode=jvm \ --Classpath="C:\path-to\MyJarWithClassWithMainMethod.jar" \ --StartClass=com.mydomain.MyClassWithMainMethod 
  5. Vous avez maintenant un service Windows de votre Jar qui fonctionnera avec votre propre icône et nom! Vous pouvez également lancer le fichier du moniteur et il fonctionnera dans la barre d’état système avec votre propre icône et nom.

Une autre option est WinRun4J . Ceci est un lanceur Java configurable qui se double d’un hôte de service Windows (versions 32 et 64 bits). Il est open source et il n’y a pas de ressortingctions sur son utilisation.

(divulgation complète: je travaille sur ce projet).

Un moyen simple est le Wrapper Wrapper de NSSM ( voir l’entrée de mon blog ).

Encore une autre réponse est Yet Another Java Service Wrapper , cela semble être une bonne alternative à Java Service Wrapper, tout comme une meilleure licence. Il est également prévu de passer facilement de JSW à YAJSW. Certainement pour moi, nouveau pour les serveurs Windows et essayant de faire fonctionner une application Java en tant que service, c’était très facile à utiliser.

Certains autres que j’ai trouvés, mais n’ont pas fini par utiliser:

  • Lanceur de services Java Je ne l’ai pas utilisé car il semblait plus compliqué de travailler que YAJSW. Je ne pense pas que ce soit un emballage.
  • JSmooth La création des services de Window n’est pas son objective principal, mais peut être réalisée . Je ne l’ai pas utilisé car il n’y a pas d’activité depuis 2007.

Je pense que Java Service Wrapper fonctionne bien. Notez qu’il existe trois façons d’intégrer votre application. Il semble que l’option 1 fonctionnera le mieux pour vous étant donné que vous ne voulez pas changer le code. Le fichier de configuration peut devenir un peu fou, mais rappelez-vous simplement que (pour l’option 1) le programme que vous lancez et pour lequel vous spécifiez des arguments est leur programme d’aide, qui démarrera alors votre programme. Ils ont un exemple de fichier de configuration pour cela.

JavaService est LGPL. C’est très facile et stable. Hautement recommandé.

Utilisez ” winsw ” qui a été écrit pour Glassfish v3 mais fonctionne bien avec les programmes Java en général.

Exiger le runtime .NET installé.

J’ai déjà utilisé JavaService avec succès. Il n’a pas été mis à jour depuis quelques années, mais était plutôt solide quand je l’ai utilisé.

Je n’ai pas aimé les licences pour Java Service Wrapper. Je suis allé avec ActiveState Perl pour écrire un service qui fait le travail.

J’ai pensé à écrire un service en C #, mais mes contraintes de temps étaient trop serrées.

J’utilise toujours sc.exe (voir http://support.microsoft.com/kb/251192 ). Il devrait être installé sur XP à partir de SP1, et si ce n’est pas dans votre goût de Vista, vous pouvez le télécharger avec le kit de ressources de Vista.

Je n’ai rien fait de compliqué avec Java, mais utiliser un argument de ligne de commande complet (x: \ java.exe ….) ou créer un script avec Ant pour inclure des dépendances et définir des parameters fonctionne bien pour moi.

Une très bonne comparaison de différentes solutions est disponible à l’ adresse suivante : http://yajsw.sourceforge.net/#mozTocId284533

Personnellement, comme launch4j

Avec Java 8, nous pouvons gérer ce scénario sans outils externes. L’ outil javapackager fourni avec java 8 offre la possibilité de créer des bundles d’applications autonomes:

-native type Génère des bundles d’applications autonomes (si possible). Utilisez l’option -B pour fournir des arguments aux bundles utilisés. Si type est spécifié, seul un ensemble de ce type est créé. Si aucun type n’est spécifié, tout est utilisé.

Les valeurs suivantes sont valides pour le type:

 -native type Generate self-contained application bundles (if possible). Use the -B option to provide arguments to the bundlers being used. If type is specified, then only a bundle of this type is created. If no type is specified, all is used. The following values are valid for type: all: Runs all of the installers for the platform on which it is running, and creates a disk image for the application. This value is used if type is not specified. installer: Runs all of the installers for the platform on which it is running. image: Creates a disk image for the application. On OS X, the image is the .app file. On Linux, the image is the directory that gets installed. dmg: Generates a DMG file for OS X. pkg: Generates a .pkg package for OS X. mac.appStore: Generates a package for the Mac App Store. rpm: Generates an RPM package for Linux. deb: Generates a Debian package for Linux. 

Dans le cas de Windows, référez-vous au document suivant, nous pouvons créer msi ou exe selon vos besoins.

 exe: Generates a Windows .exe package. msi: Generates a Windows Installer package. 

FireDaemon est une autre bonne option. Il est utilisé par certains grands magasins comme la NASA, IBM, etc. voir leur site web pour une liste complète.

Je demande actuellement à cette application d’exécuter une application basée sur Eclipse, mais je dois d’abord définir certaines variables locales à cette application. sc.exe n’autorisera que les exécutables, mais pas les scripts. Je me suis donc tourné vers autoexnt.exe, qui fait partie du kit de ressources Windows 2003 . Il restreint le service à un seul fichier de commandes, mais un seul script de lot doit être converti en service.

Ciao!

c’est simple comme vous devez mettre un raccourci dans

Windows 7 C:\users\All Users\Start Menu\Programs\Startup (Admin) ou User home directory(%userProfile%)

Windows 10: dans le shell:startup

dans sa propriété -> raccourci -> cible -> java.exe -jar D:\..\runJar.jar

NOTE: Cela ne fonctionnera qu’après vous être connecté


Avec Admin Droite

sc create serviceName binpath= "java.exe -jar D:\..\runJar.jar" créera un service Windows

si vous obtenez un timeout, utilisez cmd /c D:\JAVA7~1\jdk1.7.0_51\bin\java.exe -jar d:\jenkins\jenkins.war jenkins.war sera démarré Archiver le gestionnaire de tâches

REMARQUE: Cela s’exécutera au démarrage de l’ouverture de session Windows (avant la connexion, basé sur le service ‘ Startup Type ‘)

Explication détaillée de la création du service Windows

Si vous utilisez Gradle Build Tool, vous pouvez essayer mon plug-in Windows-service , ce qui facilite l’utilisation d’ Apache Commons Daemon Procrun .

Pour créer une application de service java windows avec le plug-in, vous devez suivre plusieurs étapes simples.

  1. Créez une classe de service principale avec la méthode appropriée.

     public class MyService { public static void main(Ssortingng[] args) { Ssortingng command = "start"; if (args.length > 0) { command = args[0]; } if ("start".equals(command)) { // process service start function } else { // process service stop function } } } 
  2. Inclure le plug-in dans votre fichier build.gradle .

     buildscript { repositories { maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath "gradle.plugin.com.github.alexeylisyutenko:windows-service-plugin:1.1.0" } } apply plugin: "com.github.alexeylisyutenko.windows-service-plugin" 

    Le même extrait de script pour le nouveau mécanisme de plugin d’incubation introduit dans Gradle 2.1:

     plugins { id "com.github.alexeylisyutenko.windows-service-plugin" version "1.1.0" } 
  3. Configurez le plugin.

     windowsService { architecture = 'amd64' displayName = 'TestService' description = 'Service generated with using gradle plugin' startClass = 'MyService' startMethod = 'main' startParams = 'start' stopClass = 'MyService' stopMethod = 'main' stopParams = 'stop' startup = 'auto' } 
  4. Exécutez la tâche createWindowsService gradle pour créer une dissortingbution de service Windows.

C’est tout ce que vous devez faire pour créer un service Windows simple. Le plugin téléchargera automatiquement les binarys Apache Commons Daemon Procrun, extraira ces binarys dans le répertoire de dissortingbution de service et créera des fichiers batch pour l’installation / désinstallation du service.

Dans le répertoire ${project.buildDir}/windows-service , vous trouverez les exécutables du service, les scripts de traitement par lots pour l’installation / la désinstallation du service et toutes les bibliothèques d’exécution. Pour installer le service, exécutez -install.bat et, si vous souhaitez désinstaller le service, exécutez -uninstall.bat . Pour démarrer et arrêter le service, utilisez le w.exe exécutable w.exe .

Notez que le démarrage du service de traitement de méthode doit créer et démarrer un thread séparé pour effectuer le traitement, puis revenir. La méthode principale est appelée depuis différents threads lorsque vous démarrez et arrêtez le service.

Pour plus d’informations, consultez le plugin et Apache Commons Daemon Procrun.

Exe4j est une très bonne option bien que ce ne soit pas gratuit. Vérifiez-le à Exe4j Dans l’assistant pour créer le fichier .exe, vous avez la possibilité de créer un service.