Chapitre 3. Migration de votre application

3.1. Changements requis par la plupart des applications

3.1.1. Revue des changements de migration requis par la plupart des applications

Le chargement des classes et les changements de configuration de JBoss Enterprise Application Platform 6 auront un impact dans presque toutes les applications. JBoss EAP 6 utilise également la nouvelle syntaxe de nommage JNDI standard portable. Ces changements auront un impact sur la plupart des applications, donc nous vous suggérons de commencer par consulter ces informations quand vous migrerez votre application.

3.1.2. Changements au niveau du chargement des classes

3.1.2.1. Mise à jour de l'application en raison des changements de chargement de classes

Le chargement des classes représente un changement important dans JBoss EAP 6 et aura un impact dans presque toutes les applications. Revoir les informations suivantes pour commencer avant de migrer votre application.
  1. Veuillez tout d'abord vous pencher sur le packaging de votre application et de ses dépendances. Pour plus d'informations, voir Section 3.1.2.3, « Mise à jour des dépendances d'applications en raison des changements de chargement de classes »
  2. Si votre application a une journalisation, vous devez spécifier les dépendances du module qui conviennent. Voir Section 3.1.4.1, « Modifier les dépendances de journalisation »
  3. En raison des changements dans le chargement de classe modulaire, vous devrez sans doute modifier la structure de votre EAR ou WAR. Voir Section 3.1.5.1, « Modifier l'empaquetage des EAR et des WAR » pour plus d'informations.

3.1.2.2. Les dépendances de modules

Résumé

Un module ne peut accéder qu'à ses propres classes et aux classes de modules sur lesquelles il possède une dépendance implicite ou explicite.

Procédure 3.1. Les dépendances de modules

  1. Comment fonctionnent les dépendances implicites ?

    Les déployeurs qui se trouvent dans le serveur ajoutent implicitement et automatiquement certaines dépendances de module communément utilisées, comme javax.api ou sun.jdk. Cela rend les classes visibles au déploiement au moment de l'exécution et soulage le développeur de la tâche d'ajouter explicitement les dépendances. Quand et comment ces dépendances implicites sont ajoutées est expliqué dans la section Implicit Module Dependencies (Dépendances de modules implicites) du chapitre Class Loading and Modules (Chargement de classes et modules) du Development Guide (Guide de développement) de JBoss EAP 6 https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.
  2. Comment fonctionnent les dépendances explicites ?

    Pour les autres classes, les modules doivent être spécifiés explicitement sinon les dépendances manquantes entraînent des erreurs de déploiement ou de runtime. Si une dépendance est manquante, vous en verrez des traces, du style ClassNotFoundExceptions ou NoClassDefFoundErrors, dans le journal du serveur. Si plus d'un module charge le même JAR ou si un module charge une classe qui étend une classe chargée dans un module différent, vous en verrez des traces, du style ClassCastExceptions, dans le journal du serveur. Pour spécifier des dépendances explicitement, modifier MANIFEST.MF ou bien, créer un fichier de descripteur de déploiement spécifique à JBoss jboss-deployment-structure.xml. Pour plus d'informations sur les dépendances de modules, voir Overview of Class Loading and Modules (Aperçu général des Classes de chargement et des Modules) au chapitre Class Loading and Module (Chargement de classes et module) du Development Guide (Guide de développement) de JBoss EAP 6 https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.

3.1.2.3. Mise à jour des dépendances d'applications en raison des changements de chargement de classes

Résumé

Le chargement de classes de JBoss EAP 6 est très différent par rapport aux versions précédentes de JBoss Enterprise Application Platform. Le chargement de classes est maintenant basé sur le projet JBoss Modules. Plutôt que d'avoir un chargeur de classe unique et hiérarchique qui charge tous les JAR dans un chemin d'accès de la classe à plat, chaque bibliothèque devient un module qui se relie seulement aux modules précis dont elle dépend. Les déploiements JBoss EAP 6 sont également des modules et n'ont pas accès aux classes qui sont définies dans les JAR du serveur d'application, à moins qu'une dépendance explicite sur ces classes soit définie. Certaines dépendances de modules définies par le serveur d'applications sont configurées automatiquement pour vous. Par exemple, si vous déployez une application Java EE, une dépendance sur l'API de Java EE sera ajoutée à votre module automatiquement ou implicitement. Pour obtenir une liste complète des dépendances qui sont automatiquement ajoutées, voir Implicit Module Dependencies (Dépendances de modules implicites) dans le chapitre intitulé Class Loading and Modules (Chargement de classses et Modules) du Development Guide (Guide de développement) de JBoss Enterprise Application Platform 6 à l'adresse suivante https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.

Tâches

Quand vous migrez votre application dans JBoss EAP 6, vous devrez sans doute effectuer une des tâches suivantes à cause des changements du chargement des classes modulaires.

3.1.3. Changements dans les fichiers de configuration

3.1.3.1. Créer ou modifier des fichiers qui contrôlent le chargement de classes dans JBoss EAP 6

Résumé

En raison du changement de chargement de classes modulaires dans JBoss EAP 6, vous devrez peut-être créer ou modifier un ou plusieurs fichiers pour ajouter des dépendances ou pour empêcher les dépendances automatiques de charger. Pour plus d'informations sur Class Loading and Modules (Chargement de classes et Modules), voir le Development Guide de JBoss EAP 6 https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.

Les fichiers suivants sont utilisés pour contrôler le chargement de classes dans JBoss EAP 6.
jboss-web.xml
Si vous avez défini un élément <class-loading> dans le fichier jboss-web.xml, vous devrez le supprimer. Le comportement évoqué dans JBoss EAP 5 est maintenant le comportement de chargement par défaut dans JBoss EAP 6, donc ce n'est plus nécessaire. Si vous ne souhaitez pas supprimer cet élément, vous verrez les expressions ParseError et XMLStreamException dans votre journal de serveur.
Il s'agit d'un exemple d'élément <class-loading> du fichier jboss-web.xml qui est dé-commenté.
<!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
Édité manuellement
Selon les composants ou modules que votre application utilise, vous devrez peut-être ajouter une ou plusieurs dépendances à ce fichier. Vous pouvez les ajouter par l'une des entrées suivantes Dependencies ou Class-Path .
Voici un exemple de MANIFEST.MF édité par un développeur :
Manifest-Version: 1.0
Dependencies: org.jboss.logmanager
Class-Path: OrderManagerEJB.jar

Si vous modifiez ce fichier, veillez à inclure un caractère de nouvelle ligne en fin de fichier.
Créé par Maven
Si vous utilisez Maven, vous devrez modifier votre fichier pom.xml pour créer des dépendances pour le fichier MANIFEST.MF. Si votre application utilise EJB 3.0, vous aurez sans doute une section du fichier pom.xml qui ressemblera à ce qui suit :
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-ejb-plugin</artifactId>
    <configuration>
        <ejbVersion>3.0</ejbVersion>
    </configuration>
