Comment créer un service windows à partir d'une application java

je viens d'hériter d'une application java qui doit être installée comme un service sur XP et vista. Cela fait environ 8 ans que je n'ai pas utilisé windows sous n'importe quelle forme et je n'ai jamais eu à créer un service, encore moins à partir de quelque chose comme une application java (j'ai un jar pour l'application et un jar - log4j de dépendance simple). Quelle est la magie nécessaire pour rendre ce service? J'ai la source, donc des modifications de code, bien que de préférence évitées, sont possibles.

198
demandé sur ideasculptor 2008-09-16 04:06:34

19 réponses

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

62
répondu 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! Pour obtenir le travail it est un peu délicat, mais il ya un article exhaustif avec un exemple de travail.

en outre, vous pouvez regarder bin\service.chauve-souris Apache Tomcat pour vous faire une idée de la façon de configurer le service. À 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 start et stop doivent accepter les paramètres (String[] argv). Par exemple "start(String[] argv)" et "stop(String[] argv)", mais "start()" et "stop()" provoquer des erreurs. Si vous ne pouvez pas modifier ces appels, envisager de faire une classe bootstrapper qui peut masser ces appels pour correspondre à vos besoins.

90
répondu mcdon 2012-09-12 01:52:31

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

j'ai maintenant mon service courant avec mon propre nom et icône (prunsrv.exe), et le moniteur de plateau de système (prunmgr.exe) a aussi mon propre nom personnalisé et icône!

  1. télécharger le le démon Apache Commons binaires (vous aurez besoin de prunsrv.exe et prunmgr.EXE.)
  2. les renomment respectivement MyServiceName.exe et MyServiceNamew.exe .
  3. Télécharger WinRun4J et d'utiliser le RCEDIT.exe programme qui vient avec elle à modifier l'Apache exécutable pour 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 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 moniteur et il s'exécutera dans le plateau de système avec votre propre icône et nom.

51
répondu 11101101b 2015-12-14 14:08:07

une autre option est WinRun4J . Il s'agit d'un lanceur java configurable qui se double d'un serveur windows (versions 32 et 64 bits). Il est open source et il n'y a pas de restrictions sur son utilisation.

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

23
répondu Peter Smith 2009-05-11 07:50:53

un moyen simple est le Nssm Wrapper Wrapper ( voir mon entrée de blog ).

19
répondu Giordano Maestro 2014-10-06 09:54:40

encore une autre réponse est encore un autre Java Service Wrapper , cela semble être une bonne alternative à Java Service Wrapper comme a une meilleure licence. Il est également destiné à être facile de se déplacer de JSW à YAJSW. Certainement pour moi, tout nouveau aux serveurs windows et essayer d'obtenir une application Java en cours d'exécution comme un service, il était très facile à utiliser.

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

  • Java Lanceur de Service Je ne l'ai pas utilisé parce qu'il semblait plus compliqué de travailler que YAJSW. Je ne pense pas que c'est un wrapper.
  • JSmooth la Création de la Fenêtre de services n'est pas son objectif principal, mais qui peut être fait . Je ne l'ai pas utilisé car il n'y a pas eu d'activité depuis 2007.
16
répondu atomicules 2010-09-02 11:02:18

je pense que le Java Service Wrapper fonctionne bien. Notez qu'il y a trois façons pour intégrer votre application. Il semble que l'option 1 fonctionnera 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 que (pour l'option 1) le programme que vous démarrez et pour lequel vous spécifiez des arguments, est leur programme helper, qui lancera alors votre programme. Ils ont un exemple de fichier de configuration pour cela.

6
répondu Ed Thomas 2008-09-16 15:13:06

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

4
répondu NT_ 2009-10-12 08:51:49

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

nécessite que .NET runtime soit installé.

3
répondu Thorbjørn Ravn Andersen 2017-11-17 21:30:32

j'ai utilisé JavaService avant de avec 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
répondu 2008-09-16 02:20:33

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

2
répondu Hugh Buchanan 2008-09-16 02:27:05

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 saveur de Vista, vous pouvez le télécharger charger avec le Vista resource kit.

Je n'ai rien fait de trop compliqué avec Java, mais en utilisant soit un argument en ligne de commande entièrement qualifié (x:\java.EXE. ...) ou créer un script avec Ant pour inclure des depences et définir des paramètres fonctionne très bien pour moi.

2
répondu 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
répondu pushNpop 2010-12-30 02:38:35

avec Java 8 nous pouvons gérer ce scénario sans aucun outil externe. javapackager l'outil venant avec java 8 fournit une option pour créer des paquets d'application autonomes:

- type native Générer des paquets d'applications autonomes (si possible). Utilisez l'option-b pour fournir des arguments aux groupeurs utilisés. Si le type est spécifié, alors qu'un paquet de ce type est créé. Si aucun type n'est spécifié, tout est utilisé.

les valeurs suivantes sont valables 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 se référer à doc nous pouvons créer msi ou exe si nécessaire.

exe: Generates a Windows .exe package.
msi: Generates a Windows Installer package.
2
répondu 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
répondu Andrew Swan 2008-09-16 06:40:59

Je l'exige actuellement pour exécuter une application basée sur Eclipse, mais je dois d'abord définir quelques variables locales à cette application. sc.exe n'autorise que les exécutables, mais pas les scripts, alors je me suis tournée vers autoexnt.exe qui fait partie du Windows 2003 resource kit . Il limite le service à un seul fichier batch, mais je n'ai besoin que d'un seul script batch pour être converti en service.

ciao!

1
répondu 2008-09-23 00:26:54

c'est simple comme vous devez mettre raccourci dans

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

Windows 10: Dans La Course shell:startup

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

NOTE: Ceci ne sera lancé qu'après que vous vous soyez connecté


Avec Droit Admin

sc create serviceName binpath= "java.exe -jar D:\..\runJar.jar" va créer le 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 java d'arrière-plan.exe sera lancé. Vérifiez dans le gestionnaire des tâches

NOTE: Ceci s'exécute au démarrage de windows (avant l'ouverture de session, basé sur le service' Startup Type ')

explication détaillée de la création du service windows

1
répondu Ravi Parekh 2017-05-23 10:31:31

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

pour créer une application java windows service avec le plugin, vous devez passer par plusieurs étapes simples.

  1. créer 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 script snippet pour nouveau, incubateur, 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écuter createWindowsService gradle tâche de créer un service windows de distribution.

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

dans le répertoire ${project.buildDir}/windows-service vous trouverez des exécutables de service, des scripts par lots pour l'installation/désinstallation du service et toutes les bibliothèques d'exécution. De installez le service exécuter <project-name>-install.bat et si vous voulez désinstaller le service exécuter <project-name>-uninstall.bat . Pour démarrer et arrêter le service, utilisez l'exécutable <project-name>w.exe .

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

pour plus d'informations, s'il vous plaît lire à propos du plugin et D'Apache Commons Daemon Procrun.

1
répondu Alexey Lisyutenko 2017-11-28 16:43:51

Exe4j est une très bonne option, même si elle n'est pas libre. Consultez le Exe4j dans l'assistant pour créer le .exe file, vous avez l'option de créer un service.

-1
répondu Ram 2013-12-17 07:06:26