Cómo crear un servicio de Windows desde la aplicación Java

220

Acabo de heredar una aplicación de Java que debe instalarse como un servicio en XP y Vista. Han pasado aproximadamente 8 años desde que utilicé Windows de cualquier forma y nunca tuve que crear un servicio, y mucho menos de algo como una aplicación de Java (tengo un jar para la aplicación y un solo jar de dependencia - log4j ) ¿Cuál es la magia necesaria para que esto funcione como un servicio? Tengo la fuente, por lo que es posible realizar modificaciones en el código, aunque preferiblemente evitadas.

ideasculptor
fuente
Otra sugerencia stackoverflow.com/a/9262081/381897
bhdrkn
1
Solo para completar: aquí serverfault.com/a/259195 dice que la aplicación debe responder a las devoluciones de llamadas de Service Control Manager. Lea este tutorial que utiliza Procrun ticklingmind.blogspot.com/2010/03/…
Broken_Window
Otra respuesta stackoverflow.com/questions/5953525/…
Ravi Parekh

Respuestas:

69

He tenido suerte con el Java Service Wrapper

sblundy
fuente
11
Java Service Wrapper parece muy útil. Pero eché un vistazo a la lista de características. Solo deberá tener en cuenta que la versión comunitaria no tiene licencia para su uso en el servidor.
Brian Matthews
Eso podría ser un problema. Fue hace unos años que lo usé. Supongo que decidieron cobrar.
sblundy
Este contenedor lo utilizan muchos proyectos de código abierto, incluidos varios en Apache de Yakarta, como ActiveMQ.
Todd
77
wrapper.tanukisoftware.org/doc/english/licenseCommunity.html Uso de fuente cerrada La GPL no restringe el desarrollo de software privado para uso interno que depende del software bajo la GPL siempre y cuando ese software nunca se distribuya sin hacer la fuente completa de La aplicación completa está disponible para todos los usuarios. Si bien alentamos a los usuarios corporativos y gubernamentales a hacer uso de un Acuerdo de licencia de servidor o de desarrollo, el Acuerdo de licencia comunitaria es aceptable siempre que la aplicación sea para uso interno o siempre se distribuirá junto con su src completo.
Vladimir
1
El envoltorio @Vladimir tanuki ya no está abierto para el arco de 64 bits
gerrytan
100

Apache Commons Daemon es una buena alternativa. Tiene Procrun para servicios de Windows y Jsvc para demonios de Unix. Utiliza una licencia de Apache menos restrictiva, y Apache Tomcat la usa como parte de sí misma para ejecutarse en Windows y Linux. Conseguir que funcione es un poco complicado, pero hay un artículo exhaustivo con ejemplos de trabajo.

Además de eso, puede mirar el bin \ service.bat en Apache Tomcat para tener una idea de cómo configurar el servicio. En Tomcat cambian el nombre de los binarios de Procrun (prunsrv.exe -> tomcat6.exe, prunmgr.exe -> tomcat6w.exe).

Algo con lo que luché usando Procrun, sus métodos de inicio y detención deben aceptar los parámetros (String [] argv). Por ejemplo, "start (String [] argv)" y "stop (String [] argv)" funcionarían, pero "start ()" y "stop ()" causarían errores. Si no puede modificar esas llamadas, considere hacer una clase bootstrapper que pueda dar masajes a esas llamadas para satisfacer sus necesidades.

mcdon
fuente
Utilizando la reflexión, probablemente podrías evitar el problema que planteaste en tu último párrafo. Además, apache commons daemon es el único contenedor que conozco que tiene binarios pre-construidos de 64 bits para uso gratuito.
djangofan
Necesita un retorno de carro entre cada opción de JVM. Por ejemplo, si tiene en la misma línea -Dopt1 = a -Dopt2 = b, podría no funcionar. Para arreglarlo necesitas escribir --JvmOptions=-Dopt=a#-Dopt2=b. Estaba ejecutando el comando desde un script de hormigas y luché durante días por eso. Espero eso ayude.
Sydney
El artículo del que habló ya no existe ... ¿Todavía tiene una manera de llegar a él? Tengo problemas para que Apache Commons Daemon haga lo que necesito.
11101101b
3
@ 11101101b, apache parece haber unido las tripas del artículo a su propia página wiki ...
Lucas
@community wiki, utilicé Apache Commons Daemon para la máquina de Windows de 64 bits, agregó el servicio con éxito. mientras estoy usando los mismos procesos para la máquina con Windows 7 de 32 bits, no puede agregar el servicio.
Shakthi
59

