Comment créer un service Windows à partir de l'application java


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

Author: ideasculptor, 2008-09-16

19 answers

J'ai eu un peu de chance avec le Wrapper de service Java

 62
Author: sblundy, 2008-09-16 00:11:11

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 restrictive, et Apache Tomcat l'utilise comme une partie de lui-même pour fonctionner sous Windows et Linux! Le faire fonctionner est un peu délicat, mais il existe un article exhaustif avec un 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 binaires Procrun (prunsrv.exe -> tomcat6.exe, prunmgr.exe - > tomcat6w.exe).

Quelque chose avec lequel j'ai eu du mal à utiliser Procrun, vos méthodes start et stop doivent accepter les paramètres (String [] argv). Par exemple "start(String[] argv)" et "stop(String[] argv)" mais "start()" et "stop()" serait provoquer des erreurs. Si vous ne pouvez pas modifier ces appels, envisagez de créer une classe bootstrapper qui peut masser ces appels pour répondre à vos besoins.

 90
Author: mcdon, 2012-09-12 01:52:31

AvecApache Commons Daemon vous pouvez maintenant avoir un nom exécutable personnalisé et une icône! Vous pouvez également obtenir un moniteur de barre d'état 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) a également mon propre nom et icône personnalisés!

  1. Téléchargez le Apache Commons Daemon binaries (vous aurez besoin de prunsrv.exe et prunmgr.EXE).
  2. Renommez-les en soit MyServiceName.exe et MyServiceNamew.exe respectivement.
  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. Installez maintenant votre service Windows comme ceci (voir 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. Maintenant, vous avez un service Windows de votre pot qui fonctionnera avec votre propre icône et nom! Vous pouvez également lancer le fichier monitor et il s'exécutera dans la barre d'état système avec votre propre icône et nom.

 51
Author: 11101101b, 2015-12-14 14:08:07

Une autre option est WinRun4J. Il s'agit d'un lanceur java configurable qui sert également d'hôte de service Windows (versions 32 et 64 bits). Il est open source et il n'y a aucune restriction sur son utilisation.

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

 23
Author: Peter Smith, 2009-05-11 07:50:53

Un moyen simple est le NSSM Wrapper Wrapper (voir mon blog d'entrée).

 19
Author: Giordano Maestro, 2014-10-06 09:54:40

Encore une autre réponse est Encore un autre Wrapper de service Java, cela semble être une bonne alternative au Wrapper de service Java car il a une meilleure licence. Il est également destiné à être facile à déplacer de JSW à YAJSW. Certainement pour moi, tout nouveau sur les serveurs Windows et essayer d'obtenir une application Java en cours d'exécution en tant que service, il était très facile à utiliser.

J'en ai trouvé d'autres, mais je n'ai pas fini par utiliser:

  • Java Service Launcher Je ne l'ai pas utilisé car cela semblait plus compliqué pour travailler que YAJSW. Je ne pense pas que ce soit un wrapper.
  • JSmoothLa création des services de Window n'est pas son objectif principal, mais peut être fait. Je ne l'ai pas utilisé parce qu'il n'y a pas eu d'activité depuis 2007.
 16
Author: atomicules, 2010-09-02 11:02:18

Je pense que le 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 démarrez et pour lequel vous spécifiez des arguments, est leur programme d'aide, qui démarrera ensuite votre programme. Ils ont un exemple de fichier de configuration pour cela.

 6
Author: Ed Thomas, 2008-09-16 15:13:06

JavaService est LGPL. Il est très facile et stable. Fortement recommandé.

 4
Author: NT_, 2009-10-12 08:51:49

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

Nécessite l'installation du runtime.NET.

 3
Author: Thorbjørn Ravn Andersen, 2017-11-17 21:30:32

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

 2
Author: , 2008-09-16 02:20:33

Je n'ai pas aimé la licence pour le Wrapper de service Java. 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 strictes.

 2
Author: Hugh Buchanan, 2008-09-16 02:27:05

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

Je n'ai rien fait de trop compliqué avec Java, mais en utilisant soit 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 paramètres fonctionne bien pour moi.

 2
Author: Kevin, 2008-09-16 02:34:18

Une assez bonne comparaison des différentes solutions est disponible à : http://yajsw.sourceforge.net/#mozTocId284533

Personnellement, comme launch4j

 2
Author: pushNpop, 2010-12-30 02:38:35

Avec Java 8, nous pouvons gérer ce scénario sans aucun outil externe. javapackager l'outil fourni avec java 8 fournit une option pour créer des bundles d'applications autonomes:

- type natif Générez des ensembles d'applications autonomes (si possible). Utilisez l'option-B pour fournir des arguments aux groupeurs utilisés. Si type est spécifié, seul un bundle de ce type est créé. Si aucun type n'est spécifié, tout est utilisé.

Les valeurs suivantes sont valides pour 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, reportez-vous à ce qui suit doc nous pouvons créer msi ou exe si nécessaire.

exe: Generates a Windows .exe package.
msi: Generates a Windows Installer package.
 2
Author: Steephen, 2017-08-24 01:57:45

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

 1
Author: Andrew Swan, 2008-09-16 06:40:59

J'ai actuellement besoin de cela pour 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 limite le service à un seul fichier batch mais je n'ai besoin que d'un script batch pour être converti en service.

Ciao!

 1
Author: , 2008-09-23 00:26:54

C'est simple car vous devez mettre un raccourci dans

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

Les fenêtres 10: Dans Exécuter shell:startup

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

REMARQUE: Cela ne fonctionnera qu'après la connexion


Avec Admin Droit

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

Si vous obtenez timeout utilisez cmd /c D:\JAVA7~1\jdk1.7.0_51\bin\java.exe -jar d:\jenkins\jenkins.war mais même avec cela, vous obtiendrez timeout mais en arrière-plan java.exe sera commencer. Vérifier dans le gestionnaire des tâches

REMARQUE: Cela s'exécutera au démarrage de la connexion Windows (avant la connexion, en fonction du service 'Startup Type')

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

 1
Author: Ravi Parekh, 2017-05-23 10:31:31

Si vous utilisez Gradle Build Tool, vous pouvez essayer mon windows-service-plugin, ce qui facilite l'utilisation de Apache Commons Daemon Procrun.

Pour créer une application de service java Windows avec le plugin, vous devez passer par plusieurs étapes simples.

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

    public class MyService {
    
        public static void main(String[] args) {
            String command = "start";
            if (args.length > 0) {
                command = args[0];
            }
            if ("start".equals(command)) {
                // process service start function
            } else {
                // process service stop function
            }
        }
    
    }
    
  2. Incluez le plugin 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 new, incubating, mécanisme de plugin introduit dans Gradle 2.1:

    plugins {
      id "com.github.alexeylisyutenko.windows-service-plugin" version "1.1.0"
    }
    
  3. Configurer 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 distribution 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 binaires Apache Commons Daemon Procrun, extraira ces binaires dans le répertoire de distribution de services et créera des fichiers batch pour l'installation / la désinstallation de la service de.

Dans le répertoire ${project.buildDir}/windows-service, vous trouverez des exécutables de service, des scripts batch pour l'installation/la désinstallation du service et toutes les bibliothèques d'exécution. Pour installer le service exécuté <project-name>-install.bat et si vous souhaitez désinstaller le service exécuté <project-name>-uninstall.bat. Pour démarrer et arrêter le service, utilisez <project-name>w.exe executable.

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

Pour plus d'informations, veuillez lire à propos du plugin et du démon Apache Commons Procrun.

 1
Author: Alexey Lisyutenko, 2017-11-28 16:43:51

Exe4j est une très bonne option bien qu'elle ne soit pas gratuite. Vérifiez-le à Exe4j Dans l'assistant pour créer le .fichier exe, vous donnez la possibilité de créer un service.

 -1
Author: Ram, 2013-12-17 07:06:26