web-dev-qa-db-fra.com

Comment créer un service Windows à partir de Java app

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 je n’utilise Windows sous n’importe quelle forme et que je n’ai jamais eu à créer de service, encore moins à partir de quelque chose comme une application Java (j’ai un pot pour l’application et une seule dépendance jar - log4j). Quelle est la magie nécessaire pour rendre cette course en tant que service? J'ai la source, donc les modifications de code, bien que de préférence évitées, sont possibles.

211
ideasculptor

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

66
sblundy

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 partie intégrante pour s'exécuter sous Windows et Linux! Le faire fonctionner est un peu délicat, mais il existe un article exhaustif avec un exemple concret.

En outre, vous pouvez consulter le fichier bin\service.bat dans Apache Tomcat pour avoir une idée de la configuration du service. Dans Tomcat, ils renomment les fichiers binaires Procrun (prunsrv.exe -> Tomcat6.exe, prunmgr.exe -> Tomcat6w.exe).

Quelque chose que j'ai eu du mal à utiliser Procrun, vos méthodes de démarrage et d'arrêt doivent accepter les paramètres (String [] argv). Par exemple, "start (String [] argv)" et "stop (String [] argv)" fonctionneraient, mais "start ()" et "stop ()" provoqueraient des erreurs. Si vous ne pouvez pas modifier ces appels, envisagez de créer une classe d'amorçage capable d'adapter ces appels à vos besoins.

95
mcdon

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

Mon service fonctionne maintenant avec mon propre nom et mon icône (prunsrv.exe) et le moniteur de la barre d'état système (prunmgr.exe) a également mon propre nom et mon icône personnalisés!

  1. Téléchargez le fichier binaires du démon Apache Commons (vous aurez besoin de prunsrv.exe et de prunmgr.exe).
  2. Renommez-les pour qu'ils soient MyServiceName.exe et MyServiceNamew.exe respectivement.
  3. Téléchargez WinRun4J et utilisez le programme RCEDIT.exe qui l'accompagne pour modifier le fichier exécutable Apache afin d'incorporer 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 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 de contrôle qui s’exécutera dans la barre des tâches avec votre propre icône et nom.

54
11101101b

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

26
Giordano Maestro

Une autre option est WinRun4J . Il s'agit d'un lanceur configurable Java pouvant également servir d'hôte de service Windows (versions 32 et 64 bits). Il est open source et son utilisation n’est soumise à aucune restriction.

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

25
Peter Smith

Une autre réponse est Encore un autre Java Service Wrapper , cela semble être une bonne alternative à Java Service Wrapper car il offre de meilleures licences. Il est également prévu de pouvoir passer facilement de JSW à YAJSW. Certes, pour moi, nouveau sur les serveurs Windows et essayer de faire fonctionner une application Java en tant que service, il était très facile à utiliser.

Quelques autres que j'ai trouvés, mais que je n'ai pas utilisés:

  • Java Service Launcher Je ne l'ai pas utilisé car cela semblait plus compliqué de fonctionner que YAJSW. Je ne pense pas que ce soit une enveloppe.
  • JSmooth La création de services de Window n'est pas son objectif principal, mais peut être fait . Je ne l'ai pas utilisé car il n'y a eu aucune activité depuis 2007.
17
atomicules

Je pense que le Java Service Wrapper fonctionne bien. Notez qu'il y a trois façons d'intégrer votre application. Il semble que l'option 1 fonctionne le mieux pour vous, car vous ne souhaitez pas modifier le code. Le fichier de configuration peut devenir un peu fou, mais n'oubliez pas que (pour l'option 1) le programme que vous démarrez et pour lequel vous allez spécifier des arguments est leur programme d'aide, qui démarrera ensuite votre programme. Ils ont un exemple de fichier de configuration pour cela.

6
Ed Thomas

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

Pour créer une application de service Windows Java 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(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 le nouveau mécanisme de plug-in en 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 de gradation createWindowsService pour créer une distribution du service Windows.

C'est tout ce que vous devez faire pour créer un service Windows simple. Le plug-in téléchargera automatiquement les fichiers binaires Apache Commons Daemon Procrun, extraira ces fichiers binaires dans le répertoire de distribution de services et créera des fichiers de commandes pour l'installation/la 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 <project-name>-install.bat et si vous souhaitez le désinstaller, exécutez <project-name>-uninstall.bat. Pour démarrer et arrêter le service, utilisez <project-name>w.exe exécutable.

Notez que le démarrage du service de gestion des méthodes doit créer et démarrer un thread distinct pour effectuer le traitement, puis le renvoyer. 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, consultez le plug-in et Apache Commons Daemon Procrun.

5
Alexey Lisyutenko

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

4
NT_

Avec Java 8, nous pouvons gérer ce scénario sans outils externes. javapackager L'outil fourni avec Java 8 fournit une option permettant de créer des ensembles d'applications autonomes:

-native type Génère des ensembles 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, reportez-vous à la section suivante doc nous pouvons créer un fichier msi ou EXE au besoin.

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

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

Exige que le runtime .NET soit installé.

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

Je pensais écrire un service en C #, mais mes contraintes de temps étaient trop serrées.

2
Hugh Buchanan

J'ai toujours juste utiliser sc.exe (voir http://support.Microsoft.com/kb/251192 ). Il devrait être installé sur XP à partir de SP1, et si ce n’est pas votre version de Vista, vous pouvez le charger à l’aide du kit de ressources Vista.

Je n'ai rien fait de trop compliqué avec Java, mais utiliser un argument de ligne de commande pleinement qualifié (x:\Java.exe ...) ou créer un script avec Ant pour inclure des dépendances et définir des paramètres me convient parfaitement.

2
Kevin

c'est simple car 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 Run Shell:startup

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

REMARQUE: Ceci ne fonctionnera qu'après vous être connecté


Avec droit d'utilisateur

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 cette opération, vous obtiendrez un délai d’expiration mais en arrière-plan, Java.exe sera démarré. Archiver dans le gestionnaire de tâches

REMARQUE: cette opération s'exécutera au démarrage de l'ouverture de session Windows (avant la connexion, selon le service 'Startup Type')

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

2
Ravi Parekh

Une bonne comparaison des différentes solutions est disponible sur: http://yajsw.sourceforge.net/#mozTocId2845

Personnellement, comme lancement4j

2
pushNpop

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

2
Jason

J'exige actuellement que cela exécute une application basée sur Eclipse, mais je dois d'abord définir certaines variables locales pour cette application. sc.exe n'autorisant que les exécutables mais pas les scripts, je me suis donc tourné vers autoexnt.exe, qui fait partie du kit de ressources Windows 20 . Il limite le service à un seul fichier de commandes, mais je n'ai besoin que d'un script de traitement par lots pour être converti en service.

ciao!

1
ramfree17

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
Andrew Swan