Método 1 - Integración usando WrapperSimpleApp (Windows)

Overview

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:

{WRAPPER_HOME}\bin\wrapper.exe
{WRAPPER_HOME}\src\bin\App.bat.in
{WRAPPER_HOME}\src\bin\InstallApp-NT.bat.in
{WRAPPER_HOME}\src\bin\UninstallApp-NT.bat.in

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

Ahora debería tener:

{MYAPP_HOME}\bin\helloworld.bat
{MYAPP_HOME}\bin\Install-helloworld.bat
{MYAPP_HOME}\bin\Uninstall-helloworld.bat

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:

{WRAPPER_HOME}\lib\wrapper.dll
{WRAPPER_HOME}\lib\wrapper.jar

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í:

{MYAPP_HOME}\lang\wrapper_XX.mo
{MYAPP_HOME}\lang\wrapperjni_XX.mo

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í:

java -classpath "d:\helloworld\lib\myjar.jar" -Xms128M -Xmx512M com.tanukisoftware.HelloWorld arg1 arg2

Modificación del Archivo wrapper.conf

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:

set.MYAPP_HOME=d:\helloworld
set.JAVA_HOME=C:\Program Files\Java\jdk1.8.0_45

Java Ejecutable

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.

wrapper.java.additional.1=-Xms128M
wrapper.java.additional.2=-Xmx512M

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):

wrapper.java.classpath.1=D:\apache-tomcat-9.0.0.M13\lib\wrapper.jar

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.

wrapper.java.classpath.1=%MYAPP_HOME%\lib\myjar.jar

Clase Principal

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

wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp

Parámetros de la Aplicación

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.

wrapper.app.parameter.1=com.tanukisoftware.HelloWorld
wrapper.app.parameter.2=arg1
wrapper.app.parameter.3=arg2

Ruta de la Librería

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ía wrapper.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

Propiedades de Servicios de Windows

(Consultar: Plataformas de Windows Compatibles con el Wrapper)

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.

Ejemplo: (habilitar espera)
wrapper.java.additional.10=-Dorg.tanukisoftware.wrapper.WrapperSimpleApp.waitForStartMain=TRUE

Propiedad del Sistema maxStartMainWait:

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:

El valor por defecto son "2 segundos".

Ejemplo: (300 segundos)
wrapper.java.additional.10=-Dorg.tanukisoftware.wrapper.WrapperSimpleApp.maxStartMainWait=300

NOTA

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.