</plugin>
Si le code EJB 3.0 utilise org.apache.commons.log, vous aurez besoin de cette dépendance dans le fichier MANIFEST.MF. Pour créer cette dépendance, ajouter l'élément <plugin> au fichier pom.xml comme suit :
<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>
Dans l'exemple ci-dessus, le fichier src/main/resources/META-INF/MANIFEST.MF doit comprendre la dépendance suivante uniquement :
Dépendences: org.apache.commons.logging
Maven va créer un fichier complet MANIFEST.MF :
Manifest-Version: 1.0
Dependencies: org.apache.commons.logging
jboss-deployment-structure.xml
Ce fichier est un descripteur de déploiement spécifique à JBoss qui peut être utilisé pour contrôler un chargement de classes en toute précision. Comme MANIFEST.MF, ce fichier peut être utilisé pour ajouter des dépendances. Peut également empêcher l'ajout automatique de dépendances, définir des modules supplémentaires, modifier un comportement de chargement de classe isolé de déploiement EAR, et ajouter des racines de ressources supplémentaires à un module.
Il s'agit d'un exemple de fichier jboss-deployment-structure.xml qui ajoute une dépendance au module JSF 1.2 et empêche le chargement automatique du module 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>
Pour obtenir des informations supplémentaires sur ce fichier, voir Section 3.1.3.2, « jboss-deployment-structure.xml ».
application.xml
Dans les versions précédentes de JBoss EAP, vous pouviez contrôler l'ordre des déploiements qui se trouvent au sein d'un EAR par le fichier jboss-app.xml. Ce n'est plus le cas. Les spécifications de Java EE6 fournissent l'élément <initialize-in-order> dans application.xml qui permet de contrôler l'ordre dans lequel les modules Java EE sont déployés dans un EAR.
Dans la plupart les cas, vous n'aurez pas besoin d'indiquer l'ordre de déploiement. Si votre application fait des injections de dépendances et des resource-refs pour se référer à des composants de modules externes, dans la plupart des cas, l'élément <initialize-in-order> ne sera pas requis car le serveur de l'application sera capable implicitement de déterminer la meilleure façon d'ordonnancer les composants.
Imaginons vous ayez une application qui contient un myBeans.jar et un myApp.war regroupés dans un myApp.ear, et un servlet dans myApp.war qui utilise une annotation @EJB pour injecter un bean à partir de myBeans.jar, alors, le serveur d'application aura les informations nécessaires pour veiller à ce que le composant EJB soit disponible avant que le servlet ne démarre et vous n'êtes pas obligé d'utiliser l'élément <initialize-in-order>.
Cependant, si ce servlet utilise l'ancien style de référence JNDI lookup distant comme suit pour accéder au bean, vous devrez spécifier l'ordonnancement des modules.
init() {
  Context ctx = new InitialContext();
  ctx.lookup("TheBeanInMyBeansModule");
}
Dans ce cas, le serveur n'est pas en mesure de déterminer que le composant EJB se trouve dans myBeans.jar et vous devrez vous assurer que les composants du myBeans.jar soient initialisés et démarrés avant les composants qui se trouvent dans myApp.war. Pour cela, définir l'élément <initialize-in-order> à true et indiquer l'ordre des modules myBeans.jar et myApp.war dans le fichier application.xml.
Voici un exemple qui utilise l'élément <initialize-in-order> pour contrôler l'ordre de déploiement. Le myBeans.jar est déployé avant le fichier 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>
Le schéma du fichier application.xml se trouve ici http://java.sun.com/xml/ns/javaee/application_6.xsd.

Note

Vous devez savoir que lorsque vous définissez l'élément <initialize-in-order> à true, vous ralentissez le déploiement. Il est préférable de définir les dépendances appropriées à l'aide d'injections de dépendances ou de ref-ressources, ce qui donne au contenant une plus grande souplesse en matière d'optimisation des déploiements.
jboss-ejb3.xml
Le descripteur de déploiement jboss-ejb3.xml remplace le descripteur de déploiement jboss.xml et s'ajoute aux fonctions fournies par le descripteur de déploiement ejb-jar.xml fourni dans Java Enterprise Edition (EE). Le nouveau fichier est incompatible avec jboss.xml, et le fichier jboss.xml est maintenant ignoré dans les déploiements.
login-config.xml
Le fichier login-config.xml n'est plus utilisé dans la configuration de la sécurité. La sécurité est maintenant configurée dans l'élément <security-domain> du fichier de configuration du serveur. Pour le serveur autonome, il s'agit du fichier standalone/configuration/standalone.xml. Si vous exécutez votre serveur dans un domaine géré, il s'agit du fichier domain/configuration/domain.xml.

3.1.3.2. jboss-deployment-structure.xml

jboss-deployment-structure.xml est un descripteur de déploiement optionnel de JBoss EAP 6. Ce descripteur de déploiement fournit un contrôle de chargement des classes dans le déploiement.
Le schéma XML de ce descripteur de déploiement se trouve dans EAP_HOME/docs/schema/jboss-deployment-structure-1_2.xsd

3.1.3.3. Empaquetage des ressources dans le nouveau système de chargement des classes modulaires

Résumé

Dans les versions précédentes de JBoss EAP, toutes les ressources qui se trouvaient à l'intérieur du répertoire WEB-INF/ étaient ajoutées au chemin WAR. Dans JBoss EAP 6, les artefacts d'applications web ne sont chargés qu'à partir des répertoires WEB-INF/classes et WEB-INF/lib. Les erreurs d'empaquetage d'artefacts d'applications dans les emplacements spécifiés peuvent résulter en ClassNotFoundException, NoClassDefError, ou autres erreurs de runtime.

Pour résoudre ces erreurs de chargement de classes, vous devez soit modifier la structure de votre archive d'application, ou bien définir un module personnalisé.

Modifier l'empaquetage des ressources
Pour que les ressources ne soient disponibles qu'aux applications, vous devez grouper les fichiers de propriétés, les JAR, ou autres artefacts avec le WAR en les déplaçant dans le répertoire WEB-INF/classes/ ou WEB-INF/lib/. Cette approche est décrite en détails dans : Section 3.1.3.4, « Changer l'emplacement des propriétés de ResourceBundle »
Créer un module personnalisé
Si vous souhaitez rendre les ressources personnalisées disponibles auprès de toutes les applications exécutant sur le serveur JBoss EAP 6, vous devrez créer un module personnalisé. Cette approche est décrite en détails dans : Section 3.1.3.5, « Créer un module personnalisé »

3.1.3.4. Changer l'emplacement des propriétés de ResourceBundle

Résumé

Dans les versions précédentes de JBoss EAP, le répertoire EAP_HOME/server/SERVER_NAME/conf/ se trouvait dans le chemin de classe disponible à l'application. Pour rendre les propriétés disponibles sur le chemin de classe de l'application dans JBoss EAP 6, vous devez les empaqueter dans votre application.

Procédure 3.2. Changer l'emplacement des propriétés de ResourceBundle

  1. Si vous déployez une archive WAR, vous devez empaqueter ces propriétés dans le dossier WEB-INF/classes/ du WAR.
  2. Si vous voulez que ces propriétés soient accessibles à toutes les composantes d'un EAR, alors vous devrez les empaqueter dans un JAR, en tant que root, puis mettre le JAR dans le dossier lib/ du EAR.

