El Método 1 hará uso de la clase helper WrapperSimpleApp para iniciar la aplicación.
Esta es la forma más fácil de integrar su aplicación con el Wrapper, y se recomienda usar esta opción siempre que posible.
Sin embargo, hay algunas cosas que hay que tener en cuenta usando este método.
Cuando el Wrapper apaga la JVM, no hay ninguna llamada directa a una aplicación solicitando que se apague limpiamente.
En otras palabras, el Wrapper terminará la JVM llamando a System.exit () desde la JVM.
Si la aplicación ha registrado su propio Shutdown Hook, este será invocado dándole una oportunidad a la aplicación para apagarse limpiamente.
Por otro lado, si el Shutdown Hook no está
registrado, la aplicación cerrará repentinamente como cuando se usa CTRL-C en la consola (ventana de comandos).
En ambos casos, al usar o no un Shutdown Hook, se genera el mismo
comportamiento como si la aplicación estuviera ejecutándose sin el Wrapper.
Cuando se integra con este Método 1, la clase helper
WrapperSimpleApp, reemplaza la clase principal de una aplicación.
Esto le da inmediatamente a la clase WrapperSimpleApp la oportunidad
de iniciar WrapperManager y registrar la JVM con el Wrapper.
La clase WrapperSimpleApp entonces administra toda la
interacción con el Wrapper, así como el ciclo de vida de una aplicación.
Cuando el Wrapper envía un mensaje de iniciar a la JVM por el WrapperManager, el método principal de la clase principal actual de la aplicación es llamada.
Se le ordena a la clase helper WrapperSimpleApp cómo iniciar la aplicación, pasando el nombre de la clase
principal de la aplicación, seguido de cualquier parámetro adicional al método principal de WrapperSimpleApp.
Instrucciones Detalladas
Esta sección le guiará a través de una explicación detallada sobre cómo configurar
una simple aplicación HelloWorld para ser ejecutada dentro del Wrapper.
La mayoría de otras aplicaciones se pueden integrar siguiendo los mismos pasos.
Aplicación HelloWorld
Este tutorial iniciará una aplicación simple HelloWorld que solamente imprime "Hello world".
La ruta para esta aplicación es d:\helloworld, que aquí será referenciada como {MYAPP_HOME}.
Algunas otras carpetas deben existir en las cuales se copiarán los archivos del Wrapper.
Instalar Archivos del Wrapper
Hay cuatro directorios que se deben configurar para poder utilizar el Wrapper.
Directorio bin
El primer paso es copiar los archivos al directorio bin de HelloWorld:
Cambie el nombre de los tres archivos batch para que el nombre de su aplicación sea de la siguiente manera.
Asegúrese de extraer las extensiones .in para que todos los archivos terminen en .bat.
(Dependiendo de cómo esté configurado el explorador de archivos en su computadora, puede ser posible que usted no pueda ver las extensiones del archivo.)
El archivo wrapper.exe es el Wrapper ejecutable.
Los tres archivos batch se utilizan para ejecutar HelloWorld en una consola,
y para instalar y desinstalar la aplicación como un Servicio de Windows.
Estos archivos batch no necesitan modificaciones.
asumen que el archivo wrapper.conf
será situado en el directorio conf (un nivel arriba ../conf/wrapper.conf).
Si desea colocar el archivo wrapper.conf
en otro lugar, los tres archivos batch necesitarán modificaciones apropiadas.
Se asume que el archivo wrapper.conf será ubicado dentro de un directorio conf un nivel arriba, ../conf/wrapper.conf.
Si desea colocar el archivo wrapper.conf en otro lugar, los tres archivos batch requerirán una modificación apropiada.
Directorio lib
Copie la librería nativa y el archivo jar del Wrapper en el directorio lib de HelloWorld:
El archivo wrapper.dll es un archivo de librería nativa requerido por la porción del Wrapper ejecutado desde la JVM.
El archivo wrapper.jar contiene todas las clases del Wrapper.
Directorio conf
Todas las configuraciones del Wrapper se hacen en
wrapper.conf.
La ubicación estándar para este archivo es en un conf directorio que se encuantra en el directorio HOME de cada aplicación.
Copie el siguiente archivo de plantilla wrapper.conf.in
en el directorio conf de HelloWorld.
{WRAPPER_HOME}\src\conf\wrapper.conf.in
Asegúrese de remover la extensión .in para que el archivo sea llamado wrapper.conf.
Usted debe tener ahora:
{MYAPP_HOME}\conf\wrapper.conf
Puede cambiar la ubicación del archivo de configuración wrapper.conf si lo desea.
Tendrá que modificar los archivos batch copiados al directorio anterior
bin directory para reflejar la nueva ubicación.
Directorio logs
Por defecto, el archivo de configuración wrapper.conf colocará un archivo
wrapper.log en un directorio logs en el directorio home de la aplicación.
Usted debe tener el siguiente directorio ahora:
{MYAPP_HOME}\logs
Si desea cambiar la ubicación del archivo wrapper.log, tendrá que editar el archivo wrapper.conf
y modificar la propiedad wrapper.logfile para reflejar la nueva ubicación.
Directorio lang
A partir de la versión Wrapper 3.5.0, el Wrapper puede ser localizado.
Los archivos de recursos de idioma
los puede encontrar en el directorio lang.
Si necesario, cree un directorio lang en el directorio home de la aplicación y copie los siguientes archivos ahí:
Si desea cambiar la ubicación de los archivos *.mo, tendrá que editar el archivo
wrapper.conf y modificar la propiedad
wrapper.lang.folder para reflejar la nueva ubicación.
Localizar la Línea de Comandos Java de la Aplicación
Antes de que el Wrapper pueda ser configurado para iniciar una aplicación,
es necesario saber los comandos completos de Java que normalmente se usan para iniciar la aplicación.
La mayoría de las aplicaciones hacen uso de un script para construir la línea de comandos.
Estos scripts suelen ser muy difíciles de manejar, pero en realidad la capacidad ofrecida para no tener que trabajar con ellos es uno de los beneficios de usar el Wrapper.
La mayor parte del script tiene la tarea de recopilar información específica del sistema y almacenar esa información en las variables de entorno y luego ejecutar el comando Java.
Para configurar el Wrapper, lo único que realmente se necesita es la línea de comandos Java final.
En el caso de una aplicación simple HelloWorld, no se necesita un script. El comando para iniciar se ve como:
java com.tanukisoftware.HelloWorld
Un comando más complejo para iniciar una aplicación Java se vería así:
Para usar la línea de comandos Java anterior con el Wrapper, tenemos que dividir
los componentes de la línea de comandos en un archivo de configuración.
Abra el archivo wrapper.conf
en un editor y hacer los cambios que se muestran a continuación.
NOTA
Donde se mencionan las propiedades, se proporcionan vínculos sobre sus descripciones.
Por favor, tome un momento para revisar las descripciones de cualquier propiedad que se modifica.
En muchos casos hay más detalles sobre su uso que a veces no son mencionados aquí.
Variable de Entorno:
Para facilitar la configuración, se recomienda guardar el directorio HOME
de HelloWorld y Java en una variable de entorno en el archivo de configuraciones.
Esto hará más fácil de leer el archivo conf
y mantenerlo en caso de que la ruta de algún directorio cambie.
Si se configura en el archivo de configuración, el Wrapper configurará las variables de entorno cada vez que inicie:
Primero es necesario extraer el Java ejecutable y asignar la ruta de ubicación a la
propiedad wrapper.java.command:
wrapper.java.command=%JAVA_HOME%\bin\java
Argumentos Java
La mayoría de las aplicaciones proporcionan una serie de parámetros al Java ejecutable cuando es iniciado.
El Wrapper ofrece propieddes especiales para configurar, como por ejemplo memoria, así como rutas de clases y librerías.
Estas se explican a continuación. Sin embargo, cualquier otro ajuste es configurado usando la serie de propiedades
wrapper.java.additional.<n>.
La aplicación HelloWorld cuenta con 2 argumentos adicionales Java.
La capacidad de memoria inicial y máxima de la JVM specificada por
-Xms128m (inicial) y -Xmx512m (máxima) puede también definirse usando las propiedades
wrapper.java.initmemory y
wrapper.java.maxmemory.
# Initial Java Heap Size (in MB)
wrapper.java.initmemory=128
# Maximum Java Heap Size (in MB)
wrapper.java.maxmemory=512
Note que la propiedad entera se ha copiado directamente desde la línea de comandos sin modificaciones.
Consulte la documentación de la propiedad sobre como manejar las propiedades que contienen espacios.
Archivo jar del Wrapper
El Wrapper requiere que su propiedad wrapper.jar sea especificada:
wrapper.jarfile=%MYAPP_HOME%\lib\wrapper.jar
ADVERTENCIA
La propiedad wrapper.jarfile se introdució en la versión 3.5.55 del Wrapper.
Si usa una versión más antigua del Wrapper, es necesario incluir wrapper.jar en la ruta de la clase (classpath):
Después, los índices de los siguientes elementos de classpath deben ajustarse para no repetir la propiedad wrapper.java.classpath.1.
Classpath
El siguiente paso es el classpath, que se configura usando las propiedades
wrapper.java.classpath.<n>.
El Wrapper requiere que el calsspath se divida en sus elementos individualmente.
Para establecer una comunicación entre HellowWorld y el Wrapper, es necesario usar la clase helper WrapperSimpleApp como la clase principal.
La clase principal ejecutada por Java al iniciar se especifica usando la propiedad wrapper.java.mainclass.
La clase principal de HelloWorld es entonces especificada como el primer parámetro de la aplicación (lea la sección siguiente).
Los parámetros de las aplicaciones son establecidos usando las propiedades
wrapper.app.parameter.<n>.
Dichos parámetros aparecen en la línea de comandos Java luego después de la clase principal.
Como se ha mencionado anteriormente, es necesario configurar el primer parámetro como la clase principal de HelloWorld. Todos los otros parámetros vienen después.
Se debe configurar una propiedad más para poder usar el Wrapper.
El Wrapper hace uso de una librería nativa para controlar las interacciones con el sistema.
Este archivo de libreríawrapper.dll
necesita ser especificado en la ruta de la librería que se envía a la JVM.
wrapper.java.library.path.1=%MYAPP_HOME%\lib
Ponerlo en Práctica
Poniendo todo junto, obtenemos lo siguiente:
set.MYAPP_HOME=d:\helloworld
set.JAVA_HOME=C:\Program Files\Java\jdk1.8.0_45
wrapper.java.command=%JAVA_HOME%\bin\java
# Java Main class.
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
# Wrapper Jar
wrapper.jarfile=%MYAPP_HOME%\lib\wrapper.jar
# Java Classpath
wrapper.java.classpath.1=%MYAPP_HOME%\lib\myjar.jar
# Java Library Path (location of Wrapper.DLL or libwrapper.so)
wrapper.java.library.path.1=%MYAPP_HOME%\lib
# Java Bits. On applicable platforms, tells the JVM to run in 32 or 64-bit mode.
wrapper.java.additional.auto_bits=TRUE
# Java Additional Parameters
# JVM settings
wrapper.java.additional.1=-Xms128M
wrapper.java.additional.2=-Xmx512M
# Initial Java Heap Size (in MB)
#wrapper.java.initmemory=128
# Maximum Java Heap Size (in MB)
#wrapper.java.maxmemory=512
# Application parameters. Add parameters as needed starting from 1
wrapper.app.parameter.1=com.tanukisoftware.HelloWorld
wrapper.app.parameter.2=arg1
wrapper.app.parameter.3=arg2
El paso final es configurar las Propiedades de Servicios de Windows
Solo configuraremos las propiedades que se deben modificar, pero hay otras más disponibles.
Consulte la documentación para obtener información sobre su uso.
Los valores sugeridos para estas variables se muestran a continuación.
wrapper.ntservice.name=HelloWorld
wrapper.ntservice.displayname=Hello World
wrapper.ntservice.description=Hello World
Probarlo
HelloWorld se puede iniciar simplemente ejecutando el archivo batch bin\helloworld.bat.
Debido a la manera en la que el Wrapper configura su directorio actual,
no es necesario ejecutar dicho archivo desde el directorio bin.
Por favor, intente ejecutar la aplicación una vez como una aplicación
de consola para verificar la configuración antes de ejecutarla como un servicio.
Felicitaciones. Su aplicación debe estar ahora en marcha y funcionando.
Si experimenta algún problema, consulte la siguiente sección
Solución de problemas para recibir ayuda y detectar el problema.
Nivel Avanzado
Preparando el Inicio
Por defecto, la clase WrapperSimpleApp
espera por 2 segundos al método principal de la aplicación del usuario para concluir su trabajo.
Después de eso, asume que la aplicación ha iniciado y reporta al proceso del Wrapper.
Esto se hace porque muchas aplicaciones de usuarios son escritas con métodos principales que no retornan en toda la vida de una aplicación.
En estos casos, no hay una manera eficaz para que la clase
WrapperSimpleApp informe si y/o cuando la aplicación a completado su inicio.
Sin embargo, si se sabe que el método principal de la aplicación retornará una vez que
se inicia la aplicación, sería ideal que el Wrapper espere antes de continuar.
Propiedad del Sistema waitForStartMain:
Para métodos principales que retornan de esta manera, la clase WrapperSimpleApp busca la propiedad del sistema
org.tanukisoftware.wrapper.WrapperSimpleApp.waitForStartMain.
Si dicha propiedad es configurada a TRUE, WrapperSimpleApp
esperará indefinidamente a que el método principal termine.
Esperar indefinidamente es una buena opción si se sabe a ciencia cierta que el método principal regresará a su debido tiempo.
Pero por otro lado, si se espera eternamente, el Wrapper no desistirá del proceso de inicio, no importa el tiempo que espere.
Por lo tanto, si hay alguna posibilidad de que este inicio pueda colgarse, entonces configurar la propiedad del sistema
org.tanukisoftware.wrapper.WrapperSimpleApp.maxStartMainWait con un tiempo máximo de espera puede ser una mejor opción.
Por ejemplo, para esperar hasta 5 minutos (300 segundos) para que el método principal
complete su inicio, configure la propiedad a 300 de la siguiente manera:
Los métodos principales de muchas aplicaciones están diseñadas para no retornar.
En estos casos, debe ser consistente con el tiempo de espera de inicio establecido
por defecto de 2 segundos o especificar un tiempo de espera ligeramente más largo.
Esto es posible usando la propiedad maxStartMainWait
para simular la cantidad de tiempo que su aplicación necesita para iniciar.
ADVERTENCIA
Si se especifica TRUE en waitForStartMain para una aplicación cuyo método de inicio
"start" nunca retorna, el Wrapper parecerá al principio estar funcionando correctamente.
Sin embargo, el Wrapper está realmente en un estado de espera eterno y nunca entrará en un estado de "ejecución".
Esto significa que el Administrador de Servicios de Windows (Windows Service Manager)
y varios de los mecanismos de recuperación de errores del Wrapper no funcionarán correctamente.