¡Con Apache Commons Daemon ahora puede tener un nombre e icono ejecutable personalizado! ¡También puede obtener un monitor de bandeja de Windows personalizado con su propio nombre e icono!

¡Ahora tengo mi servicio ejecutándose con mi propio nombre e icono (prunsrv.exe), y el monitor de la bandeja del sistema (prunmgr.exe) también tiene mi propio nombre e icono personalizados!

  1. Descargue los binarios Apache Commons Daemon (necesitará prunsrv.exe y prunmgr.exe).
  2. Renombrarlos como ser MyServiceName.exey MyServiceNamew.exerespectivamente.
  3. Descargue WinRun4J y use el RCEDIT.exeprograma que viene con él para modificar el ejecutable de Apache para incrustar su propio icono personalizado como este:

    > RCEDIT.exe /I MyServiceName.exe customIcon.ico
    > RCEDIT.exe /I MyServiceNamew.exe customTrayIcon.ico
  4. Ahora instale su servicio de Windows de esta manera (consulte la documentación para obtener más detalles y opciones):

    > 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. ¡Ahora tiene un servicio de Windows de su Jar que se ejecutará con su propio icono y nombre! También puede iniciar el archivo del monitor y se ejecutará en la bandeja del sistema con su propio icono y nombre.

11101101b
fuente
1
Hice todo de acuerdo con su Cómo, pero no cambia el icono de la bandeja del sistema. ¿Alguna idea de por qué?
outofBounds
Lo siento @outofBounds, no vi tu comentario hasta ahora. El programa RCEDIT.exe es lo que modifica el icono del ejecutable de su servicio. Asegúrese de tener un archivo .ico válido con cada tamaño correctamente definido. Puede ver cómo crear un archivo .ico adecuado aquí: stackoverflow.com/questions/4354617/…
11101101b
2
Para que lo sepas, no puedes tener espacios en el nombre del servicio.
11101101b
1
Sí @Shakthi funciona bien en Windows XP de 32 y 64 bits, 7, 8, 8.1, Servidor 2003, 2008 y 2012.
11101101b
1
Sí, @Syamsoul Azrein, funciona muy bien en 10 y en cualquier edición de servidor.
11101101b
31

Una manera simple es el NSSM Wrapper Wrapper ( ver mi entrada de blog ).

Giordano Maestro
fuente
77
ROCAS NSSM! Fácil hace wrapper incluso desde mi programa java. Fácil, liviano, funciona: ¡100 kb de felicidad! ¡Gracias!
cynepnaxa
1
¿Algún ejemplo, cómo usar NSSM Wrapper para iniciar la instancia de la aplicación Java (estoy usando HelioSearch) como un servicio de Windows en segundo plano en el inicio del sistema?
Krunal
@GiordanoMaestro ya no se puede acceder a tu entrada de blog. ¿Tienes otro enlace?
Matthieu
2
Comparado en Apache Commons Daemon, wrapper.tanukisoftware.org, y yajsw, NSSM fue, con mucho, la opción más rápida y fácil para convertir una aplicación simple de Java en un servicio de Windows
Jeffrey Knight
Estoy tratando de usar NSSM para ejecutar mi jar ejecutable de arranque de primavera. Recibí este error, "Estado inesperado SERVICE_PAUSED en respuesta al control START".
Kiran Kumar
26

Una opción más es WinRun4J . Este es un lanzador de Java configurable que también funciona como host de servicio de Windows (versiones de 32 y 64 bits). Es de código abierto y no hay restricciones para su uso.

(divulgación completa: trabajo en este proyecto).