3.1.3.5. Créer un module personnalisé

La procédure suivante décrit comment créer un module personnalisé pour rendre les fichiers de propriétés et les autres ressources disponibles à toutes les applications qui exécutent sur le serveur JBoss EAP.

Procédure 3.3. Créer un module personnalisé

  1. Créer et compléter la structure de répertoire module/.
    1. Créer une structure de répertoire sous le répertoire EAP_HOME/module qui contienne les fichiers et les JAR.
      $ cd EAP_HOME/modules/ 
      $ mkdir -p myorg-conf/main/properties
    2. Déplacer les fichiers de propriétés dans le répertoire EAP_HOME/modules/myorg-conf/main/properties/ que vous avez créé à l'étape précédente.
    3. Créer un fichier module.xml dans le répertoire EAP_HOME/modules/myorg-conf/main/ qui contienne l'XML suivant :
      <module xmlns="urn:jboss:module:1.1" name="myorg-conf">
          <resources>
              <resource-root path="properties"/>
          </resources>
      </module>
  2. Modifier le sous-système ee du fichier de configuration du serveur. Vous pouvez utiliser l'interface en ligne de commande JBoss CLI, ou bien, vous pouvez éditer le fichier manuellement.
    • Suivez ces étapes pour modifier le fichier de configuration du serveur par l'interface en ligne de commande JBoss CLI.
      1. Démarrez le serveur et connectez-vous au Management CLI.
        • Dans Linux, saisir ce qui suit au niveau de la ligne de commande :
           EAP_HOME/bin/jboss-cli.sh --connect
        • Dans Windows, saisir ce qui suit au niveau de la ligne de commande :
          C:\>EAP_HOME\bin\jboss-cli.bat --connect
        Vous devriez voir apparaître le résultat suivant :
        Connected to standalone controller at localhost:9999
      2. Pour créer l'élément <global-modules> myorg-conf dans le sous-système ee, saisir ce qui suit dans la ligne de commande :
        /subsystem=ee:write-attribute(name=global-modules, value=[{"name"=>"myorg-conf","slot"=>"main"}])
        Vous devriez voir apparaître le résultat suivant :
        {"outcome" => "success"}
    • Suivre ces étapes si vous préférez éditer manuellement le fichier de configuration du serveur.
      1. Arrêter le serveur et ouvrir le fichier de configuration du serveur dans un éditeur de texte. Si vous exécutez sur un serveur autonome, il s'agira du fichier EAP_HOME/standalone/configuration/standalone.xml ou du fichier EAP_HOME/domain/configuration/domain.xml si vous exécutez sur un domaine géré.
      2. Chercher le sous-système ee et ajouter le module global de myorg-conf. Ce qui suit est un exemple d'élément du sous-système ee modifié pour inclure l'élément myorg-conf :

        Exemple 3.1. élément myorg-conf

        <subsystem xmlns="urn:jboss:domain:ee:1.0" >            
            <global-modules>
                <module name="myorg-conf" slot="main" />            
            </global-modules>
        </subsystem>
  3. Si vous copiez un fichier nommé my.properties dans l'emplacement de module qui convient, vous pourrez alors charger les fichiers de propriétés en utilisant un code qui ressemble à ceci :

    Exemple 3.2. Télécharger le fichier de propriétés

    Thread.currentThread().getContextClassLoader().getResource("my.properties");

3.1.4. Changements au niveau du logging

3.1.4.1. Modifier les dépendances de journalisation

Résumé

JBoss LogManager supporte les serveurs frontaux pour tous les frameworks de journalisation, donc vous pouvez conserver votre code de journalisation actuel ou passer à la nouvelle infrastructure de journalisation de JBoss. Quelle que soit votre décision, à cause des changements au niveau du chargement de classes modulaires, vous devrez probablement modifier votre application pour ajouter les dépendances nécessaires.

3.1.4.2. Mise à jour du code d'application pour les frameworks de journalisation de tierce partie

Résumé

Dans JBoss EAP 6, les dépendances de journalisation des frameworks de tierce partie connus comme Apache Commons Logging, Apache log4j, SLF4J, et Java Logging sont ajoutées par défaut. Dans la plupart des cas, il est préférable d'utiliser le framework de journalisation fourni dans le conteneur JBoss EAP. Toutefois, si vous avez besoin de fonctionnalités spécifiques fournies par des frameworks de tierce partie, vous devrez exclure le module JBoss EAP correspondant de votre déploiement. Notez que même si votre déploiement utilise un framework de journalisation de tierce partie, les journaux du serveur continueront d'utiliser la configuration du sous-système de journalisation de JBoss EAP.

Les procédures suivantes montrent comment exclure le module org.apache.log4j de JBoss EAP 6 de votre déploiement. La première procédure fonctionne sur n'importe quelle version de JBoss EAP 6. La seconde procédure s'applique uniquement à JBoss EAP 6.3 ou version ultérieure.

Procédure 3.5. Configurer JBoss EAP 6 pour utiliser log4j.properties ou le fichier log4j.xml

Cette procédure fonctionne pour toutes les versions de JBoss EAP 6.

Note

Comme cette méthode utilise un fichier de configuration log4j, vous ne pourrez plus changer la configuration de journalisation log4j en cours d'exécution.
  1. Créer un jboss-deployment-structure.xml avec le contenu suivant :
    <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. Mettez le fichier jboss-deployment-structure.xml dans le répertoire META-INF/ ou WEB-INF/ si vous déployez un WAR, ou dans META-INF/ si vous déployez un EAR. Si votre déploiement inclut des déploiements dépendants supplémentaires, vous devrez également exclure le module de chaque sous-déploiement.
  3. Inclure log4j.properties ou le fichier log4j.xml dans le répertoire lib/ de votre EAR, ou dans le répertoire WEB-INF/classes/ de votre déploiement WAR. Si vous souhaitez mettre le fichier dans le répertoire lib/ de votre WAR, vous devrez spécifier le chemin <resource-root> dans le fichier 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. Démarrer le serveur JBoss EAP 6 avec l'argument de runtime suivant pour éviter de voir apparaître une exception ClassCastException de la console quand vous déployez une application :
    -Dorg.jboss.as.logging.per-deployment=false
  5. Déployer votre application.

Procédure 3.6. Configurer les dépendances de journalisation de JBoss EAP 6.3 ou version ultérieure

