Método 4 - Integración usando WrapperJarApp (Linux / UNIX)

Descripción

El cuarto y último método es usar la clase helper WrapperJarApp para iniciar la aplicación. Esta es otra manera fácil de integrar el Wrapper, cuando la aplicación ya está configurada para ejecutarse como un archivo ejecutable (jar).

Sin embargo, hay algunas cosas que se deben tener en cuenta cuando se utiliza este método. Cuando el Wrapper apaga la máquina JVM, no hay ninguna notificación directa a la aplicación solicitando que la terminación se lleve acabo limpiamente. En otras palabras, el Wrapper apagará la máquina JVM invocando System.exit () desde la máquina JVM. Si la aplicación ha registrado su propio Shutdown Hook, este será invocado, dándole a la aplicación una oportunidad que se apague limpiamente. Por otro lado si, el Shutdown Hook no está registrado, la aplicación se cerrará repentinamente de la misma manera como cuando utiliza CTRL-C desde la consola (ventana de comandos). En ambos casos, con o sin Shutdown Hook, se generará el mismo comportamiento, es decir como si la aplicación se ejecutara sin el Wrapper.

Cuando la integración se realiza con el Método 4 (clase helper WrapperJarApp), la clase WrapperJarApp sustituye a la clase principal de la aplicación. Esto le dá la oportunidad a la clase WrapperJarApp de inmediatamente iniciar el WrapperManager y registrar la máquina JVM con el Wrapper. La clase WrapperJarApp 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 máquina JVM a través del WrapperManager, el manifiesto de jar es inspeccionado y su clase principal configurada es invocada. La clase WrapperJarApp crea un nuevo cargador de clases que es capaz de cargar las clases desde el archivo ejecutable jar, así como otros archivos jar que estén referenciados dentro de su archivo de manifiesto.

Se le ordena a la clase helper WrapperJarApp cómo iniciar la aplicación al pasar la ubicación absoluta o relativa del archivo ejecutable jar seguido de cualquier tipo de parámetros adicionales de la aplicación, al método principal de WrapperJarApp.

Instrucciones Detalladas

Esta sección le guiará a través de una explicación detallada de cómo configurar a JBoss para funcionar desde el interior del Wrapper. La mayoría de las otras aplicaciones desplegadas como ejecutables jars puede ser integrada siguiendo los mismos pasos.

Instalar JBoss EAP

Este tutorial inicia con una instalación limpia de JBoss EAP. En esta ocasión usamos JBoss EAP 7.0.0, por lo que los pasos exactos pueden ser ligeramente diferentes dependiendo de la versión que se tenga instalada. Después de descargar a JBoss, extraiga los archivos en un directorio. En este tutorial, utilizaremos la carpeta /usr/lib/jboss. Luego, cree las siguientes carpetas:

mkdir /usr/lib/jboss/lib
mkdir /usr/lib/jboss/conf
mkdir /usr/lib/jboss/logs

Instalar Archivos del Wrapper

Después de haber descargado al Wrapper, extraiga los archivos en una carpeta, que aquí será referenciada como {WRAPPER_HOME}. Hay cuatro directorios que se deben configurar para poder utilizar el Wrapper.

NOTA

Asegúrese de usar el Wrapper apropiado y los archivos libwrapper.so construidos para la plataforma usada. Parece obvio, pero la versión Linux del Wrapper no funcionará en Solaris, por ejemplo.

Directorio bin

El Wrapper incluye un script de shell (sh), que se puede utilizar para iniciar y detener de forma confiable cualquier aplicación Java controlada por el Java Service Wrapper.

El primer paso es copiar el archivo siguiente en el directorio bin de JBoss (en versiones anteriores del Wrapper, este archivo se llamaba 'sh.script.in'):

{WRAPPER_HOME}/bin/wrapper
{WRAPPER_HOME}/src/bin/App.sh.in

Cambie el nombre del archivo de script para reflejar el nombre de la aplicación.

{JBOSS_HOME}/bin/myJBoss