Peter Smith
fuente
3
Gracias por esto. Probé YAJWS y primero me asustó con la descarga de 19 MB, y después de seguir las instrucciones, mostró "línea de comando de análisis de error". He visto PROCRUN y es demasiado engorroso para una configuración rápida. ¡INSTSRV / SRVANY requiere cambios en el registro! Launch4J incluye un JAR dentro de un EXE, por lo que complica las implementaciones. WinRun4J fue un ajuste perfecto. El único inconveniente es que requiere una clase especial para trabajar como servicio (en lugar de simplemente llamar a la clase principal estándar). Pero en general es 99% perfecto.
fernacolo
2
Para su información, la última versión tiene un contenedor para una clase principal estándar.
Peter Smith
Hola, ¿Puedes dar algún ejemplo que explique cómo usar esto? Me gustaría usarlo para iniciar la instancia de HelioSearch como un servicio de Windows en segundo plano al iniciar el sistema.
Krunal
17

Otra respuesta es Yet Another Java Service Wrapper , esta parece una buena alternativa a Java Service Wrapper, ya que tiene mejores licencias. También se pretende que sea fácil pasar de JSW a YAJSW. Ciertamente para mí, completamente nuevo para los servidores de Windows e intentando que una aplicación Java se ejecutara como un servicio, fue muy fácil de usar.

Algunos otros que encontré, pero no terminé usando:

  • Java Service Launcher No utilicé esto porque parecía más complicado trabajar que YAJSW. No creo que esto sea una envoltura.
  • Los servicios de JSmooth Created Window no son su objetivo principal, pero se pueden hacer . No usé esto porque no ha habido actividad desde 2007.
atomicules
fuente
+1 de mi parte ya que esta fue la solución más rápida para mí "fuera de la caja" y no se requirió ninguna modificación de la aplicación de Java, que es una ventaja definitiva.
Día Verde
Encontré este cuadro de comparación muy convincente que comparó YAJSW con algunos otros contenedores de servicios comunes. yajsw.sourceforge.net/#mozTocId284533
Verde
6

Creo que Java Service Wrapper funciona bien. Tenga en cuenta que hay tres formas de integrar su aplicación. Parece que la opción 1 funcionará mejor para usted dado que no desea cambiar el código. El archivo de configuración puede volverse un poco loco, pero solo recuerde que (para la opción 1) el programa que está iniciando y para el cual especificará argumentos, es su programa auxiliar, que luego iniciará su programa. Tienen un archivo de configuración de ejemplo para esto.

Ed Thomas
fuente
5

Si utiliza Gradle Build Tool, puede probar mi complemento de servicio de Windows , que facilita el uso de Apache Commons Daemon Procrun .

Para crear una aplicación de servicio de Windows Java con el complemento, debe seguir varios pasos simples.

  1. Cree una clase de servicio principal con el método apropiado.

    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. Incluya el complemento en su build.gradlearchivo.

    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"

    El mismo fragmento de script para el nuevo mecanismo de plugin incubación introducido en Gradle 2.1:

    plugins {
      id "com.github.alexeylisyutenko.windows-service-plugin" version "1.1.0"
    }
  3. Configura el complemento.

    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. Ejecute la tarea gradle createWindowsService para crear una distribución de servicios de Windows.

Eso es todo lo que necesita hacer para crear un servicio simple de Windows. El complemento descargará automáticamente los archivos binarios Apache Commons Daemon Procrun, extraerá estos archivos binarios en el directorio de distribución del servicio y creará archivos por lotes para la instalación / desinstalación del servicio.

En el ${project.buildDir}/windows-servicedirectorio encontrará ejecutables del servicio, scripts por lotes para la instalación / desinstalación del servicio y todas las bibliotecas de tiempo de ejecución. Para instalar el servicio, ejecute <project-name>-install.baty si desea desinstalarlo, ejecute el servicio <project-name>-uninstall.bat. Para iniciar y detener el servicio, use el <project-name>w.exeejecutable.

Tenga en cuenta que el inicio del servicio de manejo de métodos debe crear e iniciar un subproceso separado para llevar a cabo el procesamiento, y luego regresar. El método principal se llama desde diferentes subprocesos cuando inicia y detiene el servicio.

Para obtener más información, lea sobre el complemento y Apache Commons Daemon Procrun.

Alexey Lisyutenko
fuente
Respuesta subestimada!
TaylanUB
4

JavaService es LGPL. Es muy fácil y estable. Muy recomendable.

NUEVO TESTAMENTO_
fuente
4

Con Java 8 podemos manejar este escenario sin ninguna herramienta externa. La herramienta javapackager que viene con java 8 proporciona una opción para crear paquetes de aplicaciones independientes:

-native type Genera paquetes de aplicaciones autónomas (si es posible). Use la opción -B para proporcionar argumentos a los paquetes que se utilizan. Si se especifica el tipo, solo se crea un paquete de este tipo. Si no se especifica ningún tipo, se usa todo.

Los siguientes valores son válidos para el tipo:

-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.

En el caso de que Windows consulte el siguiente documento , podemos crear msi o exe según sea necesario.

exe: Generates a Windows .exe package.
msi: Generates a Windows Installer package.
Steephen
fuente
44
Esta respuesta no aborda la pregunta. El javapackager no se puede usar para crear un servicio de Windows directamente, sino crear un ejecutable autónomo que, por ejemplo, incluya el jre y otros recursos.
tobias_
3

es simple ya que tienes que poner acceso directo en

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

Windows 10: en ejecución shell:startup

en su propiedad -> acceso directo -> destino -> java.exe -jar D:\..\runJar.jar

NOTA: Esto se ejecutará solo después de iniciar sesión


Con derecho de administrador

sc create serviceName binpath= "java.exe -jar D:\..\runJar.jar" Creará el servicio de Windows

si le da tiempo de espera de su uso cmd /c D:\JAVA7~1\jdk1.7.0_51\bin\java.exe -jar d:\jenkins\jenkins.war, pero incluso con este obtendrá se iniciarán tiempo de espera, pero en el fondo java.exe. Registrarse en el administrador de tareas

NOTA: Esto se ejecutará al inicio del inicio de sesión de Windows (antes del inicio de sesión, según el servicio ' Startup Type')

Explicación detallada de la creación del servicio de Windows.

Ravi Parekh
fuente
3

Utilice " winsw ", que fue escrito para Glassfish v3 pero funciona bien con los programas Java en general.

Requiere .NET runtime instalado.

Thorbjørn Ravn Andersen
fuente
Mientras tanto, la versión actual (mantenida por el conocido Kohsuke Kawaguchi) se encuentra aquí .
FrVaBe
Parece que lo movió a Github después de la versión 1.9 (muy probablemente cuando pasó de Oracle a Cloudbees).
Thorbjørn Ravn Andersen
2

He usado JavaService antes con buen éxito. No se ha actualizado en un par de años, pero era bastante sólido cuando lo usé.


fuente
GForge ha sido descontinuado
lww
2

No me gustó la licencia del Java Service Wrapper. Fui con ActiveState Perl para escribir un servicio que hace el trabajo.

Pensé en escribir un servicio en C #, pero mis limitaciones de tiempo eran demasiado estrictas.

Hugh Buchanan
fuente
¿Puede proporcionar el hack de muestra que ha hecho con "perl" ...!
peaceUser
2

Siempre uso sc.exe (consulte http://support.microsoft.com/kb/251192 ). Debe instalarse en XP desde SP1, y si no tiene el sabor de Vista, puede descargarlo con el kit de recursos de Vista.

No he hecho nada demasiado complicado con Java, pero usar un argumento de línea de comando totalmente calificado (x: \ java.exe ...) o crear un script con Ant para incluir dependencias y establecer parámetros funciona bien para mí.

Kevin
fuente
1
Eso le permite iniciar algo como un servicio, pero según tengo entendido, luego se desconectaría, es decir, no podría detenerlo a través de Servicios o reiniciar automáticamente, etc. Sin embargo, podría estar completamente equivocado, solo comencé a investigar esto.
atomicules
1

Otra buena opción es FireDaemon . Lo utilizan algunas grandes tiendas como la NASA, IBM, etc. ver su sitio web para obtener una lista completa.

Andrew Swan
fuente
1

Actualmente estoy requiriendo que esto ejecute una aplicación basada en Eclipse, pero primero necesito establecer algunas variables que sean locales para esa aplicación. sc.exe solo permitirá archivos ejecutables pero no scripts, así que recurrí a autoexnt.exe, que es parte del kit de recursos de Windows 2003 . Restringe el servicio a un solo archivo por lotes, pero solo necesito un script por lotes para convertirlo en un servicio.

chao!


fuente
-1

Exe4j es una muy buena opción, aunque no es gratuita. Compruébalo en Exe4j En el asistente para crear el archivo .exe, tiene la opción de crear un servicio.

RAM
fuente