Capítulo 3. Migre su aplicación

3.1. Cambios requeridos por la mayoría de las aplicaciones

3.1.1. Revisión de los cambios requeridos por la mayoría de las aplicaciones

Los cambios en la configuración y carga de clases en JBoss EAP 6 tendrán impacto en casi todas las aplicaciones. JBoss EAP 6 también utiliza la nueva sintaxis estándar de nombrado JNDI portátil. Estos cambios tendrán impacto en la mayoría de las aplicaciones así que le sugerimos que revise la siguiente información primero cuando migre su aplicación.

3.1.2. Cambios en la carga de clases

3.1.2.1. Actualización de la aplicación debido a cambios en la carga de clases

La carga modular de clases es un cambio importante en JBoss EAP 6 y tendrá impacto en casi todas las aplicaciones. Revise la siguiente información primero al migrar su aplicación.
  1. Primero mire el empaque de su aplicación y sus dependencias. Para mayores detalles consulte: Sección 3.1.2.3, “Actualizar las dependencias de la aplicación debido a los cambios en la carga de clases”
  2. Si su aplicación realiza registros entonces necesita especificar las dependencias correctas de los módulos. Para obtener mayor información consulte: Sección 3.1.4.1, “Modificar las dependencias de registros”
  3. Debido a los cambios en la carga modular de clases es posible que tenga que cambiar la estructura de empaque de su EAR o WAR. Para obtener mayor información consulte: Sección 3.1.5.1, “Modificación del empaque de EARs y WARs”

3.1.2.2. Dependencias de módulos

Resumen

Un módulo solo puede acceder sus propias clases y las clases de cualquier módulo en el que tenga una dependencia explícita o implícita.

Procedimiento 3.1. Dependencias de módulos

  1. Dependencias implícitas

    Los implementadores dentro del servidor implícitamente agregan de manera automática algunas dependencias de módulos utilizadas comúnmente como javax.api y sun.jdk. Esto hace que las clases sean visibles para la implementación en el tiempo de ejecución y libera al desarrollador de la tarea de agregar explícitamente las dependencias. Para obtener detalles sobre la manera en que estas dependencias implícitas se agregan, consulte Dependencias de módulos implícitos en el capítulo titulado Carga de clases y módulos en la Guía de desarrollo para JBoss EAP 6 en https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.
  2. Dependencias explícitas

    Para otras clases, los módulos se deben especificar explícitamente o de otra manera las dependencias que faltan generan errores en la implementación o en el tiempo de ejecución. Si una dependencia falta entonces verá rastros de ClassNotFoundExceptions o NoClassDefFoundErrors en el registro del servidor. Si más de un módulo carga la misma JAR o un módulo carga una clase que extienda una clase cargada por un módulo diferente podrá ver los rastros de ClassCastExceptions en el registro del servidor. Para especificar dependencias de manera explícita, modifique el MANIFEST.MF o cree un archivo descriptor de implementación jboss-deployment-structure.xml específico para JBoss. Para mayor información sobre dependencias de módulos consulte la Sinopsis de carga de clases y módulos en el capítulo titulado Carga de clases y módulos en la Guía de desarrollo para JBoss EAP 6 en https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.

3.1.2.3. Actualizar las dependencias de la aplicación debido a los cambios en la carga de clases

Resumen

La carga de clases en JBoss EAP 6 es bastante diferente de las versiones anteriores de JBoss EAP. La carga de clases ahora se basa en el proyecto JBoss Modules. En lugar de un solo cargador de clases jerárquico que carga todas las JARs en una ruta de clases plana, cada biblioteca se convierte en un módulo que sólo enlaza con los módulos exactos de los que depende. Las implementaciones en JBoss EAP 6 también son módulos y no tienen acceso a las clases definidas en JARs en el servidor de aplicaciones a menos de que se defina una dependencia explícita en esas clases. Algunas dependencias de módulos definidas por el servidor de aplicaciones se configuran de manera automática. Por ejemplo, si está implementando una aplicación Java EE, se agrega una dependencia en la API Java EE a su módulo de manera automática o implícita. Para ver una lista completa de las dependencias que se agregan automáticamente por parte del servidor consulte la sección Implicit Module Dependencies en el capítulo titulado Carga de clases y módulos en la Guía de desarrollo para JBoss EAP 6 en https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.

Tareas

Cuando migre su aplicación a JBoss EAP 6, es posible que necesite realizar una o más de las siguientes tareas debido a los cambios en la carga modular de clases:

3.1.3. Cambios del archivo de configuración

3.1.3.1. Crear o modificar archivos que controlan la carga de clases en JBoss EAP 6

Resumen

Debido al cambio en JBoss EAP 6 para utilizar la carga de clases modular es posible que necesite crear o modificar uno o más archivos para agregar dependencias o para prevenir la carga de dependencias de manera automática. Para mayor información en la carga de clases y la precedencia de carga de clases consulte el capítulo titulado Carga de clases y módulos en la Guía de desarrollo para JBoss EAP 6 en https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.

Los siguientes archivos se utilizan para controlar la carga de clases en JBoss EAP 6.
jboss-web.xml
Si definió un elemento <class-loading> en el archivo jboss-web.xml entonces tiene que borrarlo. El comportamiento que esto generaba en JBoss EAP 5 ahora es el comportamiento predeterminado de la carga de clases en JBoss EAP 6 así que ya no es necesario. Si no borra este elemento entonces verá un ParseError y una XMLStreamException en su registro del servidor.
Esto es un ejemplo de un elemento <class-loading> en el archivo jboss-web.xml que se ha comentado.
<!DOCTYPE jboss-web PUBLIC
    "-//JBoss//DTD Web Application 4.2//EN"
    "http://www.jboss.org/j2ee/dtd/jboss-web_4_2.dtd">
<jboss-web>  
<!-- 
    <class-loading java2ClassLoadingCompliance="false">
        <loader-repository>
            seam.jboss.org:loader=MyApplication
            <loader-repository-config>java2ParentDelegation=false</loader-repository-config>
        </loader-repository>
    </class-loading>
 -->
 </jboss-web>

MANIFEST.MF
Manualmente modificado
Dependiendo de los componentes o módulos que su aplicación utilice es posible que necesite agregar una o más dependencias a este archivo. Las puede agregar como entradas Dependencies o Class-Path.
El siguiente es un ejemplo de MANIFEST.MF modificado por un desarrollador:
Manifest-Version: 1.0
Dependencies: org.jboss.logmanager
Class-Path: OrderManagerEJB.jar

