¿Cómo crear un servicio de Windows desde java jar?

Tengo un archivo JAR ejecutable. ¿Es posible crear un servicio de Windows de ese JAR? En realidad, solo quiero ejecutar eso al inicio, pero no quiero colocar ese archivo JAR en mi carpeta de inicio, ni en el registro.

Este artículo debería decirle todo lo que necesita saber: “Ejecución de aplicaciones Java como un servicio de Windows” ; menciona el uso de ” Java Service Wrapper ” (hay una edición de comunidad llamada YAJSW )

La solución más fácil que encontré para esto hasta ahora es el administrador de servicios sin succión

El uso sería

nssm install  "C:\Program Files\Java\jre7\java.exe" "-jar " 

Use nssm.exe, pero recuerde configurar AppDirectory o no se podrá acceder a ninguna de las bibliotecas o recursos necesarios. De forma predeterminada, nssm establece el directorio de trabajo actual en el de la aplicación, java.exe, no en el jar. Así que haz esto para crear un script por lotes:

  pushd  nssm.exe install "" "" "-jar " nssm.exe set "" AppDirectory "" 

Esto debería solucionar el problema del servicio en pausa.

He estado experimentando con Apache Commons Daemon . Es compatible con Windows ( Procrun ) y Unix ( Jsvc ). Advanced Installer tiene un tutorial de Java Service con un proyecto de ejemplo para descargar. Si obtiene su javaservice.jar ejecutándose como un servicio de Windows, puede probarlo usando “telnet 4444”. Usé su ejemplo porque mi atención estaba puesta en ejecutar un servicio de Windows, no escribiendo Java.

Tanuki cambió la licencia de jsw hace un tiempo, si tuviera que comenzar un proyecto, usaría Yet Another Java Service Wrapper, http://yajsw.sourceforge.net/ que es más o menos una implementación de código abierto que imita a JWS, y luego se basa en él y lo mejora aún más.

EDITAR: He estado usando YAJSW durante varios años en varios platorms (Windows, varios linux …) y es genial, el desarrollo está en curso.

Con procrun necesita copiar prunsrv al directorio de la aplicación ( descargar ) y crear un archivo install.bat como este:

 set PR_PATH=%CD% SET PR_SERVICE_NAME=MyService SET PR_JAR=MyService.jar SET START_CLASS=org.my.Main SET START_METHOD=main SET STOP_CLASS=java.lang.System SET STOP_METHOD=exit rem ; separated values SET STOP_PARAMS=0 rem ; separated values SET JVM_OPTIONS=-Dapp.home=%PR_PATH% prunsrv.exe //IS//%PR_SERVICE_NAME% --Install="%PR_PATH%\prunsrv.exe" --Jvm=auto --Startup=auto --StartMode=jvm --StartClass=%START_CLASS% --StartMethod=%START_METHOD% --StopMode=jvm --StopClass=%STOP_CLASS% --StopMethod=%STOP_METHOD% ++StopParams=%STOP_PARAMS% --Classpath="%PR_PATH%\%PR_JAR%" --DisplayName="%PR_SERVICE_NAME%" ++JvmOptions=%JVM_OPTIONS% 

Supongo

  • ejecutar esto desde el mismo directorio donde el jar y prunsrv.exe es
  • el jar tiene su MANIFEST.MF de trabajo
  • y tiene los ganchos de apagado registrados en JVM (por ejemplo, con context.registerShutdownHook () en Spring) …
  • no usar rutas relativas para archivos fuera del contenedor (por ejemplo, log4j se debe usar con log4j.appender.X.File = $ {app.home} /logs/my.log o algo similar)

Consulte el manual procrun y este tutorial para obtener más información.

Utilizamos el Contenedor de servicio Tanuki para eso. Es muy configurable.

Otra opción es winsw: https://github.com/kohsuke/winsw/

Configure un archivo xml para especificar el nombre del servicio, qué ejecutar, cualquier argumento, etc. Y use el exe para instalar. Ejemplo xml: https://github.com/kohsuke/winsw/tree/master/examples

Prefiero esto a nssm, porque es un exe liviano; y config xml es fácil de compartir / comprometerse con el código fuente.

PD: el servicio se instala ejecutando your-service.exe install