2009-10-24 78 views
42

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.Cómo crear un servicio de Windows desde java jar?

+1

¿No está en el registro también?Entonces, ¿por qué lo quieres como un servicio? –

+0

@ o.k.w es correcto si está creando un servicio de Windows, creará una entrada en el registro. –

+0

Creo que este usuario significaba "ejecutar como un servicio, no desde las claves de registro de inicio como un servicio no" –

Respuesta

6

Tanuki cambiado la licencia de jsw hace algún tiempo, si yo iba a comenzar un proyecto, usaría Sin embargo, otro de 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.

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

9

He estado experimentando con Apache Commons Daemon. Es compatible con Windows (Procrun) y Unix (Jsvc). Advanced Installer tiene un Java Service tutorial 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.

+0

Para un servicio de Windows [WinRun4j] (http://winrun4j.sourceforge.net/) también es un buen candidato. Puede funcionar como Java Launcher o Service Wrapper – mcdon

2

Con procrun tiene que copiar prunsrv al directorio de la aplicación (download), y crear una install.bat así:

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 que

  • plazo 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 (para ejemplo, con context.registerShutdownHook() en la primavera) ...
  • no usar rutas relativas para los archivos fuera de la jarra (por ejemplo log4j debe utilizarse con log4j.appender.X.File = $ {} app.home/logs /my.log o algo parecido)

Comprobar la procrun manual y this tutorial para más información.

+0

¿Hay algún ejemplo que pueda compartir? –

+0

sí: vea el de arriba :-) ¿qué más necesita? – BTakacs

+0

Gracias BTakacs, ya revisé tu tutorial y funcionó bien. Pero desafortunadamente eso no resolvió lo que yo quería hacer ... Estoy tratando de lograr eso ahora desde C#. –

36

La solución más fácil que encontré para esto hasta ahora es el uso Non-Sucking Service Manager

sería

nssm install <servicename> "C:\Program Files\Java\jre7\java.exe" "-jar <path-to-jar-file>" 
+7

Hice lo mismo y se instaló con éxito, pero tan pronto como lo ejecuto, dice 'estado inesperado SERVICE-PAUSED in respuesta al control START ' – aneela

+0

@kopernik, lo mismo que me pasa a mí ... cualquier ayuda por favor .. – Shakthi

+0

Este mismo problema como usted mencionó. ¿Alguna idea de lo que está mal? –

9

Uso nssm.exe pero recuerde que debe establecer el AppDirectory o cualquier biblioteca o recursos requeridos no serán accesibles . De forma predeterminada, nssm establece el directorio de trabajo actual en el de la aplicación, java.exe, no en el jar. Así hacer esto para crear un archivo por lotes:

pushd <path-to-jar> 
    nssm.exe install "<service-name>" "<path-to-java.exe>" "-jar <name-of-jar>" 
    nssm.exe set "<service-name>" AppDirectory "<path-to-jar>" 

Esto debería solucionar el servicio se detuvo tema.

+1

Esto es bueno ... Debe agregarlo como comentario a la respuesta de kopernik. –

+0

Establecer el AppDirectory después de la creación del servicio falló en mi caso. Pero puede iniciar una interfaz gráfica de usuario con 'nssm install ' y establecer AppDirectory, así como otros parámetros útiles, como archivos de registro allí y crear el servicio de una sola vez – JCvanDamme

Cuestiones relacionadas