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

220

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

idéesculpteur
la source
Une autre suggestion stackoverflow.com/a/9262081/381897
bhdrkn
1
Juste pour être complet: ici serverfault.com/a/259195, il indique que l'application doit répondre aux rappels de Service Control Manager. Lisez ce tutoriel utilise Procrun ticklingmind.blogspot.com/2010/03/...
Broken_Window
Autre réponse stackoverflow.com/questions/5953525/…
Ravi Parekh

Réponses:

69

J'ai eu de la chance avec le Java Service Wrapper

sblundy
la source
11
Java Service Wrapper semble très utile. Mais j'ai regardé la liste des fonctionnalités. Vous aurez juste besoin d'être conscient que la version communautaire n'est pas sous licence pour une utilisation sur le serveur.
Brian Matthews
Cela pourrait être un problème. Il y a quelques années, je l'ai utilisé. Je suppose qu'ils ont décidé de charger.
sblundy
Ce wrapper est utilisé par de nombreux projets open source, dont plusieurs sur Jakarta Apache, comme ActiveMQ.
Todd
7
wrapper.tanukisoftware.org/doc/english/licenseCommunity.html Utilisation en source fermée La GPL ne restreint pas le développement de logiciels privés pour un usage interne qui dépend des logiciels sous GPL tant que ce logiciel n'est jamais distribué sans faire la source complète de l'application entière disponible pour tous les utilisateurs. Bien que nous encouragions les utilisateurs des entreprises et du gouvernement à utiliser un contrat de licence de serveur ou de développement, le contrat de licence communautaire est acceptable tant que l'application est à usage interne ou sera toujours distribuée avec son src complet.
Vladimir
1
@Vladimir tanuki wrapper n'est plus open source pour l'arc 64 bits
gerrytan
100

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 sur Windows et Linux! Pour 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 consulter 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 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 de masser ces appels en fonction de vos besoins.

mcdon
la source
Grâce à la réflexion, vous pourriez probablement contourner le problème que vous avez indiqué dans votre dernier paragraphe. De plus, le démon apache commons est le seul wrapper que je connaisse qui ait des binaires 64 bits pré-construits pour une utilisation gratuite.
djangofan
Vous avez besoin d'un retour chariot entre chaque option JVM. Par exemple, si vous avez sur la même ligne -Dopt1 = a -Dopt2 = b, cela peut ne pas fonctionner. Pour y remédier, vous devez écrire --JvmOptions=-Dopt=a#-Dopt2=b. J'exécutais la commande à partir d'un script de fourmi et luttais pendant des jours à cause de cela. J'espère que ça aide.
Sydney
L'article dont vous avez parlé n'existe plus ... Avez-vous encore un moyen d'y accéder? J'ai du mal à faire en sorte qu'Apache Commons Daemon fasse ce dont j'ai besoin.
11101101b
3
@ 11101101b, apache semble avoir attaché les tripes de l'article à sa propre page wiki ...
Lucas
@community wiki, j'ai utilisé Apache Commons Daemon pour une machine Windows 64 bits, il a ajouté le service avec succès. tandis que j'utilise les mêmes processus pour la machine Windows 7 32 bits, il n'ajoute pas de service.
Shakthi
59

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

J'ai maintenant mon service fonctionnant 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 les binaires Apache Commons Daemon (vous aurez besoin de prunsrv.exe et prunmgr.exe).
  2. Renommez-les pour être MyServiceName.exeet MyServiceNamew.exerespectivement.
  3. Téléchargez WinRun4J et utilisez le RCEDIT.exeprogramme qui l'accompagne pour modifier l'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. Installez maintenant 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. Maintenant, vous avez un service Windows de votre Jar qui fonctionnera avec votre propre icône et nom! Vous pouvez également lancer le fichier moniteur et il s'exécutera dans la barre d'état système avec votre propre icône et nom.

11101101b
la source
1
J'ai tout fait selon votre How to, mais cela ne change pas l'icône systray .. une idée pourquoi?
outofBounds
Désolé @outofBounds, je n'ai pas vu votre commentaire jusqu'à maintenant. Le programme RCEDIT.exe modifie l'icône de votre exécutable de service. Assurez-vous d'avoir un fichier .ico valide avec chaque taille correctement définie. Vous pouvez voir comment créer un fichier .ico approprié ici: stackoverflow.com/questions/4354617/…
11101101b
2
Juste pour que vous le sachiez, vous ne pouvez pas avoir d'espaces dans le nom du service.
11101101b
1
Oui @Shakthi, cela fonctionne bien sur Windows XP 32 et 64 bits, 7, 8, 8.1, Server 2003, 2008 et 2012.
11101101b
1
Oui, @Syamsoul Azrein, cela fonctionne très bien sur 10 et n'importe quelle édition de serveur.
11101101b
31

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