Ahora abra el script en un editor. Necesitamos configurar los nombres largos y cortos para reflejar que el sript está siendo utilizado para iniciar JBoss. Verá dos grupos de variables inmediatamente después del encabezado deel script. APP_NAME y APP_LONG_NAME. Algunos valores para estas variables que pueden usarse son presentados a continuación.

APP_NAME="jboss"
APP_LONG_NAME="JBoss EAP"

El script no requiere ninguna modificación adicional. Sin embargo, dicho script asumirá que el archivo wrapper.conf será localizado dentro del directorio conf (un nivel arriba, ../conf/wrapper.conf). Si desea colocar el archivo wrapper.conf en otro lugar, la variable WRAPPER_CONF en el script necesitará que también se modifique apropiadamente.

NOTA

¡Importante! Antes de continuar, asegúrese de que todos los archivos copiados al directorio bin tienen su bit de ejecución configurado.

lib directory

Copie los dos archivos siguientes en el directorio lib de JBoss:

{WRAPPER_HOME}/lib/libwrapper.so
{WRAPPER_HOME}/lib/wrapper.jar

El archivo libwrapper.so es un archivo de librería nativa requerido por la porción del Wrapper que se ejecuta en la JVM. El archivo wrapper.jar contiene todas las clases del Wrapper.

NOTA

Note que la librería nativa sigue las convenciones de nombres ligeramente diferentes en algunas plataformas. Posibles nombres pueden incluir libwrapper.a, libwrapper.sl, libwrapper.so, y libwrapper.jnilib. En cualquier caso el archivo debe ser copidado sin cambiar la extensión.

Directorio conf

El Wrapper requiere de un archivo de configuraciones "wrapper.conf" para cada aplicación. La ubicación estándar para este archivo es en un directorio conf en el directorio principal (home) de la aplicación. Por favor copiar la siguiente plantilla del archivo wrapper.conf.in en el directorio conf de JBoss.

{WRAPPER_HOME}/src/conf/wrapper.conf.in

Modifique el nombre del archivo y asegúrese de remover la extensión .in para que el nombre del archivo sea wrapper.conf.

Usted debe tener ahora:

{JBOSS_HOME}/conf/wrapper.conf

Es posible cambiar la ubicación del archivo de configuración wrapper.conf si lo desea. Necesitará modificar el script que previamente copió en el directorio bin (arriba) para reflejar la nueva ubicación.

Directorio logs

El archivo de configuración por defecto wrapper.conf colocará un archivo wrapper.log en el directorio logs de JBoss.

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

Línea de Comandos Java

La línea de comandos Java de un ejecutable jar es muy simple. En el caso de JBoss, simplemente necesita ir al directorio de JBoss y ejecutar:

java -jar /usr/lib/jboss/jboss-modules.jar

Cualquier argumento se pasaría de la siguiente manera:

java -jar /usr/lib/jboss/jboss-modules.jar arg1 arg2 arg3

Modificación del Archivo "wrapper.conf"

Para usar la línea de comandos Java 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 haga los cambios abajo. In order to use the above Java command line with the Wrapper, we need to break up the command line's components into a configuration file.

NOTA

Donde se mencionan las propiedades, se proporcionan vínculos sobre sus descripciones. Tome un momento para revisar las descripciones de cualquier propiedad que sea modificada. En muchos casos hay más detalles sobre su uso que a veces no son mencionados aquí.

Java Ejecutable

Primero se necesita extraer el Java ejecutable y asignar la ubicación de la ruta a la propiedad wrapper.java.command:

wrapper.java.command=java

Archivo jar del Wrapper

El Wrapper requiere que su propiedad wrapper.jar sea especificada:

wrapper.jarfile=/usr/lib/jboss/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

Después sigue el classpath, que se configura usando las propiedades wrapper.java.classpath.<n>. En realidad Java no permite especificar un classpath cuando se ejecuta con el parámetro -jar, pero esta integración con el Wrapper funciona un poco diferente.

wrapper.java.classpath.1=/usr/lib/jboss/jboss-modules.jar

Clase Principal