Si modifica este archivo, asegúrese de incluir un caracter de nueva línea al final del archivo.
Generado usando Maven
Si usa Maven necesita modificar su archivo pom.xml para generar las dependencias para el archivo MANIFEST.MF. Si su aplicación usa EJB 3.0 es posible que tenga una sección en el archivo pom.xml que se vea así:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-ejb-plugin</artifactId>
    <configuration>
        <ejbVersion>3.0</ejbVersion>
    </configuration>
</plugin>
Si el código EJB 3.0 usa org.apache.commons.log necesita esa dependencia en el archivo MANIFEST.MF. Para generar esa dependencia agregue el elemento <plugin> al archivo pom.xml así:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-ejb-plugin</artifactId>
    <configuration>
        <ejbVersion>3.0</ejbVersion>
        <archive>
            <manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>
        </archive>
    </configuration>
</plugin>
En el ejemplo anterior el archivo src/main/resources/META-INF/MANIFEST.MF solo necesita contener la entrada de la dependencia:
Dependencies: org.apache.commons.logging
Maven generará el archivo MANIFEST.MF completo:
Manifest-Version: 1.0
Dependencies: org.apache.commons.logging
jboss-deployment-structure.xml
Este archivo es un descriptor de implementación específico de JBoss que se puede utilizar para controlar la carga de clases de una manera detallada. Como el MANIFEST.MF, este archivo se puede utilizar para agregar dependencias. También puede prevenir el agregar dependencias automáticas, definir módulos adicionales, cambiar el comportamiento de cargas de clases aisladas de una implementación EAR y agregar raíces de recursos adicionales a un módulo.
El siguiente es un ejemplo de un archivo jboss-deployment-structure.xml que agrega una dependencia para el módulo JSF 1.2 y previene la carga automática del módulo JSF 2.0.
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
  <deployment>
    <dependencies>
      <module name="javax.faces.api" slot="1.2" export="true"/>
      <module name="com.sun.jsf-impl" slot="1.2" export="true"/>
    </dependencies>
  </deployment>
  <sub-deployment name="jboss-seam-booking.war">
    <exclusions>
      <module name="javax.faces.api" slot="main"/>
      <module name="com.sun.jsf-impl" slot="main"/>
    </exclusions>
    <dependencies>
      <module name="javax.faces.api" slot="1.2"/>
      <module name="com.sun.jsf-impl" slot="1.2"/>
    </dependencies>
  </sub-deployment>
</jboss-deployment-structure>
Para mayor información sobre este archivo consulte: Sección 3.1.3.2, “jboss-deployment-structure.xml”.
application.xml
En versiones anteriores de JBoss EAP, usted controlaba el orden de las implementaciones dentro de un EAR usando el archivo jboss-app.xml. Esto ya no funciona así. La especificación Java EE6 proporciona el elemento <initialize-in-order> en el application.xml el cual permite controlar el orden en que los módulos Java EE se implementan dentro de un EAR.
En la mayoría de los casos no necesita especificar el orden de la implementación. Si su aplicación usa inyecciones de dependencias y referencias de recursos para referirse a componentes en módulos externos, en la mayoría de los casos el elemento <initialize-in-order> no se requiere ya que el servidor de aplicaciones puede determinar implícitamente la manera correcta y óptima de ordenar los componentes.
Vamos a asumir que tiene una aplicación que contiene un myBeans.jar y una myApp.war empacados dentro de un myApp.ear. Un servlet en el myApp.war usa una anotación @EJB para inyectar un bean desde myBeans.jar. En este caso, el servidor de aplicaciones tiene el conocimiento apropiado para asegurarse de que el componente EJB esté disponible antes de que se inicie el servlet y no tenga que utilizar el elemento <initialize-in-order>.
Sin embargo, si ese servlet usa referencias remotas del estilo de búsqueda JNDI de legado como las siguientes para acceder al bean es posible que necesite especificar el orden de los módulos.
init() {
  Context ctx = new InitialContext();
  ctx.lookup("TheBeanInMyBeansModule");
}
En este caso, el servidor no puede determinar que el componente EJB se encuentra en la myBeans.jar y necesita reforzar que los componentes en la myBeans.jar sean inicializados antes que los componentes en myApp.war. Para lograr esto, configure el elemento <initialize-in-order> como true y especifique el orden de los módulos myBeans.jar y myApp.war en el archivo application.xml.
El siguientes es un ejemplo que usa el elemento <initialize-in-order> para controlar el orden de la implementación. La myBeans.jar se implementa antes que el archivo myApp.war.
<application xmlns="http://java.sun.com/xml/ns/javaee" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="6"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
             http://java.sun.com/xml/ns/javaee/application_6.xsd">
    <application-name>myApp</application-name>
    <initialize-in-order>true</initialize-in-order>
    <module>
        <ejb>myBeans.jar</ejb>
    </module>
    <module>
        <web>
            <web-uri>myApp.war</web-uri>
            <context-root>myApp</context-root>
        </web>
    </module>
</application>
El esquema para el archivo application.xml se puede encontrar en http://java.sun.com/xml/ns/javaee/application_6.xsd.

Nota

Debe tener en cuenta que la configuración del elemento <initialize-in-order> como true demora la implementación. Es preferible definir dependencias apropiadas usando las inyecciones de dependencias o referencias de recursos ya que le da al contenedor mayor flexibilidad optimizando las implementaciones.
jboss-ejb3.xml
El descriptor de implementación jboss-ejb3.xml reemplaza el descriptor de implementación jboss.xml para sobreescribir y agregar a las funcionalidades proporcionadas por el descriptor de implementaciónejb-jar.xml de la edición empresarial Java (EE). El nuevo archivo es incompatible con jboss.xml y el jboss.xml ahora se ignora en las implementaciones.
login-config.xml
El archivo login-config.xml ya no se utiliza para la configuración de la seguridad. La seguridad ahora se configura en el elemento <security-domain> en el archivo de configuración del servidor. Para un servidor autónomo, este es el archivo standalone/configuration/standalone.xml. Si está ejecutando su servidor en un dominio administrado, este es el archivo domain/configuration/domain.xml.

3.1.3.2. jboss-deployment-structure.xml

jboss-deployment-structure.xml es un nuevo descriptor de implementación opcional para JBoss EAP 6. Este descriptor de implementación proporciona control sobre la carga de clases en la implementación.
El esquema XML para este descriptor de implementación se encuentra en EAP_HOME/docs/schema/jboss-deployment-structure-1_2.xsd

3.1.3.3. Empacar recursos para el nuevo sistema modular de carga de clases

Resumen

En versiones anteriores de JBoss EAP, todos los recursos dentro del directorio WEB-INF/ se agregaron a la ruta de clase WAR. En JBoss EAP 6, los artefactos de la aplicación web solo se cargan desde los directorios WEB-INF/classes y WEB-INF/lib. Si no se empacan los artefactos de la aplicación en los lugares especificados se pueden generar ClassNotFoundException, NoClassDefError u otros errores en tiempo de ejecución.

