it-swarm-es.tech

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

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

206
ideasculptor

He tenido algo de suerte con el Java Service Wrapper

65
sblundy

Apache Commons Daemon es una buena alternativa. Tiene Procrun para los servicios de Windows y Jsvc para los daemons de Unix. Utiliza una licencia de Apache menos restrictiva, y Apache Tomcat la usa como una parte de sí misma para ejecutarse en Windows y Linux. Para que funcione es un poco complicado, pero hay un artículo exhaustivo con un ejemplo 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 por lo que me costó usar Procrun, tus métodos de inicio y parada deben aceptar los parámetros (String [] argv). Por ejemplo, "start (String [] argv)" y "stop (String [] argv)" funcionarán, pero "start ()" y "stop ()" causarán errores. Si no puede modificar esas llamadas, considere hacer una clase de bootstrapper que pueda masajear esas llamadas para satisfacer sus necesidades.

94
mcdon

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

Ahora tengo mi servicio funcionando 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 archivos binarios de Apache Commons Daemon (necesitará prunsrv.exe y prunmgr.exe).
  2. Cámbieles el nombre para que sean MyServiceName.exe y MyServiceNamew.exe respectivamente.
  3. Descargue WinRun4J y use el programa RCEDIT.exe 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 (vea documentación para 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 tienes un servicio de Windows de tu Jar que se ejecutará con tu 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.

53
11101101b

Una opción más es WinRun4J . Este es un iniciador de Java configurable que se duplica como un Host de servicio de Windows (versiones de 32 y 64 bits). Es de código abierto y no hay restricciones en su uso.

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

25
Peter Smith

Una forma sencilla es el NSSM Wrapper Wrapper ( ver mi entrada de blog ).

25
Giordano Maestro

Otra respuesta más es Sin embargo, otro Java Service Wrapper , esta parece ser 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í, la nueva versión de los servidores de Windows y el hecho de intentar ejecutar una aplicación Java como un servicio fue muy fácil de usar.

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

  • Lanzador de servicios de Java No usé esto porque parecía más complicado para trabajar que YAJSW. No creo que esto sea una envoltura.
  • JSmooth Crear los servicios de Window no es su objetivo principal, pero se puede hacer . No utilicé esto porque no ha habido actividad desde 2007.
17
atomicules

Creo que el Java Service Wrapper funciona bien. Tenga en cuenta que hay tres formas para 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 que especificará argumentos, es su programa auxiliar, que luego iniciará su programa. Tienen un archivo de configuración de ejemplo para esto.

6
Ed Thomas

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

4
NT_

Con Java 8 podemos manejar este escenario sin herramientas externas. javapackager tool que viene con Java 8 ofrece una opción para crear paquetes de aplicaciones independientes:

-nativo tipo Generar paquetes de aplicaciones independientes (si es posible). Utilice la opción -B para proporcionar argumentos a los proveedores que se utilizan. Si se especifica el tipo, solo se creará 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 ventanas, consulte el siguiente doc podemos crear msi o exe según sea necesario.

exe: Generates a Windows .exe package.
msi: Generates a Windows Installer package.
4
Steephen

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

Requerir .NET tiempo de ejecución instalado.

Si usa Gradle Build Tool, puede probar mi windows-service-plugin , 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. Crear 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 archivo 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"
    

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

    plugins {
      id "com.github.alexeylisyutenko.windows-service-plugin" version "1.1.0"
    }
    
  3. Configurar 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 createWindowsService gradle para crear una distribución de servicio de Windows.

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

En el directorio ${project.buildDir}/windows-service encontrará los ejecutables del servicio, los scripts de proceso 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.bat y si desea desinstalar el servicio ejecute <project-name>-uninstall.bat. Para iniciar y detener el servicio use <project-name>w.exe ejecutable.

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.

3

No me gustó la licencia para el 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 ajustadas.

2
Hugh Buchanan

Siempre uso sc.exe (consulte http://support.Microsoft.com/kb/251192 ). Debe instalarse en XP desde SP1, y si no está en su versión de Vista, puede descargarlo y cargarlo con el kit de recursos de Vista.

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

2
Kevin

es simple ya que tienes que poner atajo en

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

Windows 10: In Run 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á servicio de windows

si obtiene timeout use cmd /c D:\Java7~1\jdk1.7.0_51\bin\Java.exe -jar d:\jenkins\jenkins.war pero incluso con esto obtendrá timeout pero en segundo plano se iniciará Java.exe. Comprobar en administrador de tareas

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

Explicación detallada de la creación de servicio de windows

2
Ravi Parekh

Una comparación bastante buena de diferentes soluciones está disponible en: http://yajsw.sourceforge.net/#mozTocId284533

Personalmente como launch4j

2
pushNpop

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

2
Jason

Actualmente estoy solicitando esto para ejecutar una aplicación basada en Eclipse, pero primero debo establecer algunas variables que sean locales para esa aplicación. sc.exe solo permitirá ejecutables pero no scripts, por lo que recurrí a autoexnt.exe, que forma parte del Kit de recursos de Windows 2003 . Restringe el servicio a un solo archivo por lotes, pero solo necesito que una secuencia de comandos por lotes se convierta en un servicio.

¡ciao!

1
ramfree17

Otra buena opción es FireDaemon . Es utilizado por algunas grandes tiendas como la NASA, IBM, etc; ver su sitio web para una lista completa.

1
Andrew Swan