Dans JBoss EAP 6.3 et versions ultérieures, vous pouvez utiliser le nouvel attribut de système de journalisation add-logging-api-dependencies pour exclure des dépendances de framework de journalisation. Les étapes suivantes montrent comment modifier cet attribut de journalisation sur un serveur autonome JBoss EAP.
  1. Démarrer le serveur JBoss EAP 6 avec l'argument de runtime suivant pour éviter de voir apparaître une exception ClassCastException de la console quand vous déployez une application :
    -Dorg.jboss.as.logging.per-deployment=false
  2. Ouvrir un terminal et se connecter au Management CLI.
    • Dans Linux, saisir ce qui suit au niveau de la ligne de commande :
      $ EAP_HOME/bin/jboss-cli.sh --connect
      
    • Dans Windows, saisir ce qui suit au niveau de la ligne de commande :
      C:\>EAP_HOME\bin\jboss-cli.bat --connect
      
  3. Modifier l'attribut add-logging-api-dependencies du sous-système de journalisation.
    Cet attribut contrôle si le conteneur ajoute des dépendances d'API de journalisation implicites à votre déploiement.
    • Si défini à true, qui est la valeur par défaut, toutes les dépendances d'API de journalisation implicites seront ajoutées.
    • Si défini à false, les dépendances ne seront pas ajoutées à vos déploiements.
    Pour exclure les dépendances de framework de journalisation, vous devez définir cet attribut à false à l'aide de la commande suivante  :
    /subsystem=logging:write-attribute(name=add-logging-api-dependencies, value=false)
    Cette commande ajoute l'élément <add-logging-api-dependencies> au sous-système logging du fichier de configuration standalone.xml.
    <subsystem xmlns="urn:jboss:domain:logging:1.4">
        <add-logging-api-dependencies value="false"/>
        ....
    </subsystem>
    
  4. Déployer votre application.

3.1.4.3. Modifier le code pour utiliser le nouveau framework de JBoss Logging

Résumé

Pour utiliser le nouveau framework, vous devrez modifier vos importations et votre code comme suit :

Procédure 3.7. Modifier le code et les dépendances pour utiliser le nouveau framework de JBoss Logging

  1. Modifier vos importations et votre code de journalisation

    Voici un exemple de code qui utilise le framework de JBoss Logging :
    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. Ajouter la dépendance de journalisation

    Le JAR qui contient les classes de JBoss Logging se trouve dans le module intitulé org.jboss.logging. Votre fichier MANIFEST-MF devrait ressembler à ceci :
    Manifest-Version: 1.0
    Dependencies: org.jboss.logging
    

3.1.5. Changements au niveau packaging d'applications

3.1.5.1. Modifier l'empaquetage des EAR et des WAR

Résumé

Quand vous migrez votre application, vous devez modifier la structure d'empaquetage de votre EAR ou WAR en raison du changement de chargement de classe modulaire. Les dépendances de modules sont chargées dans l'ordre spécifique suivant :

  1. Dépendances Système
  2. Dépendances Utilisateur
  3. Ressources locales
  4. Dépendances d'inter-déploiement

Procédure 3.8. Modifier l'empaquetage des archives

  1. Empaqueter un WAR

    Un WAR est un module simple et toutes les classes du WAR sont chargées par le même chargeur de classes. Cela signifie que les classes packagées dans le répertoire WEB-INF/lib/ sont traitées de la même façon que les classes qui se trouvent dans le répertoire WEB-INF/classes.
  2. Empaqueter un EAR

    Un EAR se compose de plusieurs modules. Le répertoire EAR/lib/ est un module unique et chaque sous-déploiement de jar WAR ou EJB du EAR est un module séparé. Les classes n'ont pas accès aux classes dans d'autres modules du EAR, à moins que des dépendances explicites n'aient été définies. Les sous-déploiements ont toujours une dépendance automatique sur le module parent qui leur donne accès aux classes dans le répertoire EAR/lib/. Toutefois, les sous-déploiements n'ont pas toujours une dépendance automatique qui leur permette de passer de l'un à l'autre. Ce comportement est contrôlé en définissant l'élément <ear-subdeployments-isolated> dans la configuration du sous-système ee comme suit :
    <subsystem xmlns="urn:jboss:domain:ee:1.0" >            
      <ear-subdeployments-isolated>false</ear-subdeployments-isolated>
    </subsystem>
    Défini par défaut à false, ce qui permet aux sous-déploiements de voir les classes qui appartiennent aux autres sous-déploiements du EAR.
    Pour obtenir des informations supplémentaires sur le chargement de classes, voir le chapitre Class Loading and Modules (Chargement de classes et modules) du Development Guide (Guide de développement) de JBoss EAP 6 https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.

3.1.6. Changements au niveau de la configuration d'adaptateur de ressources et de source de données

3.1.6.1. Mise à jour de l'application en raison des changements de configuration

Dans JBoss EAP 5, les sous-systèmes et les services ont été configurés dans plusieurs fichiers différents. Dans JBoss EAP 6, la configuration est maintenant effectuée principalement dans un seul fichier. Si votre application utilise les ressources ou les services suivants, des modifications de configuration peuvent être nécessaires.
  1. Si votre application utilise une source de données, voir Section 3.1.6.2, « Mise à jour de la configuration de la source de données ».
  2. Si votre application utilise JPA et regroupe actuellement les JARS Hibernate, voir Section 3.1.6.4, « Configurer la source de données d'Hibernate ou JPA » pour vos options de migration.
  3. Si votre application utilise un adaptateur de ressources, voir Section 3.1.6.5, « Mise à jour de la configuration de l'adaptateur de ressources ».
  4. Pour obtenir plus d'informations sur la façon de configurer les changements pour augmenter le niveau de sécurité, voir Section 3.1.7.1, « Configurer les changements de sécurité d'applications ».

3.1.6.2. Mise à jour de la configuration de la source de données

Résumé

Dans les versions précédentes de JBoss EAP, la configuration de source de données JCA était définie dans un fichier par un suffixe *-ds.xml. Ce fichier était ensuite déployé sur le répertoire du serveur deployer/ ou fourni avec l'application. Le pilote JDBC était copié sur le répertoire du serveur server/lib/ ou fourni dans le répertoire WEB-INF/lib/ de l'application. Malgré que cette méthode de configuration de source de données soit toujours prise en charge pour le développement, il n'est pas recommandé pour la production parce qu'il n'est pas soutenu par les outils de gestion et administratifs de JBoss.

Dans JBoss EAP 6, la source de données est configurée dans le fichier de configuration du serveur. Si l'instance JBoss EAP 6 exécute dans un domaine géré, la source de données est configurée dans le domain/configuration/domain.xml du fichier. Si l'instance de la JBoss Enterprise Application Platform exécute comme un serveur autonome, la source de données est configurée dans le fichier standalone/configuration/standalone.xml. Les sources de données configurées de cette façon peuvent être gérées et contrôlées par les interfaces de gestion de JBoss, y compris par la Web Management Console et une interface de ligne de commande (CLI). Ces outils permettent de gérer des déploiements et de configurer plusieurs serveurs exécutant dans un domaine géré.
La section suivante décrit comment modifier votre configuration de source de données pour qu'elle puisse être gérée et supportée par les outils de gestion disponibles.
Migration vers une configuration de sources de données gérable pour JBoss EAP 6

Un pilote compatible JDBC 4.0 peut être installé sous forme de déploiement ou sous forme d'un module de base. Un pilote compatible JDBC 4.0 contient un fichier META-INF/services/java.sql.Driver qui indique le nom de classe du pilote. Un pilote qui n'est pas compatible JDBC 4.0 requiert des étapes supplémentaires. Pour plus d'informations sur la façon de rendre un pilote JDBC 4.0 compatible et comment mettre à jour votre configuration de source de données actuelle pour qu'elle soit gérable par la Web Management Console et la CLI, voir Section 3.1.6.3, « Installer et configurer le pilote JDBC ».