Para resolver estos errores de carga de clases debe modificar la estructura su archivador de aplicaciones o definir un módulo personalizado.

Modificar el empaque de recursos
Para hacer los recursos disponibles solo para la aplicación tiene que poner juntos los archivos de propiedades u otros artefactos con la WAR moviéndolos al directorio WEB-INF/classes/ o WEB-INF/lib/. Este enfoque se describe en más detalles aquí: Sección 3.1.3.4, “Cambiar la ubicación de las propiedades ResourceBundle”
Crear un módulo personalizado
Si quiere hacer disponibles recursos personalizados para todas las aplicaciones ejecutando en el servidor de JBoss EAP 6 tiene que crear un módulo personalizado. Este enfoque se describe en más detalle aquí: Sección 3.1.3.5, “Crear un módulo personalizado”

3.1.3.4. Cambiar la ubicación de las propiedades ResourceBundle

Resumen

En versiones anteriores de JBoss EAP, el directorio EAP_HOME/server/SERVER_NAME/conf/ se encontraba en la ruta de clase y disponible para la aplicación. Para hacer las propiedades disponibles para la ruta de clase de la aplicación en JBoss EAP 6, debe empacarlas dentro de su aplicación.

Procedimiento 3.2. Cambiar la ubicación de las propiedades ResourceBundle

  1. Si está implementando un archivador WAR tiene que empacar esas propiedades en la carpeta WEB-INF/classes/ del WAR.
  2. Si quiere que esas propiedades sean accequibles para todos los componentes en un EAR entonces debe empacarlos en la raíz de una JAR y luego poner la JAR en la carpeta lib/ del EAR.

3.1.3.5. Crear un módulo personalizado

El siguiente procedimiento describe la manera de crear un módulo personalizado con el fin de hacer disponibles los archivos de propiedades y otros recursos para todas las aplicaciones ejecutando en el servidor de JBoss EAP.

Procedimiento 3.3. Crear un módulo personalizado

  1. Crear y poblar la estructura del directorio module/.
    1. Crear una estructura de directorio bajo el directorio EAP_HOME/module para que contenga los archivos y JARs. Por ejemplo:
      $ cd EAP_HOME/modules/ 
      $ mkdir -p myorg-conf/main/properties
    2. Mueva el archivo de propiedades al directorio EAP_HOME/modules/myorg-conf/main/properties/ que creó en el paso anterior.
    3. Cree un archivo module.xml en el directorio EAP_HOME/modules/myorg-conf/main/ conteniendo el siguiente XML:
      <module xmlns="urn:jboss:module:1.1" name="myorg-conf">
          <resources>
              <resource-root path="properties"/>
          </resources>
      </module>
      
  2. Modifique el subsistema ee en el archivo de configuración del servidor. Puede utilizar el CLI JBoss o puede modificar manualmente el archivo.
    • Siga estos pasos para modificar el archivo de configuración usando el CLI JBoss.
      1. Inicie el servidor y conéctese al CLI de administración.
        • Para Linux, ingrese lo siguiente en la línea de comandos:
          $ EAP_HOME/bin/jboss-cli.sh --connect
          
        • Para Windows, ingrese lo siguiente en la línea de comandos:
          C:\>EAP_HOME\bin\jboss-cli.bat --connect
          
        Debe ver la siguiente respuesta:
        Conectado a un controlador autónomo en localhost:9999
      2. Para crear el elemento myorg-conf <global-modules> en el subsistema ee escriba lo siguiente en la línea de comandos:
        /subsystem=ee:write-attribute(name=global-modules, value=[{"name"=>"myorg-conf","slot"=>"main"}])
        
        Debe ver el siguiente resultado:
        {"outcome" => "success"}
        
    • Siga estos pasos si prefiere modificar manualmente el archivo de configuración del servidor.
      1. Detenga el servidor y abra el archivo de configuración del servidor en un editor de texto. Si está ejecutando un servidor autónomo este es el archivo EAP_HOME/standalone/configuration/standalone.xml o el archivo EAP_HOME/domain/configuration/domain.xml si está ejecutando un dominio administrado.
      2. Identifique el subsistema ee y agregue el módulo global para myorg-conf. El siguiente es un ejemplo del elemento subsistema ee modificado para incluir el elemento myorg-conf:
        <subsystem xmlns="urn:jboss:domain:ee:1.0" >            
            <global-modules>
                <module name="myorg-conf" slot="main" />            
            </global-modules>
        </subsystem>
        
  3. Asumiendo que copió un archivo llamado my.properties en la ubicación correcta del módulo ahora puede cargar archivos de propiedades usando código similar al siguiente:
    Thread.currentThread().getContextClassLoader().getResource("my.properties");
    

3.1.4. Cambios de inicio de sesión

3.1.4.1. Modificar las dependencias de registros

Resumen

JBoss LogManager soporta fachadas para todos los marcos de trabajo de registros de manera que pueda mantener su código actual de registro o mover a la nueva infraestructura de registro de JBoss. Independiente de su decision, debido a los cambios de carga de clases modulares probablemente necesita modificar su aplicación para agregar las dependencias requeridas.

3.1.4.2. Actualización del código de aplicación para marcos de trabajo de registros de terceros

Resumen

En JBoss EAP 6, las dependencias de registros para marcos de trabajo de terceros como Apache Commons Logging, Apache log4j, SLF4J y Java Logging se agregan por defecto. En la mayoría de los casos es preferible utilizar el marco de trabajo de registro que el contenedor JBoss EAP proporciona. Sin embargo, si requiere funcionalidades especificas proporcionadas por un marco de trabajo de terceros, debe excluir el módulo JBoss EAP correspondiente de su implementación. Note que aunque su implementación utiliza el marco de trabajo de registro de terceros, los registros del servidor continúan utilizando la configuración del subsistema de registro de JBoss EAP.

Los siguientes procedimientos demuestran cómo excluir el módulo JBoss EAP 6 org.apache.log4j de su implementación. El primer procedimiento funciona en cualquier lanzamiento de JBoss EAP 6. El segundo procedimiento aplica solamente a JBoss EAP 6.3 o posteriores.

Procedimiento 3.5. Configuración de JBoss EAP 6 para utilizar un archivo log4j.properties o log4j.xml

Este procedimiento funciona para todas las versiones de JBoss EAP 6.

Nota

