233 votes

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 en tant que service sur XP et Vista. Cela fait environ 8 ans que je n'ai pas utilisé Windows sous quelque forme que ce soit et je n'ai jamais eu à créer un service, et 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 comme un service ? J'ai la source, donc les modifications de code, bien que préférablement évitées, sont possibles.

0 votes

Une autre suggestion stackoverflow.com/a/9262081/381897

1 votes

Juste pour être complet : ici serverfault.com/a/259195 il est dit que l'application doit répondre aux rappels du Service Control Manager. Lisez ce tutoriel qui utilise Procrun ticklingmind.blogspot.com/2010/03/

0 votes

107voto

mcdon Points 1690

Daemon Apache Commons est une bonne alternative. Il possède Procrun pour les services Windows, et Jsvc pour les démons Unix. Il utilise la licence Apache moins restrictive, et Apache Tomcat l'utilise comme une partie de lui-même pour fonctionner sous Windows et Linux ! Pour le faire fonctionner, c'est un peu délicat, mais il y a une méthode pour le faire fonctionner. article exhaustif avec un exemple concret.

En plus de cela, vous pouvez regarder la poubelle \service.bat sur Apache Tomcat pour avoir une idée de la façon de configurer le service. Dans Tomcat, on renomme les binaires Procrun (prunsrv.exe -> tomcat6.exe, prunmgr.exe -> tomcat6w.exe).

Une chose avec laquelle j'ai eu du mal en utilisant 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 les adapter à vos besoins.

0 votes

En utilisant la réflexion, vous pourriez probablement contourner le problème que vous avez énoncé dans votre dernier paragraphe. De plus, apache commons daemon est le seul wrapper que je connaisse qui a des binaires 64 bits pré-construits pour une utilisation libre.

1 votes

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 résoudre ce problème, vous devez écrire --JvmOptions=-Dopt=a#-Dopt2=b . J'exécutais la commande depuis un ant script et j'ai lutté pendant des jours à cause de cela. J'espère que cela vous aidera.

0 votes

L'article dont vous parlez n'existe plus... Avez-vous encore un moyen d'y accéder ? J'ai du mal à faire faire à Apache Commons Daemon ce dont j'ai besoin.

74voto

sblundy Points 27163

J'ai eu de la chance avec le wrapper de service Java

13 votes

Java Service Wrapper semble très utile. Mais j'ai jeté un coup d'oeil à la liste des fonctionnalités. Vous devrez juste être conscient que la version communautaire n'est pas licenciée pour une utilisation sur le serveur.

0 votes

Cela pourrait être un problème. C'était il y a quelques années que je l'ai utilisé. Je suppose qu'ils ont décidé de faire payer.

0 votes

Ce wrapper est utilisé par de nombreux projets open source, dont plusieurs sur Jakarta Apache, comme ActiveMQ.

64voto

11101101b Points 3343

Avec Daemon Apache Commons vous pouvez maintenant avoir un nom et une icône d'exécutable personnalisés ! Vous pouvez également obtenir un moniteur personnalisé dans la zone de notification de Windows, avec votre propre nom et votre propre icône !

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

  1. Télécharger le Binaires du démon Apache Commons (vous aurez besoin de prunsrv.exe et de prunmgr.exe).

  2. Renommez-les respectivement en MyServiceName.exe et MyServiceNamew.exe.

  3. Télécharger WinRun4J et utilisez le programme RCEDIT.exe qui l'accompagne pour modifier l'exécutable Apache afin d'y 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 suit (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 jarre 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.

1 votes

J'ai fait tout ce qui était indiqué dans votre guide, mais l'icône de la barre d'état système n'a pas été modifiée Savez-vous pourquoi ?

0 votes

Désolé @outofBounds, je n'ai pas vu votre commentaire jusqu'à maintenant. Le programme RCEDIT.exe est ce qui modifie l'icône de votre exécutable de service. Assurez-vous que vous avez un fichier .ico valide avec chaque taille correctement définie. Vous pouvez voir comment créer un fichier .ico correct ici : stackoverflow.com/questions/4354617/

2 votes

Pour votre information, vous ne pouvez pas avoir d'espaces dans le nom du service.

27voto

Peter Smith Points 513

Une autre option est WinRun4J . Il s'agit d'un lanceur java configurable qui fait office 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).

3 votes

Merci pour cela. J'ai essayé YAJWS et d'abord il m'a effrayé avec un téléchargement de 19mb, et après avoir suivi les instructions il a montré "error parsing command line". J'ai regardé PROCRUN et c'est juste trop lourd pour une installation rapide. INSTSRV / SRVANY nécessite des modifications du registre ! Launch4J emballe un JAR dans un EXE, ce qui complique les déploiements. WinRun4J était parfaitement adapté. 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, il est parfait à 99 %.

2 votes

Pour info, la dernière version a un wrapper pour une classe principale standard.

0 votes

Bonjour, Pouvez-vous donner un exemple qui explique comment l'utiliser ? Je voudrais l'utiliser pour lancer l'instance HelioSearch en tant que service Windows d'arrière-plan au démarrage du système.

18voto

atomicules Points 1065

Une autre réponse est Encore un autre wrapper de service Java Il semble que ce soit une bonne alternative à Java Service Wrapper, car il dispose d'une meilleure licence. Il est également prévu qu'il soit facile de passer de JSW à YAJSW. En tout cas, pour moi qui suis tout nouveau dans le monde des serveurs Windows et qui essaie de faire fonctionner une application Java en tant que service, il a été très facile à utiliser.

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

  • Lanceur de service Java Je ne l'ai pas utilisé car il me semblait plus compliqué de le faire fonctionner que YAJSW. Je ne pense pas que ce soit un wrapper.
  • JSmooth Créer les services de Window n'est pas son but premier, mais peut être fait . Je ne l'ai pas utilisé car il n'y a pas eu d'activité depuis 2007.

0 votes

+1 de ma part, car c'était la solution la plus rapide pour moi, et aucune modification de l'application Java n'a été nécessaire, ce qui est un avantage certain.

0 votes

J'ai trouvé ce tableau comparatif très convaincant qui compare YAJSW à quelques autres wrappers de services courants. yajsw.sourceforge.net/#mozTocId284533

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X