Si votre application utilise Hibernate ou JPA, elle a sans doute besoin de changements supplémentaires. Voir Section 3.1.6.4, « Configurer la source de données d'Hibernate ou JPA » pour plus d'informations.
Utiliser l'outil de migration IronJacamar pour convertir des données de configuration

Vous pouvez utiliser IronJacamar pour migrer les configurations de l'adaptateur de ressources et de source de données. Cet outil convertit les fichiers de configuration de style *-ds.xml en formats familiers à JBoss EAP 6. Pour plus d'informations, consulter : Section 4.1.6, « Utilisation de l'outil IronJacamar pour migrer les Configurations d'aptateurs de ressources et de sources de données ».

Migrer le code qui effectue des recherches de source de donnée distante

Dans les versions précédentes de JBoss EAP, il était possible effectuer une recherche JNDI distante d'objets de source de données, mais cela n'a jamais vraiment été pratiqué pour les raisons suivantes.

  • Le contrôle client d'une ressource de serveur n'est pas fiable et peut résulter par des fuites de communication si le client se plante ou perd la connexion au serveur.
  • La performance est lente car toutes les opérations de base de données sont traitées par un MBean.
  • La propagation de transaction n'est pas prise en charge.

Cette fonctionnalité a été supprimée dans JBoss EAP 6 et vous verrez sans doute une exception NotSerializableException quand vous migrez votre application. L'approche conseillée est de créer un EJB pour accéder à la source de données, puis appeler l'EJB à distance. Pour plus d'informations, voir la section de cet ouvrage intitulée Remote Invocation Changes. Vous trouverez des informations supplémentaires dans le guide Development Guide de JBoss EAP 6 dans https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.

3.1.6.3. Installer et configurer le pilote JDBC

Résumé

Le pilote JDBC peut être installé dans le conteneur d'une des manières suivantes :

  • Sous forme de déploiement
  • Sous forme de module de base
Les avantages et les inconvénients de chaque approche sont notés ci-dessous.

Dans JBoss EAP 6, la source de données est configurée dans le fichier de configuration du serveur. Si l'instance JBoss EAP 6 exécute dans un domaine géré, la source de données est configurée dans le domain/configuration/domain.xml du fichier. Si l'instance JBoss EAP 6 exécute comme un serveur autonome, la source de données est configurée dans le fichier standalone/configuration/standalone.xml. Les informations de référence schéma, qui sont identiques pour les deux modes, se trouvent dans le répertoire doc/ de JBoss EAP 6. Dans le but de cette discussion, assumez que le serveur exécute de façon autonome et que la source de données est configurée dans le fichier standalone.xml.

Procédure 3.9. Installer et configurer le pilote JDBC

  1. Installer le pilote JDBC.

    1. Installer le pilote JDBC sous forme de déploiement.

      C'est la méthode recommandée pour installer le pilote. Lorsque le pilote JDBC est installé comme un déploiement, il est déployé en tant que JAR ordinaire. Si l'instance de JBoss EAP 6 exécute en serveur autonome, copiez le JAR compatible JDBC 4.0 dans le répertoire EAP_HOME/standalone/deployments/. Si le serveur exécute en domaine géré, vous devez utiliser la Console de gestion ou le Management CLI pour déployer le JAR dans les groupes de serveurs.
      Voici un exemple de pilote MySQL JDBC installé sous forme de déploiement de serveur autonome :
      $cp mysql-connector-java-5.1.15.jar EAP_HOME/standalone/deployments/
      Tout pilote conforme JDBC 4.0 est automatiquement reconnu et installé dans le système avec son nom et sa version. Un JAR conforme JDBC 4.0 contient un fichier-texte nommé META-INF/services/java.sql.Driver qui indique les nom(s) de classes de pilote. Si le pilote n'est pas conforme JDBC 4.0, il peut être rendu déployable par l'un des moyens suivants :
      • Créer et ajouter un fichier java.sql.Driver au JAR dans le chemin META-INF/services/. Ce fichier doit contenir le nom de classe du pilote, par exemple :
        com.mysql.jdbc.Driver
      • Créer un fichier java.sql.Driver dans le répertoire de déploiement. Pour une instance de JBoss EAP 6 exécutant en serveur autonome, le fichier devra aller à l'emplacement suivant : EAP_HOME/standalone/deployments/META-INF/services/java.sql.Driver. Si le serveur est en domaine géré, vous devrez utiliser la Console de gestion ou le Management CLI pour déployer le fichier.
      Les avantages de cette approche :
      • Il s'agit de la méthode la plus aisée car il n'y a nul besoin de définir un module.
      • Quand le serveur exécute dans un domaine géré, les déploiements qui utilisent cette approche sont automatiquement propagés dans tous les serveurs du domaine. Cela signifie que l'administrateur n'a nul besoin de distribuer le pilote JAR manuellement.
      Les inconvénients de cette approche :
      • Si le pilote JDBC est constitué de plusieurs JAR, par exemple d'un JAR de pilote, et d'un JAR de licence dépendant ou d'un JAR de localisation, vous ne pouvez pas installer le pilote comme déploiement. Vous devrez alors installer le pilote JDBC comme un module de base.
      • Si le pilote n'est pas conforme à JDBC 4.0, un fichier doit être créé, contenant les noms de classe de pilote et il devra être importé dans le JAR ou bien être superposé dans le répertoire deployments/.
    2. Installer un pilote JDBC comme module de base.

      Pour installer un pilote JDBC comme module de base, vous devez installer une structure de chemin de fichier sous le répertoire EAP_HOME/modules/. Cette structure contiendra le JAR de pilote JDBC, tout JAR de localisation ou licence supplémentaire, et un fichier module.xml pour définir le module.
      • Installer un pilote MySQL JDBC comme module de base

        1. Créer la structure de répertoire de EAP_HOME/modules/com/mysql/main/
        2. Dans le sous-répertoire main/, créer un fichier module.xml qui contient la définition de module suivante pour le pilote 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>
          
          
          Le nom du module « com.mysql » doit correspondre à la structure du répertoire du module. L'élément <dependencies> est utilisé pour spécifier les dépendances de ce module sur les autres modules. Dans un tel cas, comme pour tous les cas comprenant des sources de données JDCB, il sera dépendant des API JDBC qui sont définis dans un autre module nommé javax.api. Ce module se trouve sous le répertoire modules/system/layers/base/javax/api/main/.

          Note

          Veillez à ne PAS laisser d'espace au début du fichier module.xml sinon, vous aurez l'erreur « New missing/unsatisfied dependencies » pour ce pilote.
        3. Copier le pilote JAR MySQL JDBC dans le répertoire EAP_HOME/modules/com/mysql/main/ :
          $ cp mysql-connector-java-5.1.15.jar EAP_HOME/modules/com/mysql/main/
      • Installer le pilote IBM DB2 JDBC et le JAR de licence en tant que module de base.

        Cet exemple est là pour vous démontrer comment déployer les pilotes qui requièrent des JAR en plus du JAR de pilote JDBC.
        1. Créer la structure de répertoire de EAP_HOME/modules/com/ibm/db2/main/
        2. Dans le sous-répertoire main/, créer un fichier module.xml qui contient la définition de module suivante pour le pilote et la licence DB2 JDBC :
          <?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>
          

          Note

          Veillez à ne PAS laisser d'espace au début du fichier module.xml sinon, vous aurez l'erreur « New missing/unsatisfied dependencies » pour ce pilote.
        3. Copier le pilote JDBC et le JAR de licence dans le sous-répertoire 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/
      Les avantages de cette approche :
      • Il s'agit de la seule approche qui fonctionne quand le pilote JDBC consiste en un JAR au moins.
      • Avec cette approche, les pilotes qui ne sont pas conformes à JDBC 4.0 peuvent être installés sans modifier le JAR de pilote ou créer un fichier superposé.
      Les inconvénients de cette approche :
      • Il est plus difficile de définir un module.
      • Le module doit être copié manuellement dans chaque serveur exécutant dans un domaine géré.
  2. Configurer la source de données.

    1. Ajouter le pilote de base de données.

      Ajouter l'élément <driver> à l'élément <drivers> du même fichier. Là aussi, il contiendra les mêmes informations de source de données que celles préalablement définies dans le fichier *-ds.xml.
      Déterminer tout d'abord si le pilote JAR est conforme à JDBC 4.0. Un JAR qui est conforme à JDBC 4.0 contient un fichier META-INF/services/java.sql.Driver qui indique le nom de la classe du pilote. Le serveur utilise ce fichier pour trouver le nom des classe(s) de pilote du JAR. Un pilote qui est conforme à JDBC 4.0 n'a pas besoin d'élément <driver-class> puisqu'il est déjà spécifié dans le JAR. Voici un exemple d'élément de pilote pour un pilote MySQL conforme JDBC 4.0 :
      <driver name="mysql-connector-java-5.1.15.jar" module="com.mysql"/>
      
      Un pilote qui est conforme JDBC 4.0 a besoin d'un attribut <driver-class> pour identifier la classe du pilote puisqu'il n'y a pas de fichier META-INF/services/java.sql.Driver qui spécifie le nom de classe du pilote. Il s'agit d'un exemple d'élément de pilote non conforme à 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. Créer la source de données.

      Créer un élément <datasource> dans la section <datasources> du fichier standalone.xml. Ce fichier contient plus ou moins les mêmes informations de source de données que celles préalablement définies dans le fichier *-ds.xml.

      Important

      Vous devez interrompre le serveur avant de modifier le fichier de configuration du serveur pour que votre changement puisse être persisté au redémarrage du serveur.
      Ce qui suit est un exemple d'élément de source de données MySQL du fichier 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. Mettre à jour les références JNDI dans le code d'application.

    Vous devez remplacer les noms de recherche JNDI obsolètes dans le code source d'application pour utiliser les nouveaux noms de source de données standardisés que vous aurez définis. Pour plus d'informations, consulter : Section 3.1.8.4, « Modifier l'application pour qu'elle puisse suivre les nouvelles règles d'espace noms JNDI ».
    Vous devrez également remplacer toute annotation @Resource existante qui accède à la source de données avec le nouveau nom JNDI. Par exemple :
    @Resource(name = "java:/YourDatasourceName").
    