Ya que este método utiliza un archivo de configuración log4j ya no podrá cambiar la configuración de registro log4j en la ejecución.
  1. Cree un jboss-deployment-structure.xml con el siguiente contenido:
    <jboss-deployment-structure>
        <deployment>
            <!-- Exclusions allow you to prevent the server from automatically adding some dependencies -->
            <exclusions>
                <module name="org.apache.log4j" />
            </exclusions>
        </deployment>
    </jboss-deployment-structure>
    
  2. Ponga el archivo jboss-deployment-structure.xml en el directorio META-INF/ o en el directorio WEB-INF/ si está implementando un WAR o en el directorio META-INF/ si está implementando un EAR. Si su implementación incluye implementaciones dependientes hijas también debe excluir el módulo para cada subimplementación.
  3. Incluya el archivo log4j.properties o log4j.xml en el directorio lib/ de su EAR o el directorio WEB-INF/classes/ de su implementación WAR. Si prefiere poner el archivo en el directorio lib/ de su WAR, debe especificar la ruta <resource-root> en el archivo jboss-deployment-structure.xml.
    <jboss-deployment-structure>
        <deployment>
            <!-- Exclusions allow you to prevent the server from automatically adding some dependencies -->
            <exclusions>
                <module name="org.apache.log4j" />
            </exclusions>
            <resources>
                <resource-root path="lib" />
            </resources>
        </deployment>
    </jboss-deployment-structure>
    
  4. Inicie el servidor JBoss EAP 6 con el siguiente argumento de tiempo de ejecución para prevenir que se presente una ClassCastException en la consola cuando implementa la aplicación:
    -Dorg.jboss.as.logging.per-deployment=false
  5. Implemente su aplicación.

Procedimiento 3.6. Configuración de las dependencias de registro para JBoss EAP 6.3 o posteriores

En JBoss EAP 6.3 y posteriores puede utilizar el nuevo atributo del sistema de registro add-logging-api-dependencies para excluir dependencias del marco de trabajo de registro de terceros. Los siguientes pasos demuestran cómo modificar este atributo de registro en un servidor autónomo JBoss EAP.
  1. Inicie el servidor JBoss EAP 6 con el siguiente argumento de tiempo de ejecución para prevenir que se presente una ClassCastException en la consola cuando implementa la aplicación:
    -Dorg.jboss.as.logging.per-deployment=false
  2. Abra una terminal y conéctese al CLI de administración.
    • Para Linux, ingrese lo siguiente en la línea de comandos:
      $ EAP_HOME/bin/jboss-cli.sh --connect
      
    • Para Windows, ingrese lo siguiente en la línea de comandos:
      C:\>EAP_HOME\bin\jboss-cli.bat --connect
      
  3. Modifique el atributo add-logging-api-dependencies en el subsistema de registro.
    Este atributo controla si el contenedor debe agregar dependencias implícitas API de registro a sus implementaciones.
    • Si se configura como true, el cual es el valor predeterminado entonces se agregan todas las dependencias API de registro implícitas.
    • Si se configura como false entonces las dependencias no se agregan a sus implementaciones.
    Para excluir las dependencias del marco de trabajo de registro de terceros debe establecer este atributo como false utilizando el siguiente comando:
    /subsystem=logging:write-attribute(name=add-logging-api-dependencies, value=false)
    Este comando agrega el elemento <add-logging-api-dependencies> al subsistema logging del archivo de configuración standalone.xml.
    <subsystem xmlns="urn:jboss:domain:logging:1.4">
        <add-logging-api-dependencies value="false"/>
        ....
    </subsystem>
    
  4. Implemente su aplicación.

3.1.4.3. Modificar el código para utilizar el nuevo marco de trabajo de inicio de sesión JBoss

Resumen

Para utilizar el nuevo marco de trabajo, cambie sus importaciones y su código así:

Procedimiento 3.7. Modificar el código y las dependencias para utilizar el marco de trabajo de inicio de sesión JBoss

  1. Cambie sus importaciones y su código de inicio de sesión

    El siguiente es un ejemplo del código que utiliza el nuevo marco de trabajo de inicio de sesión JBoss:
    import org.jboss.logging.Level;
    import org.jboss.logging.Logger;
    
    private static final Logger logger = Logger.getLogger(MyClass.class.toString());
    
    if(logger.isTraceEnabled()) {
        logger.tracef("Starting...", subsystem);
    }
    
  2. Agregue la dependencia de inicio de sesión

    La JAR que contiene las clases de inicio de sesión de JBoss se encuentra en el módulo llamado org.jboss.logging. Su archivo MANIFEST-MF se debe ver así:
    Manifest-Version: 1.0
    Dependencies: org.jboss.logging
    

3.1.5. Cambios en el empaque de aplicaciones

3.1.5.1. Modificación del empaque de EARs y WARs

Resumen

Cuando migra su aplicación puede que tenga que cambiar la estructura del empaque de su EAR o WAR debido al cambio en la carga modular de clases. Las dependencias de módulos se cargan en este orden específico:

  1. Dependencias del sistema
  2. Dependencias del usuario
  3. Recursos locales
  4. Dependencias de inter-implementación

Procedimiento 3.8. Modificación del empaque de archivadores

  1. Empaque de un WAR

    Un WAR es un solo módulo y todas las clases en el WAR se cargan con el mismo cargador de clases. Esto significa que las clases empacadas en el directorio WEB-INF/lib/ se tratan de igual manera que las clases en el directorio WEB-INF/classes.
  2. Empaque de un EAR

    Un EAR consiste de múltiples módulos. El directorio EAR/lib/ es un solo módulo y toda subimplementación EJB jar o WAR dentro del EAR es un módulo separado. Las clases no tienen acceso a las clases en otros módulos dentro del EAR a menos de que se hayan definido dependencias explícitas. Las subimplementaciones siempre tienen una dependencia automática en el módulo padre el cual les proporciona acceso a las clases en el directorio EAR/lib/. Sin embargo, las subimplementaciones no siempre tienen una dependencia automática para permitirles el acceso entre ellas. Este comportamiento se controla configurando el elemento <ear-subdeployments-isolated> en la configuración del subsistema ee así:
    <subsystem xmlns="urn:jboss:domain:ee:1.0" >            
      <ear-subdeployments-isolated>false</ear-subdeployments-isolated>
    </subsystem>
    Por defecto esto se configura como falso, lo cual permite que las subimplementaciones vean las clases que pertenecen a otras subimplementaciones dentro del EAR.
    Para mayor información sobre la carga de clases consulte el capítulo titulado Módulos y carga de clases en la Guía de desarrollo para JBoss EAP 6 en https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.

3.1.6. Cambios de configuración del adaptador de recursos y fuentes de datos

3.1.6.1. Actualización de la aplicación debido a cambios en la configuración