Cuando se usa el Wrapper y la clase helper WrapperJarApp, Java no está ejecutando el jar directamente. Es necesario especificar la clase helper como la clase principal de la aplicación. Cuando la clase principal es ejecutada por Java, se especifica usando la propiedad wrapper.java.mainclass, como a continuación:

wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperJarApp

Parámetros de la Aplicación

Los parámetros de las aplicaciones son configurados usando las propiedades wrapper.app.parameter.<n>. En este caso, la línea de comandos para iniciar JBoss requiere algunos parámetros de aplicación. Es necesario notificar a la clase helper WrapperJarApp cual jar ejecutar. Esto se hace de la siguiente manera:

wrapper.app.parameter.1=/usr/lib/jboss/jboss-modules.jar
wrapper.app.parameter.2=-mp
wrapper.app.parameter.3=/usr/lib/jboss/modules
wrapper.app.parameter.4=-jaxpmodule
wrapper.app.parameter.5=javax.xml.jaxp-provider
wrapper.app.parameter.6=org.jboss.as.standalone
wrapper.app.parameter.7=-Djboss.home.dir=/usr/lib/jboss
wrapper.app.parameter.8=-Djboss.server.base.dir=/usr/lib/jboss/standalone

Parámetros Adicionales de Java

Los parámetros adicionales de Java se especifican usando las propiedades wrapper.java.additional.<n>. Algunos parámetros deben ser configurados para que JBss inicie correctamente.

wrapper.java.additional.1=-D"[Standalone]"
wrapper.java.additional.2=-server
wrapper.java.additional.3=-XX:+UseCompressedOops
wrapper.java.additional.4=-Xms1303M
wrapper.java.additional.5=-Xmx1303M
wrapper.java.additional.6=-Djava.net.preferIPv4Stack=true
wrapper.java.additional.7=-Djboss.modules.system.pkgs=org.jboss.byteman
wrapper.java.additional.8=-Djava.awt.headless=true
wrapper.java.additional.9=-Dorg.jboss.boot.log.file=/usr/lib/jboss/standalone/log/server.log
wrapper.java.additional.10=-Dlogging.configuration=file:/usr/lib/jboss/standalone/configuration/logging.properties
wrapper.java.additional.11=-Dorg.tanukisoftware.wrapper.WrapperManager.mbean=false
wrapper.java.additional.12=-Djava.util.logging.manager=org.jboss.logmanager.LogManager
wrapper.java.additional.13=-Dorg.jboss.logging.Logger.pluginClass=org.jboss.logging.logmanager.LoggerPluginImpl

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 interacciones con el sistema. Este archivo de librería libwrapper.so necesita ser especificado en la ruta de la librería suministrada a la JVM.

JBoss no tiene librerías nativas, pero si las tuviera, sería necesario especificar los directorios donde se ubicarían. La ruta de la librería es configurada usando las propiedades wrapper.java.library.path.<n>.

wrapper.java.library.path.1=/usr/lib/jboss/lib

Ponerlo en Práctica

Poniendo todo junto, obtenemos lo siguiente:

wrapper.java.command=java

wrapper.jarfile=/usr/lib/jboss/lib/wrapper.jar

wrapper.java.classpath.1=/usr/lib/jboss/jboss-modules.jar

wrapper.java.library.path.1=/usr/lib/jboss/lib

wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperJarApp

wrapper.java.additional.1=-D"[Standalone]"
wrapper.java.additional.2=-server
wrapper.java.additional.3=-XX:+UseCompressedOops
wrapper.java.additional.4=-Xms1303M
wrapper.java.additional.5=-Xmx1303M
wrapper.java.additional.6=-Djava.net.preferIPv4Stack=true
wrapper.java.additional.7=-Djboss.modules.system.pkgs=org.jboss.byteman
wrapper.java.additional.8=-Djava.awt.headless=true
wrapper.java.additional.9=-Dorg.jboss.boot.log.file=/usr/lib/jboss/standalone/log/server.log
wrapper.java.additional.10=-Dlogging.configuration=file:/usr/lib/jboss/standalone/configuration/logging.properties
wrapper.java.additional.11=-Dorg.tanukisoftware.wrapper.WrapperManager.mbean=false
wrapper.java.additional.12=-Djava.util.logging.manager=org.jboss.logmanager.LogManager
wrapper.java.additional.13=-Dorg.jboss.logging.Logger.pluginClass=org.jboss.logging.logmanager.LoggerPluginImpl