3.1.6.4. Configurer la source de données d'Hibernate ou JPA

Si votre application utilise JPA et regroupe actuellement les JAR d'Hibernate, vous pouvez utiliser l'Hibernate qui est inclus dans JBoss EAP 6. Pour utiliser cette version d'Hibernate, vous devez supprimer l'ancien Hibernate de votre application.

Procédure 3.10. Supprimer le lot Hibernate

  1. Supprimer les JAR Hibernate de vos dossiers de bibliothèque d'applications.
  2. Supprimer et décommenter l'élément <hibernate.transaction.manager_lookup_class> de votre fichier persistence.xml car cet élément n'est pas utile.

3.1.6.5. Mise à jour de la configuration de l'adaptateur de ressources

Résumé

Dans les dernières versions du serveur d'applications, la configuration de l'adaptateur de ressources était définie dans un fichier ayant pour suffixe *-ds.xml. Dans JBoss EAP 6, un adaptateur de ressources est configuré dans le fichier de configuration du serveur. Si vous exécutez un domaine géré, le fichier de configuration est le fichier EAP_HOME/domain/configuration/domain.xml. Si vous exécutez en serveur autonome, configurez l'adaptateur de ressources dans le fichier EAP_HOME/standalone/configuration/standalone.xml. Vous pourrez trouver les informations de référence de schéma, identiques pour les deux modes, sous Schemas dans le site web IronJacamar à l'adresse suivante : http://www.ironjacamar.org/documentation.html.

Important

Vous devez interrompre le serveur avant de modifier le fichier de configuration du serveur pour que votre changement puisse être persisté au redémarrage du serveur.
Définir l'adaptateur de ressources

Les informations sur le descripteur d'adaptateur de ressources se trouvent dans le fichier de configuration du serveur, sous l'élément de sous-système suivant :

<subsystem xmlns="urn:jboss:domain:resource-adapters:1.1"/>
Vous allez utiliser certaines des informations qui étaient auparavant définies dans le fichier d'adaptateur de ressources *-ds.xml.

Ce qui suit est un exemple d'élément d'adaptateur de ressource du fichier de configuration du serveur :
<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. Changements au niveau sécurité

3.1.7.1. Configurer les changements de sécurité d'applications

Configurer la sécurité pour l'authentification de base

Dans les versions précédentes de JBoss EAP, les fichiers de propriétés qui se trouvent dans le répertoire EAP_HOME/server/SERVER_NAME/conf/ étaient sur un chemin de classe et on pouvait les trouver facilement par le UsersRolesLoginModule. Dans JBoss EAP 6, la structure du répertoire a changé. Les fichiers de propriétés doivent être empaquetés dans l'application pour les rendre disponibles par le chemin de classe.

Important

Vous devez interrompre le serveur avant de modifier le fichier de configuration du serveur pour que votre changement puisse être persisté au redémarrage du serveur.
Pour configurer la sécurité de l'authentification de base, ajouter un nouveau domaine de sécurité sous security-domains au standalone/configuration/standalone.xml ou au fichier de configuration du serveur 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 l'instance de JBoss EAP 6 exécute en tant que serveur autonome, ${jboss.server.config.dir} fait référence au répertoire EAP_HOME/standalone/configuration/. Si l'instance exécute en domaine géré, ${jboss.server.config.dir} fait référence au répertoire EAP_HOME/domain/configuration/.
Modifier les noms de domaine de sécurité

Dans JBoss EAP 6, les domaines de sécurité n'utilisent plus le préfixe java:/jaas/ dans leurs noms.

  • Pour les applications web, vous devez supprimer ce préfixe des configurations du domaine de sécurité dans le fichier jboss-web.xml.
  • Dans les applications Enterprise, vous devez supprimer ce préfixe des configurations du domaine de sécurité dans le fichier jboss-ejb3.xml. Ce fichier remplace le fichier jboss.xml de JBoss EAP 6.