En JBoss EAP 5, los servicios y subsistemas se configuraban en muchos archivos diferentes. En JBoss EAP 6, la configuración se realiza principalmente en un archivo. Si su aplicación usa uno de las siguientes recursos o servicios es posible que necesite cambios en la configuración.
  1. Si su aplicación usa una fuente de datos consulte: Sección 3.1.6.2, “Actualización de la configuración de la fuente de datos”.
  2. Si su aplicación usa JPA y actualmente une las JARs Hibernate consulte lo siguiente para ver sus opciones de migración: Sección 3.1.6.4, “Configuración de la fuente de datos para Hibernate o JPA”.
  3. Si su aplicación usa un adaptador de recursos consulte: Sección 3.1.6.5, “Actualización de la configuración del adaptador de recursos”.
  4. Revise lo siguiente para obtener mayor información sobre cómo configurar los cambios para la seguridad básica: Sección 3.1.7.1, “Configuración de los cambios de seguridad de la aplicación”.

3.1.6.2. Actualización de la configuración de la fuente de datos

Resumen

En versiones anteriores de JBoss EAP, la configuración de la fuente de datos JCA se definía en un archivo con el sufijo *-ds.xml. Luego este archivo se implementaba en el directorio deploy/ del servidor o se empacaba con la aplicación. El controlador JDBC se copiaba al directorio server/lib/ o se empacaba en el directorio WEB-INF/lib/ de la aplicación. Mientras que este método de configuración de una fuente de datos todavía se soporta para el desarrollo, no se recomienda para producción ya que no se soporta por las herramientas de administrativas y de gestión de JBoss.

En JBoss EAP 6, la fuente de datos se configura en el archivo de configuración del servidor. Si la instancia de JBoss EAP 6 está ejecutando en un dominio administrado, la fuente de datos se configura en el archivo domain/configuration/domain.xml. Si la instancia de JBoss EAP 6 está ejecutando como un servidor autónomo, la fuente de datos está configurada en el standalone/configuration/standalone.xml file. Las fuentes de datos configuradas de esta manera se pueden administrar y controlar usando las interfaces de administración JBoss, incluyendo la consola de administración web y la interfaz de la línea de comandos (CLI). Estas herramientas facilitan el administrar las implementaciones y configurar múltiples servidores ejecutando en un dominio administrado.
La siguiente sección describe la manera de modificar la configuración de su fuente de datos de manera que se pueda administrar y soportar por medio de las herramientas de administración disponibles.
Migrar a una configuración administrable de la fuente de datos para JBoss EAP 6

Un controlador que cumple con los requerimientos de JDBC 4.0 se puede instalar como una implementación o como un módulo núcleo. Un controlador que cumple con los requerimientos de JDBC 4.0 contiene un archivo META-INF/services/java.sql.Driver que especifica el nombre de la clase del controlador. Un controlador que no cumpla con los requerimientos de JDBC 4.0 requiere pasos adicionales. Para mayores detalles sobre cómo hacer que un controlador cumpla con los requerimientos de JDBC 4.0 y cómo actualizar su configuración actual de la fuente de datos con una que sea administrada por la consola de administración web y CLI, consulte Sección 3.1.6.3, “Instalación y configuración del controlador JDBC”.

Si su aplicación usa Hibernate o JPA, puede que requiera cambios adicionales. Consulte Sección 3.1.6.4, “Configuración de la fuente de datos para Hibernate o JPA” para obtener mayor información.
Use la herramienta de migración IronJacamar para convertir los datos de configuración

Puede utilizar la herramienta IronJacamar para migrar las configuraciones del adaptador de recursos y la fuente de datos. Esta herramienta convierte los archivos de configuración de estilo *-ds.xml al formato esperado por JBoss EAP 6. Para mayor información, consulte: Sección 4.1.6, “Uso de la herramienta IronJacamar para migrar configuraciones del adapatador de recursos y la fuente de datos”.

3.1.6.3. Instalación y configuración del controlador JDBC

Resumen

El controlador JDBC se puede instalar en el contenedor en una de las siguientes dos maneras:

  • Como una implementación
  • Como un módulo núcleo
Los pros y los contras de cada enfoque se pueden ver a continuación.

En JBoss EAP 6, la fuente de datos se configura en el archivo de configuración del servidor. Si la instancia de JBoss EAP 6 está ejecutando en un dominio administrado, la fuente de datos se configura en el archivo domain/configuration/domain.xml. Si la instancia de JBoss EAP 6 está ejecutando como un servidor autónomo entonces la fuente de datos se configura en el archivo standalone/configuration/standalone.xml. Puede encontrar información de referencia del esquema, el cual es el mismo para ambos modos, en el directorio doc/ de la instalación de JBoss EAP 6. Para esta explicación vamos a asumir que el servidor está ejecutando como un servidor autónomo y la fuente de datos se configura en el archivo standalone.xml.