Giordano Maestro
la source
7
NSSM ROCKS! J'ai fait du wrapper même à partir de mon programme java. Facile, léger, fonctionne - 100 Ko de bonheur! Je vous remercie!
cynepnaxa
1
Tout exemple, comment utiliser NSSM Wrapper pour démarrer l'instance de l'application Java (j'utilise HelioSearch) en tant que service Windows en arrière-plan au démarrage du système?
Krunal
@GiordanoMaestro votre entrée de blog n'est plus accessible. Avez-vous un autre lien?
Matthieu
2
Comparé à Apache Commons Daemon, wrapper.tanukisoftware.org et yajsw, NSSM était de loin l'option la plus rapide et la plus simple pour transformer une simple application java en service Windows
Jeffrey Knight
J'essaie d'utiliser NSSM pour exécuter mon fichier exécutable Spring Boot. J'ai reçu cette erreur "Statut inattendu SERVICE_PAUSED en réponse au contrôle START".
Kiran Kumar
26

Une autre option est WinRun4J . Il s'agit d'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 aucune restriction quant à son utilisation.

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

Peter Smith
la source
3
Merci pour cela. J'ai essayé YAJWS et d'abord cela m'a fait peur avec le téléchargement de 19 Mo, et après avoir suivi les instructions, il a montré "erreur de commande en ligne de commande". J'ai regardé PROCRUN et c'est tout simplement trop lourd pour une configuration rapide. INSTSRV / SRVANY nécessite des modifications de registre! Launch4J intègre un JAR dans un EXE, ce qui complique les déploiements. WinRun4J était un ajustement parfait. Le seul inconvénient est qu'il nécessite une classe spéciale pour fonctionner comme un service (au lieu d'appeler simplement la classe principale standard). Mais dans l'ensemble, c'est parfait à 99%.
fernacolo
2
Pour info, la dernière version a un wrapper pour une classe principale standard.
Peter Smith,
Salut, pouvez-vous donner un exemple qui explique comment l'utiliser? Je voudrais l'utiliser pour démarrer l'instance HelioSearch en tant que service Windows en arrière-plan au démarrage du système.
Krunal
17

Pourtant, une autre réponse est encore un autre Java Service Wrapper , cela semble être une bonne alternative à Java Service Wrapper car il a de meilleures licences. Il est également prévu de passer facilement de JSW à YAJSW. Certainement pour moi, tout nouveau sur les serveurs Windows et essayant de faire fonctionner une application Java en tant que service, c'était très facile à utiliser.

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

  • Lanceur de services Java Je ne l'ai pas utilisé car il semblait plus compliqué de fonctionner que YAJSW. Je ne pense pas que ce soit un emballage.
  • Les services de JSmooth Création de fenêtres ne sont pas son objectif principal, mais peuvent être réalisés . Je ne l'ai pas utilisé car il n'y a pas eu d'activité depuis 2007.
atomicules
la source
+1 de ma part car c'était la solution la plus rapide pour moi "prête à l'emploi" et aucune modification de l'application java n'était nécessaire, ce qui est un avantage certain.
Green Day
J'ai trouvé ce tableau de comparaison très convaincant qui comparait YAJSW avec quelques autres wrappers de service courants. yajsw.sourceforge.net/#mozTocId284533
Vert
6

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 mieux pour vous étant donné que vous ne voulez 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 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.

Ed Thomas
la source
5

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

Pour créer une application de service java windows avec le plugin, 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 build.gradlefichier.

    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 createWindowsService tâche createWindowsService 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écharge automatiquement les binaires Apache Commons Daemon Procrun, extrait ces binaires dans le répertoire de distribution du service et crée des fichiers de commandes pour l'installation / la désinstallation du service.

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

Notez que la méthode de gestion du démarrage du service doit créer et démarrer un thread distinct 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 le plugin et Apache Commons Daemon Procrun.

Alexey Lisyutenko
la source
Réponse sous-estimée!
TaylanUB
4

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

-native type Génère des bundles d'applications autonomes (si possible). Utilisez l'option -B pour fournir des arguments aux regroupeurs utilisés. Si le 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 fenêtres, reportez-vous au document suivant, nous pouvons créer msi ou exe au besoin.

exe: Generates a Windows .exe package.
msi: Generates a Windows Installer package.
Steephen
la source
4
Cette réponse ne répond pas à la question. Le javapackager ne peut pas être utilisé pour créer directement un service Windows, mais plutôt pour créer un exécutable autonome qui inclut par exemple le jre et d'autres ressources.
tobias_
3

c'est simple car il faut mettre un raccourci

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

Windows 10: en cours d'exécution shell:startup

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

REMARQUE: cela ne fonctionnera qu'après votre connexion


Avec droit d'administrateur

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

si vous obtenez délai l' utilisation , cmd /c D:\JAVA7~1\jdk1.7.0_51\bin\java.exe -jar d:\jenkins\jenkins.warmais même avec cela , vous obtiendrez délai d' attente mais dans java.exe d'arrière - plan seront mis en chantier. Archiver le gestionnaire de tâches

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

Explication détaillée de la création d'un service Windows

Ravi Parekh
la source
3

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

Exécuter le runtime .NET installé.

Thorbjørn Ravn Andersen
la source
Pendant ce temps, la version actuelle (maintenue par le célèbre Kohsuke Kawaguchi) se trouve ici .
FrVaBe
Il semble qu'il l'ait déplacé vers github après la version 1.9 (très probablement quand il est passé d'Oracle à Cloudbees).
Thorbjørn Ravn Andersen
2

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


la source
GForge n'est plus en ligne
lww
2

Je n'aimais pas la licence 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.

Hugh Buchanan
la source
Pouvez-vous fournir l'exemple de hack que vous avez fait avec "perl" ..!
peaceUser
2

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

Je n'ai rien fait de trop compliqué avec Java, mais l'utilisation d'un argument de ligne de commande complet (x: \ java.exe ....) ou la création d'un script avec Ant pour inclure les dépendances et définir les paramètres me convient parfaitement.

Kevin
la source
1
Cela vous permet de démarrer quelque chose en tant que service, mais à ma connaissance, il serait alors détaché, c'est-à-dire que vous ne pourriez pas l'arrêter via les services ou redémarrer automatiquement, etc.
atomicules
1

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

Andrew Swan
la source
1

J'exige actuellement 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 de commandes mais je n'ai besoin que d'un seul script de commandes pour être converti en service.

ciao!


la source
-1

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

RAM
la source