3.1.8. Changements JNDI

3.1.8.1. Mise à jour des noms d'espace-noms JNDI d'application

Résumé

EJB 3.1 introduit un espace-noms JNDI global standardisé et une série d'espace-noms connexes qui mappent vers les différents scopes d'une application Java EE. Les noms EJB portables ne peuvent se rattacher qu'à trois d'entre eux : java:global, java:module, et java:app. Les applications avec EJBs qui utilisent JNDI doivent être mises à jour à la nouvelle convention d'espace-noms JNDI standardisée.

Exemple de mappings JNDI

Des exemples d'espace-noms JNDI de versions précédentes et des informations sur la façon dont ils peuvent être spécifiés dans JBoss EAP 6 peuvent être consultés ici : Section 3.1.8.5, « Exemples d'espace noms JNDI de versions antérieures et la façon dont ils sont spécifiés dans JBoss EAP 6 »

3.1.8.2. Noms JNDI EJB portables

Résumé

La spécification Java EE6 définit quatre espace-noms logiques, ayant chacun son propre scope mais les noms EJB ne sont rattachés qu'à trois d'entre eux. Le tableau suivante explique quand et comment utiliser chaque espace-nom.

Tableau 3.1. Espace-nom JNDI portable

Espace-nom JNDI Description
java:global
Les noms sont partagés par toutes les applications déployées dans une instance de serveur d'applications. Utiliser les noms de cet espace-nom pour rechercher des EJBs d'archives externes déployés dans le même serveur.
Ce qui suit est un exemple d'espace-nom java:global namespace : java:global/jboss-seam-booking/jboss-seam-booking-jar/HotelBookingAction
java:module
Dans cet espace-nom, les noms sont partagés par tous les composants d'un module, c'est à dire et par exemple, tous les beans Enterprise d'un module EJB unique ou tous les composants d'un module web.
Ce qui suit est un exemple d'espace-nom java:global : java:module/HotelBookingAction!org.jboss.seam.example.booking.HotelBooking
java:app
Les noms sont partagés par tous les composants dans tous les modules d'une simple application. Ainsi, un WAR ou fichier jar EJB du même fichier EAR aura accès à toutes les ressources dans l'espace-nom java:app.
Ce qui suit est un exemple d'espace-nom java:app : java:app/jboss-seam-booking-jar/HotelBookingAction
Vous trouverez des informations supplémentaires sur les contextes de nommage JNDI dans la section EE.5.2.2, "Application Component Environment Namespaces" dans "JSR 316: JavaTM Platform, Enterprise Edition (Java EE) Specification, v6". Vous pouvez télécharger la spécification à partir de : http://jcp.org/en/jsr/detail?id=316

3.1.8.3. Revue des règles d'espace-noms JNDI

Résumé

JBoss EAP 6 s'est améliorée au niveau desnoms d'espace-noms JNDI, non seulement afin de fournir des règles prévisibles et cohérentes pour chaque nom lié du serveur d'applications, mais aussi pour éviter des problèmes de compatibilité à venir. Cela signifie que vous pouvez vous heurter à des problèmes d'espaces-noms dans votre application, s'ils ne suivent pas les nouvelles règles.

Les espace-noms doivent suivre les règles suivantes :

  1. Les noms relatifs non qualifiés tels que DefaultDS ou jdbc/DefaultDS doivent être qualifiés par rapport à java:comp/env, java:module/env, ou java:jboss/env, selon le contexte.
  2. Les noms non qualifiés tels que les noms absolute comme /jdbc/DefaultDS doivent être qualifiés par rapport à un nom java:jboss/root.
  3. Les noms qualifiés complets tels que java:/jdbc/DefaultDS doivent être qualifiés de la même façon que les noms complets non qualifiés ci-dessus.
  4. L'espace-nom java:jboss en particulier est partagé par toute l'instance de serveur AS.
  5. Tout nom relative ayant pour préfixe java: doit correspondre à l'un des cinq espace-noms : comp, module, app, global, ou jboss propriétaire. Tout nom commençant par java:xxx et dont xxx ne correspond pas à l'un des cinq espace-noms ci-dessous, résulterait en une erreur de nom non valide.

3.1.8.4. Modifier l'application pour qu'elle puisse suivre les nouvelles règles d'espace noms JNDI

  • Voici un exemple de recherche JNDI dans JBoss EAP 5.1. On trouve normalement ce code dans la méthode d'initialisation.
    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);
    }
    
    Notez que le nom de recherche est OrderManagerApp/ProductManagerBean/local.
  • Ce qui suit est un exemple qui montre comment une même recherche serait codifiée dans JBoss EAP 6 suite à l'injection d'une dépendance.
    @EJB(lookup="java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager")
    private ProductManager productManager;
    
    Les valeurs de recherche sont maintenant définies comme variables de membre et utilisent le nouveau nom d'espace nom JNDI portable java:app java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager.
  • Si vous préférez ne pas utiliser une injection de dépendance, vous pouvez toujours créer le nouvel InitialContext comme ci-dessus et modifier la recherche pour utiliser le nouvel espace nom 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. Exemples d'espace noms JNDI de versions antérieures et la façon dont ils sont spécifiés dans JBoss EAP 6

Tableau 3.2. Table de mappage d'espace noms JNDI

Espace noms dans JBoss EAP 5.x Espace noms dans JBoss EAP 6 Commentaires supplémentaires
OrderManagerApp/ProductManagerBean/local java:module/ProductManagerBean!services.ejb.ProductManager Liaison standard Java EE6, étendue au module en cours et accessible uniquement dans le même module
OrderManagerApp/ProductManagerBean/local java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager Liaison standard Java EE6, étendue à l'application en cours et accessible uniquement dans la même application.
OrderManagerApp/ProductManagerBean/local java:global/OrderManagerApp/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager Liaison standard Java EE6, étendue au serveur d'application en cours et accessible globalement.
java:comp/UserTransaction java:comp/UserTransaction Espace nom étendu au composant en cours. Non Accessible pour les threads non EE, comme des threads que votre application crée directement.
java:comp/UserTransaction java:jboss/UserTransaction Accessible globalement. À utiliser si java:comp/UserTransaction n'est pas disponible
java:/TransactionManager java:jboss/TransactionManager  
java:/TransactionSynchronizationRegistry java:jboss/TransactionSynchronizationRegistry  

3.1.9. Mapper les attributs de connecteurs HTTP/HTTPS/AJP

3.1.9.1. Mapper les attributs de connecteurs HTTP/HTTPS/AJP

Le tableau suivant montre comment mapper les attributs de connecteurs HTTP, HTTPS et AJP d'anciennes versions aux nouveaux attributs de Red Hat JBoss Enterprise Application Platform 6.

Tableau 3.3. Mapper les attributs de connecteurs