Procedimiento 3.9. Instalación y configuración del controlador JDBC

  1. Instale el controlador JDBC.

    1. Instale el controlador JDBC como implementación.

      Esta es la manera recomendada de instalar el controlador. Cuando el controlador JDBC se instala como una implementación, se implementa como una JAR normal. Si la instancia de JBoss EAP 6 está ejecutando como un servidor autónomo, copie la JAR que cumple con los requerimientos de JDBC 4.0 en el directorio EAP_HOME/standalone/deployments/. Para un dominio administrado tiene que utilizar la consola de administración o el CLI de administración para implementar la JAR en los grupos de servidores.
      El siguiente es un ejemplo de un controlador MySQL JDBC instalado como una implementación en un servidor autónomo:
      $cp mysql-connector-java-5.1.15.jar EAP_HOME/standalone/deployments/
      Cualquier controlador que cumple con los requerimientos de JDBC 4.0 es reconocido automáticamente y se instala en el sistema por nombre y versión. Una JAR que cumple con los requerimientos de JDBC 4.0 contiene un archivo de texto llamado META-INF/services/java.sql.Driver, el cual especifica los nombres de las clases controladoras. Si el controlador no cumple con los requerimientos de JDBC 4.0 entonces se puede hacer que se implemente de una de las siguientes maneras:
      • Cree y agregue un archivo java.sql.Driver a la JAR bajo la ruta META-INF/services/. Este archivo debe contener el nombre de la clase del controlador, por ejemplo:
        com.mysql.jdbc.Driver
      • Cree un archivo java.sql.Driver en el directorio de implementaciones. Para una instancia de JBoss EAP 6 ejecutando como un servidor autónomo, el archivo se debe poner aquí: EAP_HOME/standalone/deployments/META-INF/services/java.sql.Driver. Si el servidor está en un dominio administrado entonces debe utilizar la consola de administración o el CLI de administración para implementar el archivo.
      Las ventajas de este enfoque son:
      • Este es el método más fácil ya que no hay necesidad de definir un módulo.
      • Cuando el servidor está ejecutando en un dominio administrado, las implementaciones que usan este enfoque se propagan de manera automática en todos los servidores en el dominio. Esto significa que el administrador no necesita distribuir el controlador JAR manualmente.
      Las desventajas de este enfoque son:
      • Si el controlador JDBC consiste de mas de una JAR, por ejemplo el controlador JAR más una licencia JAR dependiente o una JAR de localización, no puede instalar el controlador como una implementación. Tiene que instalar el controlador JDBC como un módulo núcleo.
      • Si el controlador no cumple con los requerimientos de JDBC 4.0 entonces se debe crear un archivo que contenga los nombres de las clases controladoras y tiene que ser importado en la JAR o superpuesto en el directorio deployments/.
    2. Instalación del controlador JDBC como módulo central .

      Para instalar un controlador JDBC como un módulo núcleo, tiene que crear una estructura de ruta de archivos bajo el directorio EAP_HOME/modules/. Esta estructura contiene la JAR del controlador JDBC, las JARS de localización o las licencias adicionales del vendedor y un archivo module.xml para definir el módulo.
      • Instale el controlador MySQL JDBC como módulo núcleo

        1. Cree la estructura del directorio EAP_HOME/modules/com/mysql/main/
        2. En el subdirectorio main/, cree un archivo module.xml que contenga la siguiente definición de módulo para el controlador MySQL JDBC:
          <?xml version="1.0" encoding="UTF-8"?>
          <module xmlns="urn:jboss:module:1.0" name="com.mysql">
          <resources>
              <resource-root path="mysql-connector-java-5.1.15.jar"/>
          </resources>
          <dependencies>
              <module name="javax.api"/>
          </dependencies>
          </module>
          
          
          El nombre del módulo, "com.mysql", coincide con la estructura del directorio para este módulo. El elemento <dependencies> se usa para especificar las dependencias de este módulo en otros módulos. En este caso, tal como los es con todas las fuentes de datos JDBC, depende de las APIs JDBC Java que se definen en otro módulo llamado javax.api. Ese módulo se encuentra bajo el directorio modules/system/layers/base/javax/api/main/.

          Nota

          Asegúrese de NO tener un espacio al principio del archivo module.xml de otra manera obtendrá un error "New missing/unsatisfied dependencies" para este controlador.
        3. Copie la JAR del controlador MySQL JDBC en el directorio EAP_HOME/modules/com/mysql/main/:
          $ cp mysql-connector-java-5.1.15.jar EAP_HOME/modules/com/mysql/main/
      • Instalación del controlador IBM DB2 JDBC y la JAR licencia como un módulo núcleo.

        Este ejemplo se proporciona sólo para demostrar la manera de implementar controladores que requieren JARs además de la JAR del controlador JDBC.
        1. Cree la estructura del directorio EAP_HOME/modules/com/ibm/db2/main/.
        2. En el subdirectorio main/, cree un archivo module.xml que contenga la siguiente definición de módulo para el controlador IBM DB2 JDBC y licencia:
          <?xml version="1.0" encoding="UTF-8"?>
          <module xmlns="urn:jboss:module:1.1" name="com.ibm.db2">
            <resources>
              <resource-root path="db2jcc.jar"/>
              <resource-root path="db2jcc_license_cisuz.jar"/>
            </resources>
            <dependencies>
              <module name="javax.api"/>
              <module name="javax.transaction.api"/>
            </dependencies>
          </module>
          

          Nota

          Asegúrese de NO tener un espacio al principio del archivo module.xml de otra manera obtendrá un error "New missing/unsatisfied dependencies" para este controlador.
        3. Copie el controlador JDBC y la JAR de lincencia en el directorio EAP_HOME/modules/com/ibm/db2/main/.
          $ cp db2jcc.jar EAP_HOME/modules/com/ibm/db2/main/
          $ cp db2jcc_license_cisuz.jar EAP_HOME/modules/com/ibm/db2/main/
      Las ventajas de este enfoque son:
      • Este es el único enfoque que funciona cuando el controlador JDBC consiste de más de una JAR.
      • Con este enfoque, los controladores que no cumplen con los requerimientos de JDBC 4.0 se pueden instalar sin modificar la JAR del controlador o creando una superposición de archivos.
      Las desventajas de este enfoque son:
      • Es más dificil configurar un módulo.
      • El módulo se debe copiar manualmente en todos los servidores ejecutando en un dominio administrado.
  2. Configure la fuente de datos.

    1. Agregue el controlador de la base de datos.

      Agregar el elemento <driver> al elemento <drivers> del mismo archivo. Nuevamente esto contiene alguna de la misma información de la fuente de datos que se definió previamente en el archivo *-ds.xml.
      Primero determine si la JAR controladora cumple con los requerimientos de JDBC 4.0. Una JAR que cumple con los requerimientos de JDBC 4.0 contiene un archivo META-INF/services/java.sql.Driver que especifica el nombre de la clase controladora. El servidor usa este archivo para encontrar el nombre de las clases controladoras en la JAR. Un controlador que cumpla con los requerimientos de JDBC 4.0 no requiere un elemento <driver-class> ya que ya se especifica en la JAR. Este es un ejemplo del elemento controlador para un controlador MySQL que cumple con los requerimientos de JDBC 4.0:
      <driver name="mysql-connector-java-5.1.15.jar" module="com.mysql"/>
      
      Un controlador que no cumple con los requerimientos de JDBC 4.0 requiere un atributo <driver-class> para identificar la clase del controlador ya que no hay un archivo META-INF/services/java.sql.Driver que especifique el nombre de la clase controladora. Este es un ejemplo del elemento controlador para el controlador que no cumpla con los requerimientos de JDBC 4.0:
      <driver name="mysql-connector-java-5.1.15.jar" module="com.mysql">
      <driver-class>com.mysql.jdbc.Driver</driver-class></driver>
      
    2. Creación de la fuente de datos.

      Cree un elemento <datasource> en la sección <datasources> del archivo standalone.xml. Este archivo contiene mucha de las misma información de la fuente de datos que se definió anteriormente en el archivo *-ds.xml.

      Importante

      Tiene que detener el servidor antes de modificar el archivo de configuración del servidor para que su cambio persista al reiniciar el servidor.
      El siguiente es un ejemplo de un elemento de la fuente de datos MySQL en el archivo standalone.xml:
      <datasource jndi-name="java:/YourDatasourceName" pool-name="YourDatasourceName">
        <connection-url>jdbc:mysql://localhost:3306/YourApplicationURL</connection-url>
        <driver>mysql-connector-java-5.1.15.jar</driver>
        <transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
        <pool>
          <min-pool-size>100</min-pool-size>
          <max-pool-size>200</max-pool-size>
        </pool>
        <security>
          <user-name>USERID</user-name>
          <password>PASSWORD</password>
        </security>
        <statement>
          <prepared-statement-cache-size>100</prepared-statement-cache-size>
          <share-prepared-statements/>
        </statement>
      </datasource>
      
  3. Actualización de las referencias JNDI en el código de la aplicación.

    Debe reemplazar los nombres de las búsquedas JNDI que estén desactualizados en el código fuente de la aplicación para utilizar los nuevos nombres de la fuente de datos estándar JNDI que haya definido. Para obtener mayor información, consulte: Sección 3.1.8.4, “Modifique la aplicación a seguir las nuevas reglas de los espacios de nombre JNDI”.
    También debe reemplazar cualquier anotación @Resource existente que acceda la fuente de datos para utilizar el nuevo nombre JNDI. Por ejemplo:
    @Resource(name = "java:/YourDatasourceName").
    

