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 unos 8 años desde que utilicé windows de cualquier forma y nunca tuve que crear un servicio, mucho menos desde algo así como una aplicación java (tengo un jar para la aplicación y un solo jar de dependencia – log4j ) ¿Cuál es la magia necesaria para que funcione como un servicio? Tengo la fuente, por lo que las modificaciones de código, aunque preferiblemente evitadas, son posibles.

He tenido algo de suerte con el Contenedor de servicios de Java

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

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

Algo que tuve problemas con el uso de 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ía, pero “start ()” y “stop ()” causarían errores. Si no puede modificar esas llamadas, considere hacer una clase de arranque que pueda dar masajes a esas llamadas para satisfacer sus necesidades.

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

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

  1. Descarga los binarios de Apache Commons Daemon (necesitarás prunsrv.exe y prunmgr.exe).
  2. MyServiceName.exe nombre para que sean MyServiceName.exe y MyServiceNamew.exe respectivamente.
  3. Descargue WinRun4J y use el progtwig RCEDIT.exe que viene con él para modificar el ejecutable de Apache e incrustar su propio icono personalizado de esta manera:

     > 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 de monitor y se ejecutará en la bandeja del sistema con su propio icono y nombre.

Una opción más es WinRun4J . Se trata de un iniciador Java configurable que funciona como un servidor de servicio de Windows (versiones de 32 y 64 bits). Es de código abierto y no hay restricciones sobre su uso.

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

Una forma sencilla es la envoltura de envoltura NSSM ( ver la entrada de mi blog ).

Aún otra respuesta es Yet Another Wrapper Wrapper de Java , 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í, nuevo en los servidores de Windows e intentando que una aplicación Java se ejecute como un servicio, fue muy fácil de usar.

Encontré algunos otros, pero no terminé usando:

  • Java Service Launcher No usé esto porque parecía más complicado trabajar que YAJSW. No creo que esto sea un envoltorio.
  • Los servicios de JSmooth Creating Window no son su objective principal, pero se pueden hacer . No usé esto porque no ha habido actividad desde 2007.

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 recuerde que (para la opción 1) el progtwig que está iniciando y para el cual especificará argumentos, es su progtwig auxiliar, que luego iniciará su progtwig. Tienen un archivo de configuración de ejemplo para esto.

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

Use ” winsw “, que fue escrito para Glassfish v3, pero funciona bien con los progtwigs de Java en general.

Requiere .NET runtime instalado.

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

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

Siempre uso sc.exe (vea http://support.microsoft.com/kb/251192 ). Debe instalarse en XP desde SP1, y si no está en su 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í.

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

Personalmente me gusta launch4j

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

-native type Genera paquetes de aplicaciones independientes (si es posible). Use la opción -B para proporcionar argumentos a los paquetes que se utilizan. Si se especifica type, 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 Windows, consulte el siguiente documento que podemos crear msi o exe según sea necesario.

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

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

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á 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 único archivo por lotes, pero solo necesito un script por lotes para convertirlo en un servicio.

ciao!

es simple ya que tienes que poner un atajo en

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

Windows 10: en shell:startup 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 el derecho de administrador

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

si obtienes tiempo de espera usa cmd /c D:\JAVA7~1\jdk1.7.0_51\bin\java.exe -jar d:\jenkins\jenkins.war pero incluso con esto obtendrás tiempo de espera pero en el fondo java.exe se iniciará Verificar en el administrador de tareas

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

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

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 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. Incluye el complemento en tu 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 plugin de 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 servicio de Windows.

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

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

Tenga en cuenta que el método que maneja el inicio del servicio debe crear e iniciar un hilo 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.

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