Nom d'attribut d'ancienne version Équivalent dans JBoss EAP 6 Détails
maxThreads max-connections Cet attribut dimensionne le pool de thread/connexion au niveau JBossWeb. Il est défini sur tous les connecteurs dans le sous-système du web. La valeur par défaut est 512 par processeur.
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http" enabled="true" max-connections="200" />
minSpareThreads
maxSpareThreads
S/O Il n'y a pas d'équivalent pour minSpareThreads ou maxSpareThreads puisqu'il n'y a guère d'incitation à conserver les threads. Si vous utilisez un exécuteur pour le connecteur au lieu du pool de threads de worker par défaut, les équivalents les plus proches seraient les attributs de taille de core-threads et les attributs keepalive-time.
proxyName
proxyPort
proxy-name
proxy-port
Cet attribut est défini sur le connector qui se trouve dans le sous-système web.
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http" enabled="true" proxy-name="proxy.com" proxy-port="80"/>
redirectPort
redirect-port
Cet attribut est défini sur le connector qui se trouve dans le sous-système web.
connector name="http" protocol="HTTP/1.1" scheme="https" secure="true" socket-binding="http" 
           redirect-port="8443" proxy-name="loadbalancer.hostname.com" proxy-port="443"
enableLookups
enable-lookups
Cet attribut est défini sur le connector qui se trouve dans le sous-système web.
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http" enable-lookups="true"/>"
MaxHttpHeaderSize
System Property Cet attribut est défini par les propriétés système. La valeur par défaut est de 8 Ko.
<system-properties>
    <property name="org.apache.coyote.http11.Http11Protocol.MAX_HEADER_SIZE" value="8192"/>
</system-properties>
maxKeepAliveRequests
System Property Cet attribut est défini par les propriétés système.
<system-properties>
    <property name="org.apache.coyote.http11.Http11Protocol.MAX_KEEP_ALIVE_REQUESTS" value="1"/>
</system-properties>
connectionTimeout
System Property Cet attribut est défini par les propriétés système. Les configurations suivantes définissent le timeout de connexion AJP à 600000 millisecondes (10 minutes) et le timeout de connexion HTTP à 120000 millisecondes (2 minutes).
<system-properties>
    <!-- connectionTimeout for AJP connector. Default value is "-1" (no timeout). -->
    <property name="org.apache.coyote.ajp.DEFAULT_CONNECTION_TIMEOUT" value="600000"/>
    <!-- connectionTimeout for HTTP connector. Default value is "60000". -->
    <property name="org.apache.coyote.http11.DEFAULT_CONNECTION_TIMEOUT" value="120000"/>
</system-properties>
compression
System Property Cet attribut permet la compression. Vous pouvez spécifier le type de contenu, qui, par défaut, est text/html, text/xml, text/plain. Vous pouvez également spécifier la taille minimale du contenu qui doit être compressé, qui, par défaut, est 2048 octets. La compression est définie à l'aide des propriétés système.
<system-properties>
    <property name="org.apache.coyote.http11.Http11Protocol.COMPRESSION" value="on"/>
    <property name="org.apache.coyote.http11.Http11Protocol.COMPRESSION_MIN_SIZE" value="4096"/>
    <property name="org.apache.coyote.http11.Http11Protocol.COMPRESSION_MIME_TYPES" value="text/javascript,text/css,text/html"/>
</system-properties>
URIEncoding
System Property Cet attribut est défini par les propriétés système.
<system-properties>
    <property name="org.apache.catalina.connector.URI_ENCODING" value="UTF-8"/>
</system-properties>
useBodyEncodingForURI
System Property Cet attribut est défini par les propriétés système.
<system-properties>
    <property name="org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING" value="true"/>
</system-properties>
server
System Property Cet attribut est défini par les propriétés système.
<system-properties>
    <property name="org.apache.coyote.http11.Http11Protocol.SERVER" value="NewServerHeader"/>
 </system-properties>
allowTrace
System Property Cet attribut est défini par les propriétés système.
<system-properties>
    <property name="org.apache.catalina.connector.ALLOW_TRACE " value="true"/>
 </system-properties>
xpoweredby
System Property Cet attribut est défini par les propriétés système.
<system-properties>
    <property name="org.apache.catalina.connector.X_POWERED_BY " value="true"/>
 </system-properties>
keepAliveTimeout
S/O
Avant JBoss EAP 6.4, il y n'avait aucun paramètre équivalent dans JBoss EAP 6. En interne, la valeur par défaut correspondait à connectionTimeout.
Dans JBoss EAP 6.4, une nouvelle propriété système, org.apache.coyote.http11.DEFAULT_KEEP_ALIVE_TIMEOUT, a été introduite pour contrôler le keepAliveTimeout. L'argument -Dorg.apache.coyote.http11.DEFAULT_KEEP_ALIVE_TIMEOUT prend effet lorsqu'il est utilisé en combinaison à l'argument -Dorg.apache.coyote.http11.DEFAULT_DISABLE_UPLOAD_TIMEOUT=true.
disableUploadTimeout
connectionUploadTimeout
S/O
Il n'y a pas de paramètres équivalents dans JBoss EAP 6. La valeur du disableUploadTimeout est définie à true par défaut, et le connectionUploadTimeout utilise la valeur connectionTimeout en interne.
packetSize
System Property Cet attribut est défini par les propriétés système. Les configurations suivantes définissent la taille AJP packetSize à 20000
<system-properties>
    <property name="org.apache.coyote.ajp.MAX_PACKET_SIZE" value="20000"/>
</system-properties>
maxPostSize
maxSavePostSize
max-post-size
max-save-post-size
La valeur 0 signifie « illimitée ». Notez bien que ce paramètre peut limiter la taille des données uniquement quand un Content-Type est de type application/x-www-form-urlencoded. Pour plus d'informations, voir la solution dans le Portail client : How to limit data size of HTTP POST method from a client to JBoss
tomcatAuthentication
System Property
Suivant la version de JBoss EAP 6, cet attribut est défini pour utiliser la propriété système org.apache.coyote.ajp.AprProcessor.TOMCATAUTHENTICATION ou org.apache.coyote.ajp.DEFAULT_TOMCAT_AUTHENTICATION. Un correctif ou une mise à niveau sont requis pour toutes les versions du serveur.
Dans JBoss EAP 6.0.1, tomcatAuthentication est configuré en utilisant la propriété suivante.
<system-properties>
    <property name="org.apache.coyote.ajp.AprProcessor.TOMCATAUTHENTICATION" value="false"/>
</system-properties>
Dans JBoss EAP 6.1 et versions ultérieures , tomcatAuthentication est configuré de la façon suivante :
<system-properties>
    <property name="org.apache.coyote.ajp.DEFAULT_TOMCAT_AUTHENTICATION" value="false"/>
</system-properties>
Pour obtenir davantage d'informations, voir cette solution dans le Portail client : How to configure tomcatAuthentication in JBoss EAP 6
Pour obtenir davantage d'informations sur les attributs de connecteurs, voir cette solution dans le Portail client : Equivalent HTTP/HTTPS/AJP connector attributes mapping between JBoss EAP 5.x and JBoss EAP 6.x