3.1.6.4. Configuración de la fuente de datos para Hibernate o JPA

Si su aplicación usa JPA y actualmente agrupa las JARs de Hibernate es posible que quiera utilizar el Hibernate incluído con JBoss EAP 6. Para utilizar esta versión de Hibernate tiene que borrar el grupo anterior de Hibernate de su aplicación.

Procedimiento 3.10. Borre el paquete Hibernate

  1. Borre las JARs Hibernate de sus carpetas de la biblioteca de su aplicación.
  2. Borre o comente el elemento <hibernate.transaction.manager_lookup_class> en su archivo persistence.xml ya que este elemento no se necesita.

3.1.6.5. Actualización de la configuración del adaptador de recursos

Resumen

En versiones anteriores del servidor de aplicaciones, la configuración del adaptador de recursos se definía en un archivo con el sufijo *-ds.xml. En JBoss EAP 6 se configura un adaptador de recursos en el archivo de configuración del servidor. Si está ejecutando en un dominio administrado, el archivo de configuración es el archivo EAP_HOME/domain/configuration/domain.xml. Si está ejecutando como un servidor autónomo configure el adaptador de recursos en el archivo EAP_HOME/standalone/configuration/standalone.xml. Puede encontrar información de referencia sobre el esquema, el cual es el mismo para ambos modos en: Schemas en el sitio web de IronJacamar aquí: http://www.ironjacamar.org/documentation.html.

Importante

Tiene que detener el servidor antes de modificar el archivo de configuración del servidor para que su cambio persista al reiniciar el servidor.
Definir el adaptador de recursos

La información del descriptor del adaptador de recursos se define bajo el siguiente elemento del subsistema en el archivo de configuración del servidor:

<subsystem xmlns="urn:jboss:domain:resource-adapters:1.1"/>
Utilizará un poco de la misma información que se definio previamente en el archivo del adaptador de recursos *-ds.xml.

El siguiente es un ejemplo de un elemento del adaptador de recursos en el archivo de configuración del servidor:
<resource-adapters>
  <resource-adapter>
    <archive>multiple-full.rar</archive>
    <config-property name="Name">ResourceAdapterValue</config-property>
    <transaction-support>NoTransaction</transaction-support>
    <connection-definitions>
      <connection-definition
      class-name="org.jboss.jca.test.deployers.spec.rars.multiple.MultipleManagedConnectionFactory1"
      enabled="true" jndi-name="java:/eis/MultipleConnectionFactory1"
      pool-name="MultipleConnectionFactory1">
    <config-property name="Name">MultipleConnectionFactory1Value</config-property>
      </connection-definition>
      <connection-definition
      class-name="org.jboss.jca.test.deployers.spec.rars.multiple.MultipleManagedConnectionFactory2"
      enabled="true" jndi-name="java:/eis/MultipleConnectionFactory2"
      pool-name="MultipleConnectionFactory2">
    <config-property name="Name">MultipleConnectionFactory2Value</config-property>
      </connection-definition>
    </connection-definitions>
    <admin-objects>
      <admin-object
      class-name="org.jboss.jca.test.deployers.spec.rars.multiple.MultipleAdminObject1Impl"
      jndi-name="java:/eis/MultipleAdminObject1">
    <config-property name="Name">MultipleAdminObject1Value</config-property>
      </admin-object>
      <admin-object class-name="org.jboss.jca.test.deployers.spec.rars.multiple.MultipleAdminObject2Impl"
      jndi-name="java:/eis/MultipleAdminObject2">
    <config-property name="Name">MultipleAdminObject2Value</config-property>
      </admin-object>
      </admin-objects>
  </resource-adapter>
</resource-adapters>

3.1.7. Cambios de seguridad

3.1.7.1. Configuración de los cambios de seguridad de la aplicación

Configuración de la seguridad para autenticación básica

En las versiones anteriores de JBoss EAP, los archivos de propiedades que se encuentran en el directorio EAP_HOME/server/SERVER_NAME/conf/ estaban en la ruta de clase y UsersRolesLoginModule los podía encontrar fácilmente. En JBoss EAP 6, la estructura del directorio ha cambiado. Los archivos de propiedades deben estar empacados dentro de la aplicación para que estén disponibles en la ruta de clases.

Importante

Tiene que detener el servidor antes de modificar el archivo de configuración del servidor para que su cambio persista al reiniciar el servidor.
Para configurar la seguridad para la autenticación básica, agregue un nuevo dominio de seguridad bajo el security-domains a los archivos de configuración del servidor standalone/configuration/standalone.xml o domain/configuration/domain.xml:
<security-domain name="example">
    <authentication>
        <login-module code="UsersRoles" flag="required">
            <module-option name="usersProperties" 
                    value="${jboss.server.config.dir}/example-users.properties"/>
            <module-option name="rolesProperties" 
                    value="${jboss.server.config.dir}/example-roles.properties"/>
        </login-module>
    </authentication>
</security-domain>
Si la instancia de JBoss EAP 6 está ejecutando como un servidor autónomo, ${jboss.server.config.dir} se refiere al directorio EAP_HOME/standalone/configuration/. Si la instancia está ejecutando en un dominio administrado, ${jboss.server.config.dir} se refiere al directorio EAP_HOME/domain/configuration/.
Modificación de los nombres del dominio de seguridad

En JBoss EAP 6, los dominios de seguridad ya no usan el prefijo java:/jaas/ en sus nombres.

  • Para las aplicaciones web, tiene que borrar este prefijo de las configuraciones del dominio de seguridad en el jboss-web.xml.
  • Para las aplicaciones empresariales tiene que borrar este prefijo de las configuraciones del dominio de seguridad en el archivo jboss-ejb3.xml. Este archivo ha reemplazado el jboss.xml en JBoss EAP 6.

3.1.8. Cambios de JNDI

3.1.8.1. Actualización de los nombres de espacios de nombres JNDI de la aplicación

Resumen