wrapper.app.parameter.1=/usr/lib/jboss/jboss-modules.jar
wrapper.app.parameter.2=-mp
wrapper.app.parameter.3=/usr/lib/jboss/modules
wrapper.app.parameter.4=-jaxpmodule
wrapper.app.parameter.5=javax.xml.jaxp-provider
wrapper.app.parameter.6=org.jboss.as.standalone
wrapper.app.parameter.7=-Djboss.home.dir=/usr/lib/jboss
wrapper.app.parameter.8=-Djboss.server.base.dir=/usr/lib/jboss/standalone

Note que aunque estas configuraciones funcionarán correctamente en nuestra máquina de test, depende altamente de la estructura del directorio y la plataforma. Al tomar ventaja que la secuencia de comandos del Wrapper siempre establece la ubicación del directorio de trabajo a la ubicación del archivo wrapper.exe y usando una sola variable de entorno, podemos modificar las propiedades anteriores para que sean completamente independientes:

set.JBOSS_HOME=/usr/lib/jboss

wrapper.java.command=%JAVA_HOME%/bin/java

wrapper.jarfile=../lib/wrapper.jar

wrapper.java.classpath.1=../jboss-modules.jar

wrapper.java.library.path.1=../lib

wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperJarApp

wrapper.java.additional.1=-D"[Standalone]"
wrapper.java.additional.2=-server
wrapper.java.additional.3=-XX:+UseCompressedOops
wrapper.java.additional.4=-Xms1303M
wrapper.java.additional.5=-Xmx1303M
wrapper.java.additional.6=-Djava.net.preferIPv4Stack=true
wrapper.java.additional.7=-Djboss.modules.system.pkgs=org.jboss.byteman
wrapper.java.additional.8=-Djava.awt.headless=true
wrapper.java.additional.9=-Dorg.jboss.boot.log.file=%JBOSS_HOME%/standalone/log/server.log
wrapper.java.additional.10=-Dlogging.configuration=file:%JBOSS_HOME%/standalone/configuration/logging.properties
wrapper.java.additional.11=-Dorg.tanukisoftware.wrapper.WrapperManager.mbean=false
wrapper.java.additional.12=-Djava.util.logging.manager=org.jboss.logmanager.LogManager
wrapper.java.additional.13=-Dorg.jboss.logging.Logger.pluginClass=org.jboss.logging.logmanager.LoggerPluginImpl

wrapper.app.parameter.1=../jboss-modules.jar
wrapper.app.parameter.2=-mp
wrapper.app.parameter.3=%JBOSS_HOME%/modules
wrapper.app.parameter.4=-jaxpmodule
wrapper.app.parameter.5=javax.xml.jaxp-provider
wrapper.app.parameter.6=org.jboss.as.standalone
wrapper.app.parameter.7=-Djboss.home.dir=%JBOSS_HOME%
wrapper.app.parameter.8=-Djboss.server.base.dir=%JBOSS_HOME%/standalone

Probarlo

JBoss ahora puede ejecutarse simplemente ejecutando el script bin/myJBoss console. Debido a la manera en la que el Wrapper configura su directorio actual, no es necesario ejecutar este script desde el directorio bin.

Como verá si omite un comando, el script incluido con el Wrapper es un script Demonio bastante estandarizado. Dicho script acepta los comandos console, start, stop, restart y dump.

  • Los comandos start,stop y restart son comúnes para casi todos los scripts Demonio, y son usados para controlar el Wrapper y su aplicación como un proceso Demonio.
  • El comando status puede ser usado para determinar si el Wrapper está en ejecución.
  • El comando console iniciará el Wrapper en el shell actual, haciendo posible que la aplicación sea eliminada usando CTRL-C.
  • El comando final, dump enviará una señal "kill -3" al Wrapper causando que su JVM ejecute un vertedero de memoria completo.

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