EJB 3.1 introdujo un espacio de nombre JNDI global estandarizado y una serie de espacios de nombres relacionados que mapean a los variados ámbitos de una aplicación Java EE. Los nombres EJB portátiles solo se enlazan a tres de ellos: java:global, java:module y java:app. Las aplicaciones con EJBs que usan JNDI se deben cambiar para que sigan la nueva convención de espacios de nombre JNDI estándarizada.

Mapeos JNDI de ejemplo

Aqui puede encontrar ejemplos de espacios de nombres JNDI en lanzamientos anteriores y la manera en que se especifican en JBoss EAP 6: Sección 3.1.8.5, “Ejemplos de espacios de nombres JNDI en lanzamientos anteriores y la manera en que se especifican en JBoss EAP 6”

3.1.8.2. Nombres JNDI EJB portátiles

Resumen

La especificación Java EE 6 define cuatro espacios de nombres lógicos, cada uno con su propio ámbito, pero los nombres EJB portátiles solo se enlazan a tres de ellos. La siguiente tabla detalla cuándo y cómo utilizar cada espacio de nombre.

Tabla 3.1. Espacios de nombres JNDI portátiles

Espacio de nombre JNDI Descripción
java:global
Los nombres en este espacio de nombres son compartidos por todas las aplicaciones implementadas en una instancia del servidor de aplicaciones. Use los nombres en este espacio de nombres para encontrar archivadores externos EJBs implementados en el mismo servidor.
El siguiente es un ejemplo de un espacio de nombre java:global: java:global/jboss-seam-booking/jboss-seam-booking-jar/HotelBookingAction
java:module
Los nombres en este espacio de nombre son compartidos por todos los componentes en un módulo, por ejemplo, todos los beans empresariales en un solo módulo EJB o todos los componentes en un módulo web.
El siguiente es un ejemplo de un espacio de nombres java:module: java:module/HotelBookingAction!org.jboss.seam.example.booking.HotelBooking
java:app
Los nombres en este espacio de nombres son compartidos por todos los componentes en todos los módulos en una sola aplicación. Por ejemplo,un archivo jar EJB y una WAR en el mismo archivo EAR tendrían acceso a los recursos en el espacio de nombres java:app.
El siguiente es un ejemplo de un espacio de nombres java:app: java:app/jboss-seam-booking-jar/HotelBookingAction
Puede encontrar mayor información sobre los contextos de nombrado JNDI en la sección EE.5.2.2, "Application Component Environment Namespaces" en "JSR 316: JavaTM Platform, Enterprise Edition (Java EE) Specification, v6". Puede descargar la especificación de aquí: http://jcp.org/en/jsr/detail?id=316

3.1.8.3. Revisión de las reglas del espacio de nombres de JNDI

Resumen

JBoss EAP 6 ha mejorado en los nombres de espacio de nombres JNDI no solo para brindar reglas predecibles y consistentes para todo nombre enlazado en el servidor de aplicaciones sino también para prevenir futuros problemas de compatibilidad. Esto significa que es posible que encuentre problemas con los espacios de nombre actuales en su aplicación si no siguen las nuevas reglas.

Los espacios de nombres deben seguir estas reglas:

  1. Nombres relativos no calificados como DefaultDS o jdbc/DefaultDS deben ser calificados relativos a java:comp/env, java:module/env o java:jboss/env, dependiendo del contexto.
  2. Nombres no calificados absolute como /jdbc/DefaultDS deben ser calificados con relación a un nombre java:jboss/root.
  3. Nombres calificados absolute como java:/jdbc/DefaultDS se deben calificar de la misma manera que los nombres absolute no calificados anteriores.
  4. El espacio de nombres especial java:jboss se comparte a través de toda la instancia del servidor AS.
  5. Cualquier nombre relative con un prefijo java: debe estar en uno de los cinco espacios de nombre: comp, module, app, global o el jboss propietario. Cualquier nombre que inicie por java:xxx en donde xxx no coincida con ninguno de los cinco anteriores generaría un error de nombre inválido.

3.1.8.4. Modifique la aplicación a seguir las nuevas reglas de los espacios de nombre JNDI

  • Este es un ejemplo de una búsqueda JNDI en JBoss EAP 5.1. Este código usualmente se encuentra en un método de inicialización.
    private ProductManager productManager;
    try {
        context = new InitialContext();
        productManager = (ProductManager) context.lookup("OrderManagerApp/ProductManagerBean/local");
    } catch(Exception lookupError) {
        throw new ServletException("Unable to find the ProductManager bean", lookupError);
    }
    
    Note que el nombre de búsqueda es OrderManagerApp/ProductManagerBean/local.
  • El siguiente es un ejemplo de la manera en que la misma búsqueda se codificaría en JBoss EAP 6 usando la inyección de dependencias.
    @EJB(lookup="java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager")
    private ProductManager productManager;
    
    Los valores de la búsqueda ahora se definen como variables de miembros y usan el nuevo espacio de nombre JNDI portátil java:app java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager.
  • Si prefiere no utilizar la inyección de dependencias entonces puede continuar creando el nuevo InitialContext como se mostró anteriormente y modificar la búsqueda para utilizar el nuevo espacio de nombre JNDI.
    private ProductManager productManager;
    try {
        context = new InitialContext();
        productManager = (ProductManager) context.lookup("java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager");
    } catch(Exception lookupError) {
        throw new ServletException("Unable to find the ProductManager bean", lookupError);
    }
    

3.1.8.5. Ejemplos de espacios de nombres JNDI en lanzamientos anteriores y la manera en que se especifican en JBoss EAP 6

Tabla 3.2. Tabla de mapeo de espacios de nombres JNDI

Espacios de nombres en JBoss EAP 5.x Espacios de nombres en JBoss EAP 6 Comentarios adicionales
OrderManagerApp/ProductManagerBean/local java:module/ProductManagerBean!services.ejb.ProductManager Enlace estándar Java EE 6. Con el ámbito del módulo actual y solamente accesible dentro del mismo módulo.
OrderManagerApp/ProductManagerBean/local java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager Enlace estándar Java EE 6. Con el ámbito de la aplicación actual y solamente accesible dentro de la misma aplicación.
OrderManagerApp/ProductManagerBean/local java:global/OrderManagerApp/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager Enlace estándar Java EE 6. Con el ámbito del servidor de aplicaciones y accesible globalmente.
java:comp/UserTransaction java:comp/UserTransaction El espacio de nombres tiene como ámbito el componente actual. No es accesible para hilos que no sean Java EE 6, por ejemplo, hilos creados directamente por su aplicación.
java:comp/UserTransaction java:jboss/UserTransaction Globalmente accesible. Úselo si java:comp/UserTransaction no está disponible
java:/TransactionManager java:jboss/TransactionManager  
java:/TransactionSynchronizationRegistry java:jboss/TransactionSynchronizationRegistry