Kapitel 3. Migrieren Sie Ihre Applikation

3.1. Von den meisten Applikationen benötigte Änderungen

3.1.1. Prüfung der von den meisten Applikationen benötigten Änderungen

Klassenlade- und Konfigurationsänderungen in der JBoss EAP 6 haben Einfluss auf fast jede Applikation. Die JBoss EAP 6 verwendet außerdem standardmäßig portierbare JNDI-Namensgebungssyntax. Diese Änderungen betreffen fast alle Applikationen, so dass wir empfehlen, dass Sie die nachfolgenden Informationen lesen, ehe Sie mit der Migration Ihrer Applikation beginnen.

3.1.2. Änderungen beim Klassenladen

3.1.2.1. Aktualisierung der Applikation aufgrund von Klassenladeänderungen

Beim modularen Laden von Klassen handelt es sich um eine maßgebliche Änderung in der JBoss EAP 6, die auf fast alle Applikationen Auswirkungen hat. Sehen Sie sich zunächst die folgenden Informationen an, ehe Sie Ihre Applikation migrieren.
  1. Sehen Sie sich zuerst an, wie Ihr Applikation gepackt ist und welche Abhängigkeiten Sie besitzt. Weitere Informationen finden Sie hier Abschnitt 3.1.2.3, »Aktualisierung der Applikationsabhängigkeiten aufgrund von Klassenladeänderungen«
  2. Falls Ihre Applikation ein Protokoll führt, so müssen Sie die korrekten Modulabhängigkeiten festlegen. Unter Abschnitt 3.1.4.1, »Bearbeitung von Protokollierungsabhängigkeiten« erfahren Sie mehr dazu.
  3. Aufgrund der Änderungen beim modularen Klassenladen kann es sein, dass Sie die Packstruktur Ihres EAR oder WAR ändern müssen. Weitere Informationen finden Sie unter Abschnitt 3.1.5.1, »Modifizierung des Packagings von EARs und WARs« .

3.1.2.2. Modulabhängigkeiten verstehen

Zusammenfassung

Ein Modul kann nur auf seine eigenen Klassen zugreifen sowie auf die Klassen eines Moduls von dem es eine implizite oder explizite Abhängigkeit besitzt.

Prozedur 3.1. Modulabhängigkeiten verstehen

  1. Implizite Modulabhängigkeiten verstehen

    Die Deployer innerhalb des Servers fügen implizit automatisch einige häufig verwendete Modulabhängigkeiten hinzu, wie etwa javax.api und sun.jdk. Dies macht die Klassen für das Deployment zur Runtime sichtbar, so dass der Entwickler die Abhängigkeiten nicht explizit hinzufügen muss. Informationen dazu, wie und wann diese impliziten Abhängigkeiten hinzugefügt werden, finden Sie unter Implicit Module Dependencies im Kapitel Class Loading and Modules des Development Guide für die JBoss EAP 6 unter https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.
  2. Explizite Modulabhängigkeiten verstehen

    Für andere Klassen müssen Module explizit festgelegt werden, da die fehlenden Abhängigkeiten ansonsten zu Deployment- oder Runtime-Fehlern führen. Falls eine Abhängigkeit fehlt, so sehen Sie ClassNotFoundExceptions oder NoClassDefFoundErrors-Traces im Serverprotokoll. Lädt mehr als ein Moduldasselbe JAR oder ein Modul lädt eine Klasse, die eine von einem anderen Modul geladene Klasse erweitert, so sehen Sie ClassCastExceptions-Traces im Serverprotokoll. Um Abhängigkeiten explizit festzulegen, bearbeiten Sie MANIFEST.MF oder erstellen Sie eine JBoss-spezifische Deployment-Deskriptor-Datei jboss-deployment-structure.xml. Weitere Informationen zu Modulabhängigkeiten finden Sie unter Overview of Class Loading and Modules im Kapitel Class Loading and Module des Development Guide für die JBoss EAP 6 unter https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.

3.1.2.3. Aktualisierung der Applikationsabhängigkeiten aufgrund von Klassenladeänderungen

Zusammenfassung

Das Laden von Klassen unterscheidet sich bei der JBoss EAP 6 maßgeblich von früheren Versionen der JBoss EAP. Das Klassenladen basiert jetzt auf dem JBoss Modulprojekt. Statt eines einzelnen, hierarchischen Klassenladers, der alle JARs in einen flachen Klassenpfad lädt, wird jede Bibliothek zu einem Modul, das sich nur mit dem Modul verbindet, von dem es abhängt. Deployments in der JBoss EAP 6 sind ebenfalls Module und haben keinen Zugriff auf in JARs im Applikationsserver definierten Klassen, außer es wurde eine explizite Abhängigkeit von diesen Klassen definiert. Einige vom Applikationsserver definierte Modulabhängigkeiten werden automatisch für Sie eingestellt. Wenn Sie etwa eine Java EE Applikation deployen, so wird Ihrem Modul automatisch eine Abhängigkeit vom Java EE API hinzugefügt. Eine vollständige Liste automatisch hinzugefügter Abhängigkeiten finden Sie unter Implicit Module Dependencies im Kapitel Class Loading and Modules des Development Guide für die JBoss EAP 6 unter https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.

Aufgaben

Wenn Sie Ihre Applikation zur JBoss EAP 6 migrieren, so kann es sein, dass Sie aufgrund der modularen Klassenladeänderungen eine der folgenden Aufgaben ausführen müssen:

3.1.3. Änderungen bei Konfigurationsdateien

3.1.3.1. Erstellen oder Bearbeiten von Dateien, die das Klassenladen in der in der JBoss EAP 6 steuern

Zusammenfassung

Aufgrund der Änderungen in der JBoss EAP 6 zur Verwendung modularen Klassenladens, müssen Sie möglicherweise eine oder mehrere Dateien bearbeiten oder erstellen, um Abhängigkeiten hinzuzufügen oder das Laden automatischer Abhängigkeiten zu verhindern. Weitere Informationen zum Laden von Klassen oder Klassenladepräzedenz finden Sie im Kapitel Class Loading and Modules des Development Guide für die JBoss Enterprise Application Platform 6 unter https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.

Die folgenden Dateien werden zur Steuerung des Ladens von Klassen in der JBoss EAP 6 verwendet.
jboss-web.xml
Falls Sie ein <class-loading>-Element in der jboss-web.xml-Datei definiert haben, so müssen Sie dieses entfernen. Das Verhalten, das dies in der JBoss EAP 5 hervorrief, ist jetzt das standardmäßige Klassenladeverhalten in der JBoss EAP 6, so dass dies nicht länger notwendig ist. Falls Sie dieses Element nicht entfernen, so erscheint im Serverprotokoll ein ParseError und eine XMLStreamException.
Dies ist ein Beispiel eines herauskommentierten <class-loading>-Elements in der jboss-web.xml-Datei.
<!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
Manuell bearbeitet
Je nachdem, welche Komponenten oder Module Ihre Applikation verwendet, werden Sie dieser Datei eine oder mehrere Abhängigkeiten hinzufügen müssen. Sie können diese entweder als Dependencies- oder Class-Path-Einträge hinzufügen.
Nachfolgend sehen Sie ein von einem Entwickler bearbeitetes MANIFEST.MF:
Manifest-Version: 1.0
Dependencies: org.jboss.logmanager
Class-Path: OrderManagerEJB.jar

Falls Sie diese Datei bearbeiten, vergessen Sie bitte nicht, ein "Newline"-Zeichen am Ende der Datei hinzuzufügen.
Mittels Maven generiert
Falls Sie Maven verwenden, so müssen Sie Ihre pom.xml-Datei bearbeiten, um die Abhängigkeiten für die MANIFEST.MF-Datei zu generieren. Falls Ihre Applikation EJB 3.0 verwendet, so haben Sie vielleicht einen Abschnitt in der pom.xml-Datei, der wie folgt aussieht:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-ejb-plugin</artifactId>
    <configuration>
        <ejbVersion>3.0</ejbVersion>
    </configuration>
</plugin>
Falls der EJB 3.0 Code org.apache.commons.log verwendet, so benötigen Sie diese Abhängigkeit in der MANIFEST.MF-Datei. Um diese Abhängigkeit zu generieren, fügen Sie das <plugin>-Element wie folgt der pom.xml-Datei hinzu:
<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>
Im Beispiel oben muss die src/main/resources/META-INF/MANIFEST.MF-Datei nur den folgenden Abhängigkeitseintrag enthalten:
Dependencies: org.apache.commons.logging
Maven generiert die vollständige MANIFEST.MF-Datei:
Manifest-Version: 1.0
Dependencies: org.apache.commons.logging
jboss-deployment-structure.xml
Bei dieser Datei handelt es sich um einen für JBoss spezifischen Deployment-Deskriptor, der zur Steuerung des Klassenladens auf feinkörnige Weise verwendet werden kann. Wie auch MANIFEST.MF kann diese Datei für die Hinzufügung von Abhängigkeiten verwendet werden. Sie kann auch die Hinzufügung automatischer Abhängigkeiten verhindern, zusätzliche Module definieren, das isolierte Klassenladeverhalten eines EAR-Deployments ändern und einem Modul zusätzliche Ressourcen-roots hinzufügen.
Nachfolgend sehen Sie das Beispiel einer jboss-deployment-structure.xml-Datei, die eine Abhängigkeit für das JSF 1.2 Modul hinzufügt und das automatische Laden für das JSF 2.0 verhindert.
<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>
Weitere Informationen zu dieser Datei finden SIe unter: Abschnitt 3.1.3.2, »jboss-deployment-structure.xml«.
application.xml
In früheren Versionen der JBoss EAP wurde die Reihenfolge der Deployments innerhalb eines EAR mittels der jboss-app.xml-Datei gesteuert. Dies ist nicht mehr der Fall. Die Java EE6 Spec liefert das <initialize-in-order>-Element in der application.xml, mit der die Reihenfolge des Deployments der Java EE Module innerhalb eines EAR gesteuert wird.
In den meisten Fällen brauchen Sie keine Deployment-Reihenfolge festzulegen. Verwendet Ihre Applikation Abhängigkeitseinspeisungen und resource-refs zum Bezug auf externe Module. In den meisten Fällen wird das <initialize-in-order>-Element nicht benötigt, da der Applikationsserver implizit die korrekte und optimale Weise der Komponentenreihenfolge bestimmen kann.
Angenommen Sie haben eine Applikation, die ein myBeans.jar und ein myApp.war innerhalb eines myApp.ear enthält. Ein Servlet im myApp.war verwendet eine @EJB-Annotation, um ein Bean aus myBeans.jar einzuspeisen. In diesem Fall besitzt der Applikationsserver die entsprechenden Informationen um sicherzustellen, dass die EJB-Komponente verfügbar ist, ehe das Servlet gestartet wird, und Sie müssen das <initialize-in-order>-Element nicht benutzen.
Falls dieses Servlet jedoch ältere Remote-Verweise im JNDI-Lookup-Stil verwendet wie nachfolgend für den Zugriff auf das Bean verwendet, so kann es sein, dass Sie die Modulreihenfolge festlegen müssen.
init() {
  Context ctx = new InitialContext();
  ctx.lookup("TheBeanInMyBeansModule");
}
In diesem Fall kann der Server nicht bestimmen, dass sich die EJB-Komponente im myBeans.jar befindet, und Sie müssen erzwingen, dass die Komponenten im myBeans.jar vor den Komponenten in myApp.war initialisiert und gestartet werden. Um dies zu tun setzen Sie das <initialize-in-order>-Element auf true und legen die Reihenfolge der myBeans.jar- und myApp.war-Modules in der application.xml-Datei fest.
Nachfolgend sehen Sie ein Beispiel, das das <initialize-in-order>-Element zur Steuerung der Deployment-Reihenfolge verwendet. Das myBeans.jar wird vor der myApp.war-Datei deployt.
<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>
Das Schema für die application.xml finden Sie hier http://java.sun.com/xml/ns/javaee/application_6.xsd.

Anmerkung

Die Einstellung des <initialize-in-order>-Elements auf true verlangsamt das Deployment. Es ist besser, ordnungsgemäße Abhängigkeiten mittels Abhängigkeitseinspeisung oder resource-refs vorzunehmen, da dies dem Container mehr Flexibilität bei der Optimierung von Deployments einräumt.
jboss-ejb3.xml
Der jboss-ejb3.xml-Deployment-Deskriptor ersetzt den jboss.xml-Deployment-Deskriptor bei der Außerkraftsetzung und Hinzufügung von Features des von der Java Enterprise Edition (EE) definierten ejb-jar.xml-Deployment-Deskriptors. Die neue Datei ist inkompatibel mit jboss.xml, und die jboss.xml wird jetzt bei Deployments ignoriert.
login-config.xml
Die login-config.xml-Datei wird nicht mehr für die Sicherheitskonfiguration verwendet. Die Sicherheit ist jetzt im <security-domain>-Element in der Server-Konfigurationsdatei konfiguriert. Für einen Standalone Server ist dies die standalone/configuration/standalone.xml-Datei. Falls Ihr Server in einer Managed Domain läuft, so ist dies die domain/configuration/domain.xml-Datei.

3.1.3.2. jboss-deployment-structure.xml

Bei jboss-deployment-structure.xml handelt es sich um einen neuen, optionalen Deployment-Deskriptor für die JBoss EAP 6. Dieser Deployment-Deskriptor bietet Kontrolle über das Klassenladen im Deployment.
Das XML-Schema für diesen Deployment-Deskriptor befindet sich in EAP_HOME/docs/schema/jboss-deployment-structure-1_2.xsd

3.1.3.3. Paket-Ressourcen für das neue, modulare Klassenladesystem

Zusammenfassung

In früheren Versionen der JBoss EAP wurden alle Ressourcen innerhalb des WEB-INF/-Verzeichnisses dem WAR-Klassenpfad hinzugefügt. In der JBoss EAP 6 werden Bausteine der Applikation nur aus den WEB-INF/classes- und WEB-INF/lib-Verzeichnissen geladen. Werden Applikationsbausteine nicht in den festgelegten Speicherorten verpackt, so kann dies zu ClassNotFoundException, NoClassDefError oder anderen Runtime Fehlern führen.

Um diese Klassenladefehler aufzulösen, müssen Sie die Struktur Ihrer Applikation archivieren oder ein benutzerdefiniertes Modul definieren.

Bearbeitung des Ressourcen-Packagings
Um die Ressourcen nur für die Applikation verfügbar zu machen, müssen Sie die Properties-Dateien, JARs oder andere Bausteine mit dem WAR bündeln, indem Sie sie in das WEB-INF/classes/- oder das WEB-INF/lib/-Verzeichnis verschieben. Diese Vorgehensweise wird hier Abschnitt 3.1.3.4, »Speicherort der ResourceBundle Properties ändern« ausführlicher beschrieben.
Maßgeschneidertes Modul erstellen
Falls Sie maßgeschneiderte Ressourcen allen auf dem JBoss EAP 6 Server laufenden Applikationen verfügbar machen wollen, so müssen Sie ein maßgeschneidertes Modul erstellen. Diese Vorgehensweise wird hier Abschnitt 3.1.3.5, »Maßgeschneidertes Modul erstellen« ausführlicher beschrieben.

3.1.3.4. Speicherort der ResourceBundle Properties ändern

Zusammenfassung

In früheren Versionen der JBoss EAP befand sich das EAP_HOME/server/SERVER_NAME/conf/-Verzeichnis im Klassenpfad und war für die Applikation verfügbar. Um Properties in der JBoss EAP 6 dem Klassenpfad der Applikation verfügbar zu machen, müssen Sie diese innerhalb Ihrer Applikation verpacken.

Prozedur 3.2. Speicherort der ResourceBundle Properties ändern

  1. Falls Sie ein WAR-Archiv deployen, so müssen Sie diese Properties in den WEB-INF/classes/-Ordner des WAR packen.
  2. Sollen diese Properties allen Komponenten in einem EAR zugänglich sein, so müssen Sie diese im root eines JARs verpacken und das JAR im lib/-Ordner des EAR platzieren.

3.1.3.5. Maßgeschneidertes Modul erstellen

Die folgende Vorgehensweise beschreibt, wie ein maßgeschneidertes Modul erstellt wird, um Properties-Dateien und andere Ressourcen allen auf dem JBoss EAP Server laufenden Applikationen verfügbar zu machen.

Prozedur 3.3. Maßgeschneidertes Modul erstellen

  1. Erstellen Sie die module/-Verzeichnisstruktur und pflegen Sie die relevanten Daten ein.
    1. Erstellen Sie eine Verzeichnisstruktur unter dem EAP_HOME/module-Verzeichnis, die die Dateien und JARs enthält. Zum Beispiel:
      $ cd EAP_HOME/modules/ 
      $ mkdir -p myorg-conf/main/properties
    2. Verschieben Sie die Properties-Dateien in das EAP_HOME/modules/myorg-conf/main/properties/-Verzeichnis, das Sie im vorherigen Schritt erstellt haben.
    3. Erstellen Sie eine module.xml-Datei im EAP_HOME/modules/myorg-conf/main/-Verzeichnis, die folgende XML enthält:
      <module xmlns="urn:jboss:module:1.1" name="myorg-conf">
          <resources>
              <resource-root path="properties"/>
          </resources>
      </module>
  2. Bearbeiten Sie das ee-Subsystem in der Server-Konfigurationsdatei. Sie können das JBoss CLI verwenden oder die Datei manuell bearbeiten.
    • Befolgen Sie diese Schritte zur Bearbeitung der Server-Konfigurationsdatei mittels des JBoss CLI.
      1. Starten Sie den Server und verbinden Sie sich mit dem Management-CLI.
        • In Linux geben Sie folgendes in der Befehlszeile ein:
           EAP_HOME/bin/jboss-cli.sh --connect
        • In Windows geben Sie Folgendes in die Befehlszeile ein:
          C:\>EAP_HOME\bin\jboss-cli.bat --connect
        Sie sollten die folgende Antwort sehen:
        Connected to standalone controller at localhost:9999
      2. Um das myorg-conf <global-modules> Element im ee Subsystem zu erstellen, geben Sie folgenden Befehl in die Befehlszeile ein:
        /subsystem=ee:write-attribute(name=global-modules, value=[{"name"=>"myorg-conf","slot"=>"main"}])
        Sie sollten das folgende Ergebnis sehen:
        {"outcome" => "success"}
    • Führen Sie folgende Schritte aus, um die Server-Konfigurationsdatei manuell zu bearbeiten.
      1. Stoppen Sie den Server und öffnen Sie die Server-Konfigurationsdatei in einem Texteditor. Für einen Standalone Server ist dies die EAP_HOME/standalone/configuration/standalone.xml-Datei, für eine Managed Domain ist es die EAP_HOME/domain/configuration/domain.xml-Datei.
      2. Suchen Sie das ee-Subsystem und fügen Sie das allgemeine Modul für myorg-conf hinzu. Nachfolgend sehen Sie ein Beispiel für das ee-Subsystem-Element, das derart bearbeitet wurde, um das myorg-conf-Element zu enthalten:

        Beispiel 3.1. myorg-conf Element

        <subsystem xmlns="urn:jboss:domain:ee:1.0" >            
            <global-modules>
                <module name="myorg-conf" slot="main" />            
            </global-modules>
        </subsystem>
  3. Wenn Sie eine Datei namens my.properties in den korrekten Modul-Speicherort kopiert haben, so können Sie jetzt Properties-Dateien mittels Code ähnlich dem folgenden laden:

    Beispiel 3.2. Properties-Datei laden

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

3.1.4. Protokolländerungen

3.1.4.1. Bearbeitung von Protokollierungsabhängigkeiten

Zusammenfassung

Der JBoss LogManager unterstützt Frontends für alle Protokoll-Frameworks, so dass Sie Ihren aktuellen Protokollierungscode beibehalten oder die neue JBoss Protokollierungsinfrastruktur verwenden können. Egal wofür Sie sich entscheiden, Sie werden aufgrund der Änderungen hinsichtlich des modularen Klassenladens Ihre Applikation wahrscheinlich bearbeiten müssen, um die erforderlichen Abhängigkeiten hinzuzufügen.

3.1.4.2. Aktualisierung des Applikationscodes für Protokollierungs-Frameworks von Drittanbietern

Zusammenfassung

Bei der JBoss EAP 6 werden Logging Abhängigkeiten für übliche Drittanbieter-Frameworks wie Apache Commons Logging, Apache log4j, SLF4J, und Java Logging standardmäßig hinzugefügt. In den meisten Fällen ist die Verwendung von Logging Framework vom JBoss EAP Container zu bevorzugen. Wenn Sie jedoch spezifische Funktionen benötigen, die ein Drittanbieter-Framework bietet, müssen Sie das entsprechende JBoss EAP Modul von Ihrem Deployment ausschließen. Beachten Sie, dass die Serverlogs weiterhin die JBoss EAP Logging Subsystem Konfiguration verwenden, auch wenn Ihr Deployment ein Drittanbieter-Framework benutzt.

Das folgende Verfahren demonstriert, wie Sie das JBoss EAP 6 org.apache.log4j Modul von Ihrem Deployment ausschließen. Das erste Verfahren funktioniert in jeder Release von JBoss EAP 6. Das zweite Verfahren kann nur bei JBoss EAP 6.3 oder späteren Versionen angewendet werden.

Prozedur 3.5. Konfigurieren Sie die JBoss EAP 6 zur Verwendung einer log4j.properties- oder log4j.xml-Datei

Dieses Verfahren funktioniert für alle Versionen von JBoss EAP 6.

Anmerkung

Da diese Methode eine log4j-Konfigurationsdatei verwendet, werden Sie die log4j-Protokollierungskonfiguration zur Runtime nicht mehr ändern können.
  1. Erstellen Sie eine jboss-deployment-structure.xml mit folgendem Inhalt:
    <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. Platzieren Sie die jboss-deployment-structure.xml Datei entweder im META-INF/ oder im WEB-INF/ Verzeichnis, wenn Sie ein WAR deployen, oder im META-INF/ Verzeichnis, wenn Sie ein EAR deployen. Wenn Ihr Deployment abhängige untergeordnete Deployments umfasst, müssen Sie auch die Module für jedes Subdeployment ausschließen.
  3. Schließen Sie die log4j.properties- oder log4j.xml-Datei im lib/-Verzeichnis Ihres EAR- oder dem WEB-INF/classes/-Verzeichnis Ihres WAR-Deployment ein. Falls Sie es vorziehen, die Datei in das lib/-Verzeichnis Ihres WAR zu legen, müssen Sie den <resource-root>-Pfad in der jboss-deployment-structure.xml-Datei angeben.
    <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. Starten Sie den JBoss EAP 6 Server mit folgendem Laufzeitargument um zu verhindern, dass eine ClassCastException in der Konsole erscheint, wenn Sie die Applikation deployen:
    -Dorg.jboss.as.logging.per-deployment=false
  5. Deployen Sie Ihre Applikation.

Prozedur 3.6. Konfigurieren von Logging Abhängigkeiten für JBoss EAP 6.3 oder spätere Versionen

Bei der JBoss EAP 6.3 und späteren Versionen können Sie die neuen add-logging-api-dependencies Logging Systemattribute benutzen um Loggingframework-Abhängigkeiten von Drittanbietern auszuschließen. Die folgenden Schritte demonstrieren, wie man dieses Logging-Attribut auf einem JBoss EAP Standalone Server modifiziert.
  1. Starten Sie den JBoss EAP 6 Server mit folgendem Laufzeitargument um zu verhindern, dass eine ClassCastException in der Konsole erscheint, wenn Sie die Applikation deployen:
    -Dorg.jboss.as.logging.per-deployment=false
  2. Öffnen Sie ein Terminal und verbinden Sie sich mit dem Management-CLI.
    • In Linux geben Sie folgendes in der Befehlszeile ein:
      $ EAP_HOME/bin/jboss-cli.sh --connect
      
    • In Windows geben Sie folgendes in der Befehlszeile ein:
      C:\>EAP_HOME\bin\jboss-cli.bat --connect
      
  3. Modifizieren Sie das add-logging-api-dependencies Attribut im Logging Subsystem.
    Dieses Attribut kontrolliert, ob der Container implizite Logging API Abhängigkeiten zu Ihren Deployments hinzufügt.
    • Wenn true gesetzt ist, was der Standardwert ist, sind alle impliziten Logging API Abhängigkeiten hinzugefügt.
    • Wenn false gesetzt ist, wurden die Abhängigkeiten Ihren Deployments nicht hinzugefügt.
    Um die Loggingframework-Abhängigkeiten von Drittanbietern auszuschließen müssen Sie dieses Attribut über folgenden Befehl auf false setzten:
    /subsystem=logging:write-attribute(name=add-logging-api-dependencies, value=false)
    Dieser Befehl fügt das <add-logging-api-dependencies> Element dem logging Subsystem der standalone.xml Konfigurationsdatei hinzu.
    <subsystem xmlns="urn:jboss:domain:logging:1.4">
        <add-logging-api-dependencies value="false"/>
        ....
    </subsystem>
    
  4. Deployen Sie Ihre Applikation.

3.1.4.3. Bearbeitung des Codes zur Verwendung des neuen JBoss Logging Framework

Zusammenfassung

Um das neue Framework zu verwenden, ändern Sie Ihre Importe und Ihren Code wie folgt:

Prozedur 3.7. Bearbeitung von Code und Abhängigkeiten zur Verwendung des JBoss Logging Frameworks

  1. Ändern Sie Ihre Importe und Protokollierungscode

    Nachfolgend sehen Sie ein Beispiel für einen Code, der das neue JBoss Logging Framework verwendet:
    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. Fügen Sie die Protokollierungsabhängigkeit hinzu

    Das die JBoss Protokollierungsklassen enthaltende JAR befindet sich im Modul namens org.jboss.logging. Ihre MANIFEST-MF-Datei sollte wie folgt aussehen:
    Manifest-Version: 1.0
    Dependencies: org.jboss.logging
    

3.1.5. Änderungen beim Packen der Applikation

3.1.5.1. Modifizierung des Packagings von EARs und WARs

Zusammenfassung

Bei Migration Ihrer Applikation kann es sein, dass Sie die Packstruktur Ihres EARs oder WARs aufgrund der Änderung am modularen Klassenladen ändern müssen. Modulabhängigkeiten werden in dieser spezifischen Reihenfolge geladen:

  1. Systemabhängigkeiten
  2. Benutzerabhängigkeiten
  3. Lokale Ressourcen
  4. Inter-Deployment Abhängigkeiten

Prozedur 3.8. Bearbeitung des Archiv-Packagings

  1. Packaging eines WAR

    Bei einem WAR handelt es sich um ein einzelnes Modul und alle Klassen im WAR werden mit demselben Klassenlader geladen. Das bedeutet, dass im WEB-INF/lib/-Verzeichnis gepackte Klassen genauso behandelt werden wie Klassen im WEB-INF/classes-Verzeichnis.
  2. Packaging eines EAR

    Ein EAR besteht aus mehreren Modulen. Das EAR/lib/-Verzeichnis ist ein einzelnes Modul und jedes WAR oder EJB jar-Unterdeployment innerhalb des EAR ist ein separates Modul. Klassen müssen nicht auf Klassen in anderen Modulen innerhalb des EAR zugreifen, falls nicht explizit Abhängigkeiten definiert wurden. Unterdeployments besitzen eine automatische Abhängigkeit am übergeordneten Modul, das ihnen Zugriff auf die Klassen im EAR/lib/-Verzeichnis gibt. Allerdings haben Unterdeployments nicht immer eine automatische Abhängigkeit, die ihnen Zugriff auf einander gibt. Dieses Verhalten wird durch Einstellung des <ear-subdeployments-isolated>-Element in der ee-Subsystemkonfiguration wie folgt gesteuert:
    <subsystem xmlns="urn:jboss:domain:ee:1.0" >            
      <ear-subdeployments-isolated>false</ear-subdeployments-isolated>
    </subsystem>
    Dies ist standardmäßig auf "false" eingestellt, wodurch die Unterdeployments die zu anderen Unterdeployments innerhalb des EAR gehörenden Klassen sehen können.
    Weitere Informationen zum Laden von Klassen finden Sie im Kapitel Class Loading and Modules im Development Guide für die JBoss EAP 6 unter https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.

3.1.6. Konfigurationsänderungen bei Datenquellen und Ressourcenadaptern

3.1.6.1. Aktualisierung der Applikation aufgrund von Konfigurationsänderungen

Bei der JBoss EAP 5 wurden Dienste und Subsysteme in vielen verschiedenen Dateien konfiguriert. Bei der JBoss EAP 6 erfolgt die Konfiguration nun hauptsächlich in einer Datei. Falls Ihre Applikation eine der folgenden Ressourcen oder einen der folgenden Dienste verwendet, so können Konfigurationsänderungen erforderlich sein.
  1. Falls Ihre Applikation eine Datenquelle verwendet, siehe: Abschnitt 3.1.6.2, »Aktualisierung der Datenquellen-Konfiguration«.
  2. Falls Ihre Applikation JPA verwendet und derzeit die Hibernate JARs bündelt, so finden Sie Informationen zu Migrationsoptionen hier: Abschnitt 3.1.6.4, »Konfiguration der Datenquelle für Hibernate oder JPA«.
  3. Falls Ihre Applikation einen Ressourcenadapter verwendet, siehe: Abschnitt 3.1.6.5, »Aktualisierung der Ressourcen-Adapter-Konfiguration«.
  4. Sehen Sie sich die folgenden Informationen zur Konfiguration von Änderungen für grundlegende Sicherheit an: Abschnitt 3.1.7.1, »Konfiguration der Sicherheitsänderungen der Applikation«.

3.1.6.2. Aktualisierung der Datenquellen-Konfiguration

Zusammenfassung

In früheren Versionen von JBoss EAP war die JCA Datenquellen-Konfiguration in einer Datei mit dem Suffix *-ds.xml definiert. Diese Datei wurde dann im deploy/ Verzeichnis des Servers deployt oder in die Applikation gepackt. Der JDBC Treiber wurde ins server/lib/ Verzeichnis kopiert oder in das WEB-INF/lib/ Verzeichnis der Applikation gepackt. Während diese Methode der Datenquellen-Konfiguration für die Entwicklung noch unterstützt wird, wird sie für die Produktion nicht empfohlen, da sie nicht von den JBoss Administrations- und Management-Tools unterstützt wird.

Bei der JBoss EAP 6 wird die Datenquelle in der Serverkonfigurationsdatei konfiguriert. Wenn die JBoss EAP 6 Instanz in einer Managed Domain läuft, wird die Datenquelle in der domain/configuration/domain.xml-Datei konfiguriert. Wenn die JBoss EAP Instanz als Standalone Server läuft, wird die Datenquelle in der standalone/configuration/standalone.xml file-Datei konfiguriert. Auf diese Weise konfigurierte Datenquellen können mittels der JBoss Management-Interfaces, einschließlich der Web Management-Konsole und des Befehlszeilen-Interface (CLI) verwaltet und gesteuert werden. Diese Tools machen die Verwaltung von Deployments und die Konfiguration mehrerer in einer Managed Domain laufender Server einfach.
Der folgende Abschnitt beschreibt, wie Sie Ihre Datenquellenkonfiguration so bearbeiten, dass diese mit den verfügbaren Management-Tools verwaltet und unterstützt wird.
Zu einer für die für JBoss EAP 6 verwaltbaren Datenquellenkonfiguration migrieren

Ein JDBC 4.0 kompatibler Treiber kann als Deployment- oder Kernmodul installiert werden. Ein JDBC 4.0 kompatibler Treiber enthält eine META-INF/services/java.sql.Driver-Datei, die den Treiberklassennamen festlegt. Ein nicht mit JDBC 4.0 kompatibler Treiber erfordert zusätzliche Schritte. Informationen dazu, wie Sie einen Treiber JDBC 4.0 kompatibel machen und wie Sie Ihre aktuelle Datenquellenkonfiguration so aktualisieren, dass Sie durch die Web Management-Konsole und das CLI verwaltet werden kann, finden Sie hier Abschnitt 3.1.6.3, »Installation und Konfiguration des JDBC-Treibers«.

Falls Ihre Applikation Hibernate oder JPA verwendet, so sind möglicherweise zusätzliche Änderungen notwendig. Siehe Abschnitt 3.1.6.4, »Konfiguration der Datenquelle für Hibernate oder JPA« für weitere Informationen.
Verwendung des IronJacamar Migrationstools zur Konvertierung von Konfigurationsdaten

Sie können das IronJacamar Tool zur Migration von Datenquellen und Ressourcenadapter-Konfigurationen verwenden. Dieses Tool konvertiert die Konfigurationsdateien im *-ds.xml-Stil in das von der JBoss EAP 6 erwartete Format. Weitere Informationen finden Sie unter Abschnitt 4.1.6, »Verwendung des IronJacamar Migrationstools zur Migration der Datenquellen- und Ressourcenadapterkonfigurationen«.

Migrations-Code, der Remote Datenquellen-Lookups ausführt

In früheren Versionen der JBoss EAP war es möglich ein JNDI Remote Lookup von Datenquellen-Objekten auszuführen, diese Praxis war jedoch aus folgenden Gründen nicht empfohlen.

  • Clientenkontrolle einer Serverressource ist unzuverlässig und kann zu undichten Verbindungen führen, wenn der Client abstürzt oder die Verbindung zum Server verliert.
  • Die Performance ist sehr langsam, weil alle Datenbankenvorgänge durch einen MBean über einen Proxy übermittelt werden.
  • Transaktionspropagierung ist nicht unterstützt.

Diese Funktionalität wurde aus JBoss EAP 6 entfernt und Ihnen wird vielleicht ein NotSerializableException angezeigt, wenn Sie Ihre Applikation migrieren. Der empfohlene Ansatz ist es, eine EJB zu erstellen um auf die Datenquelle zuzugreifen und dann die EJB remote abzurufen. Weitere Informationen finden Sie im Abschnitt Remote Invocation Changes dieses Buches. Zusätzliche Informationen finden Sie im Development Guide für JBoss EAP 6 unter https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/.

3.1.6.3. Installation und Konfiguration des JDBC-Treibers

Zusammenfassung

Der JDBC-Treiber kann auf eine der folgenden beiden Arten in den Container installiert werden:

  • Als ein Deployment
  • Als ein Kernmodul
Die Vor- und Nachteile jeder der Vorgehensweisen finden Sie nachfolgend.

Bei der JBoss EAP 6 wird die Datenquelle in der Serverkonfigurationsdatei konfiguriert. Läuft die JBoss EAP 6 Instanz in einer Managed Domain, so wird die Datenquelle in der domain/configuration/domain.xml-Datei konfiguriert. Läuft die JBoss Enterprise Application Platform Instanz als Standalone Server, so wird die Datenquelle in der standalone/configuration/standalone.xml file-Datei konfiguriert. Schemareferenzinformationen, die für beide Modi identisch sind, finden Sie im doc/-Verzeichnis der JBoss EAP 6 Installation. Wir gehen hier davon aus, dass der Server als Standalone Server läuft und die Datenquelle in der standalone.xml-Datei konfiguriert ist.

Prozedur 3.9. Installation und Konfiguration des JDBC-Treibers

  1. Installation des JDBC-Treibers.

    1. Installation des JDBC-Treibers als ein Deployment.

      Dies ist die empfohlene Vorgehensweise, auf die der Treiber installiert werden sollte. Wenn der JDBC Treiber als Deployment installiert ist, wird er als normales JAR deployt. Wenn die JBoss EAP 6 Instanz als Standalone Server läuft, so kopieren Sie das JDBC 4.0 kompatible JAR ins EAP_HOME/standalone/deployments/ Verzeichnis. Für eine Managed Domain müssen Sie die Management Konsole oder das Management CLI benutzen um das JAR zu den Servergruppen zu deployen.
      Nachfolgend sehen Sie ein Beispiel für einen als Deployment an einem Standalone Server installierten MySQL JDBC-Treiber:
      $cp mysql-connector-java-5.1.15.jar EAP_HOME/standalone/deployments/
      Jeder JDBC 4.0 kompatible Treiber wird automatisch erkannt und wird nach Namen und Version im System installiert. Ein JDBC 4.0 kompatibles JAR enthält eine Textdatei namens META-INF/services/java.sql.Driver, die den/die Treiberklassenname(n) festlegt. Ist der Treiber nicht JDBC 4.0 kompatibel, so kann er auf eine der folgenden Arten deploybar gemacht werden:
      • Erstellen Sie eine java.sql.Driver-Datei für das JAR und fügen Sie diese unter dem META-INF/services/-Pfad hinzu. Diese Datei sollte den Treiberklassennamen enthalten, zum Beispiel:
        com.mysql.jdbc.Driver
      • Erstellen Sie eine java.sql.Driver Datei im Deployment Verzeichnis. Für eine als Standalone Server laufende JBoss EAP 6 Instanz sollte die Datei hier sein: EAP_HOME/standalone/deployments/META-INF/services/java.sql.Driver. Wenn der Server in einer Managed Domain ist, müssen Sie die Datei über die Managementkonsole oder das Management CLI deployen.
      Die Vorteile dieser Vorgehensweisen sind:
      • Dies ist die einfachste Methode, da kein Modul definiert werden muss.
      • Läuft der Server in einer Managed Domain, so werden nach dieser Vorgehensweise verwendende Deployments automatisch zu allen Servern in der Domain fortgepflanzt. Dies bedeutet, dass der Administrator das Treiber-JAR nicht manuell distribuieren muss.
      Die Nachteile dieser Vorgehensweisen sind:
      • Falls der JDBC-Treiber aus mehr als einem JAR besteht, zum Beispiel dem Treiber-JAR plus einem abhängigen Lizenz-JAR oder Lokalisierungs-JAR, so können Sie den Treiber nicht als Deployment installieren. Sie müssen den JDBC-Treiber als ein Kernmodul installieren.
      • Falls der Treiber nicht JDBC 4.0 kompatibel ist, so muss eine Datei erstellt werden, die die/den Treiberklassennamen enthält und muss in das JAR importiert werden oder im deployments/-Verzeichnis überlagert werden.
    2. Installation des JDBC-Treibers als Kernmodul.

      Um einen JDBC-Treiber als Kernmodul zu installieren, müssen Sie eine Dateipfadstruktur unter dem EAP_HOME/modules/-Verzeichnis erstellen. Diese Struktur enthält das JDBC-Treiber JAR, zusätzliche Anbieter Lizenzen oder Lokalisierungs-JARs und eine module.xml-Datei, um das Modul zu definieren.
      • Installation des MySQL-Treibers als Kernmodul

        1. Erstellen Sie die Verzeichnisstruktur EAP_HOME/modules/com/mysql/main/
        2. Erstellen Sie im main/-Unterverzeichnis eine module.xml-Datei, die die folgende Moduldefinition für den MySQL JDBC-Treiber enthält:
          <?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>
          
          
          Der Modulname "com.mysql" stimmt mit der Verzeichnisstruktur für dieses Modul überein. Das <dependencies>-Element wird zur Festlegung der Abhängigkeiten von anderen Modulen dieses Moduls verwendet. In diesem Fall (wie auch bei allen anderen JDBC-Datenquellen) hängt dies von den Java JDBC APIs ab, die in einem anderen Modul namens javax.api definiert sind. Dieses Modul befindet sich im modules/system/layers/base/javax/api/main/-Verzeichnis.

          Anmerkung

          Stellen Sie sicher, dass sich KEINE Leerstelle am Anfang der module.xml-Datei befindet, da Sie sonst die Fehlermeldung "New missing/unsatisfied dependencies" für diesen Treiber erhalten.
        3. Kopieren Sie das MySQL JDBC-Treiber JAR in das EAP_HOME/modules/com/mysql/main/-Verzeichnis:
          $ cp mysql-connector-java-5.1.15.jar EAP_HOME/modules/com/mysql/main/
      • Installation des IBM DB2 JDBC-Treibers und Lizenz-JAR als Kernmodul.

        Dieses Beispiel zeigt Ihnen nur, wie Treiber deployt werden, die neben dem DBC Driver JAR zusätzliche JARs benötigen.
        1. Erstellen Sie die Verzeichnisstruktur EAP_HOME/modules/com/ibm/db2/main/.
        2. Erstellen Sie im main/-Unterverzeichnis eine module.xml-Datei, die die folgende Moduldefinition für den IBM DB2 JDBC-Treiber und Lizenz enthält:
          <?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>
          

          Anmerkung

          Stellen Sie sicher, dass sich KEINE Leerstelle am Anfang der module.xml-Datei befindet, da Sie sonst die Fehlermeldung "New missing/unsatisfied dependencies" für diesen Treiber erhalten.
        3. Kopieren Sie den JDBC-Treiber und das Lizenz-JAR in das EAP_HOME/modules/com/ibm/db2/main/-Verzeichnis.
          $ cp db2jcc.jar EAP_HOME/modules/com/ibm/db2/main/
          $ cp db2jcc_license_cisuz.jar EAP_HOME/modules/com/ibm/db2/main/
      Die Vorteile dieser Vorgehensweisen sind:
      • Dies ist die einzige Vorgehensweise, die funktioniert, wenn der JDBC-Treiber aus mehr als einem JAR besteht.
      • Mit dieser Vorgehensweise können Treiber, die nicht JDBC 4.0 kompatibel sind, installiert werden, ohne dass das Treiber-JAR bearbeitet werden muss oder ein Datei-Overlay erstellt wird.
      Die Nachteile dieser Vorgehensweisen sind:
      • Es ist schwieriger, ein Modul einzurichten.
      • Das Modul muss manuell in jeden in einer Managed Domain laufenden Server kopiert werden.
  2. Konfiguration der Datenquelle.

    1. Fügen Sie den Datenbanktreiber hinzu.

      Fügen Sie das <driver>-Element dem <drivers>-Element derselben Datei hinzu. Wieder enthält dies einige derselben Datenquelleninformationen, die zuvor in der *-ds.xml-Datei definiert waren.
      Bestimmen Sie zuerst, ob das Treiber-JAR JDBC 4.0 kompatibel ist. Ein JAR, das JDBC 4.0 kompatibel ist, enthält eine META-INF/services/java.sql.Driver-Datei, die den Treiberklassennamen festelegt. Der Server verwendet diese Datei, um den Namen der Treiberklasse(n) im JAR zu finden. Ein JDBC 4.0 kompatibler Treiber benötigt kein <driver-class>-Element, da es bereits im JAR festgelegt ist. Dies ist ein Beispiel des Treiberelements für einen JDBC 4.0 kompatiblen MySQL-Treiber:
      <driver name="mysql-connector-java-5.1.15.jar" module="com.mysql"/>
      
      Ein Treiber, der nicht JDBC 4.0 kompatibel ist, benötigt ein <driver-class>-Attribut zur Identifikation der Treiberklasse, da es keine META-INF/services/java.sql.Driver-Datei gibt, die den Treiberklassennamen festlegt. Dies ist ein Beispiel für ein Treiberelement für einen Treiber, der nicht JDBC 4.0 kompatibel ist:
      <driver name="mysql-connector-java-5.1.15.jar" module="com.mysql">
      <driver-class>com.mysql.jdbc.Driver</driver-class></driver>
      
    2. Erstellen Sie die Datenquelle.

      Erstellen Sie ein <datasource>-Element im <datasources>-Abschnitt der standalone.xml-Datei. Diese Datei enthält viele derselben Datenquelleninformationen, die zuvor in der *-ds.xml-Datei definiert waren.

      Wichtig

      Sie müssen den Server stoppen, ehe Sie die Server Konfigurations-Datei bearbeiten, damit Ihre Änderungen bei einem Server-Neustart als dauerhaft erstellt werden.
      Nachfolgend sehen Sie ein Beispiel für ein MySQL-Datenquellenelement in der standalone.xml-Datei.
      <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. Aktualisieren Sie JNDI Referenzen im Applikationscode.

    Sie müssen abgelaufene JNDI-Lookup Namen im Applikationsquellencode ersetzen um die neuen, von Ihnen definierten JNDI standardisierten Datenquellen-Namen zu benutzen. Weitere Informationen finden Sie unter: Abschnitt 3.1.8.4, »Bearbeitung der Applikation zur Befolgung der neuen JNDI-Namespace Regeln«.
    Sie müssen auch vorhandene @Resource Annotationen ersetzen, die auf die Datenquellen zugreifen, um die neuen JNDI-Namen zu benutzen. Zum Beispiel:
    @Resource(name = "java:/YourDatasourceName").
    

3.1.6.4. Konfiguration der Datenquelle für Hibernate oder JPA

Falls Ihre Applikation JPA verwendet und derzeit die Hibernate JARs bündelt, so möchten Sie vielleicht das in der JBoss EAP 6 enthaltende Hibernate verwenden. Um diese Version von Hibernate zu benutzen, müssen Sie das alte Hibernate Bündel aus Ihrer Applikation entfernen.

Prozedur 3.10. Entfernen des Hibernate Bündels

  1. Entfernen Sie die Hibernate JARs aus den Bibliotheksordnern Ihrer Applikation.
  2. Entfernen oder kommentieren Sie das <hibernate.transaction.manager_lookup_class>-Element in Ihrer persistence.xml-Datei aus, da dieses Element nicht benötigt wird.

3.1.6.5. Aktualisierung der Ressourcen-Adapter-Konfiguration

Zusammenfassung

In früheren Versionen des Applikationsservers war die Ressourcenadapterkonfiguration in einer Datei mit einem Suffix von *-ds.xml definiert. Bei der JBoss EAP 6 wird ein Ressourcenadapter in der Server-Konfigurationsdatei definiert. Falls Sie eine Managed Domain betreiben, so ist die Konfigurationsdatei die EAP_HOME/domain/configuration/domain.xml-Datei. Falls Sie einen Standalone Server betreiben, so konfigurieren Sie den Ressourcenadapter in der EAP_HOME/standalone/configuration/standalone.xml-Datei. Schemareferenzinformation, die für beide Modi identisch ist, finden Sie unter Schemas auf der IronJacamar-Website unter: http://www.ironjacamar.org/documentation.html.

Wichtig

Sie müssen den Server stoppen, ehe Sie die Server Konfigurations-Datei bearbeiten, damit Ihre Änderungen bei einem Server-Neustart als dauerhaft erstellt werden.
Definition des Ressourcenadapters

Die Ressourcenadapter-Deskriptorinformationen sind unter dem folgenden Subsystem-Element in der Serverkonfigurationsdatei definiert:

<subsystem xmlns="urn:jboss:domain:resource-adapters:1.1"/>
Sie werden einige derselben Informationen verwenden, die zuvor in der Ressourcenadapter *-ds.xml-Datei definiert wurden.

Nachfolgend sehen Sie ein Beispiel für ein Ressourcenadapter-Element in der Serverkonfigurationsdatei:
<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. Sicherheitsänderungen

3.1.7.1. Konfiguration der Sicherheitsänderungen der Applikation

Konfiguration der Sicherheit für einfache Authentifizierung

In früheren Versionen der JBoss EAP befanden sich properties-Dateien im EAP_HOME/server/SERVER_NAME/conf/-Verzeichnis im Klassenpfad und wurden leicht vom UsersRolesLoginModule aufgefunden. Bei der JBoss EAP 6 hat sich die Verzeichnisstruktur geändert. Properties-Dateien müssen jetzt innerhalb der Applikation verpackt sein, um im Klassen-Pfad verfügbar zu sein.

Wichtig

Sie müssen den Server stoppen, ehe Sie die Server Konfigurations-Datei bearbeiten, damit Ihre Änderungen bei einem Server-Neustart als dauerhaft erstellt werden.
Für die Konfiguration der Sicherheit für einfache Authentifizierung fügen Sie eine neue Sicherheits-Domain unter security-domains zur standalone/configuration/standalone.xml oder zur domain/configuration/domain.xml Server Konfigurations-Datei hinzu:
<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>
Läuft die JBoss EAP 6 Instanz als ein Standalone Server, so bezieht sich ${jboss.server.config.dir} auf das EAP_HOME/standalone/configuration/ Verzeichnis. Läuft die Instanz in einer Managed Domain, so bezieht sich ${jboss.server.config.dir} auf das EAP_HOME/domain/configuration/ Verzeichnis.
Bearbeitung der Namen von Sicherheits-Domains

Bei der JBoss EAP 6 verwenden Sicherheits-Domains nicht mehr das Präfix java:/jaas/ in ihrem Namen.

  • Für Webanwendungen müssen Sie dieses Präfix aus den Sicherheits-Domain Konfigurationen in jboss-web.xml entfernen.
  • Für Enterprise Anwendungen müssen Sie dieses Präfix aus den Sicherheits-Domain Konfigurationen in jboss-ejb3.xml entfernen. Diese Datei hat die jboss.xml in der JBoss EAP 6 ersetzt.

3.1.8. JNDI-Änderungen

3.1.8.1. Aktualisierung der JNDI Namespace-Namen der Applikation

Zusammenfassung

Mit EJB 3.1 wurden ein allgemeiner, standardisierter JNDI-Namespace und eine Reihe damit verbundener Namespaces eingeführt, die zu den verschiedenen Bereichen einer Java EE Applikation mappen. Die drei JNDI-Namespaces, die für portierbare EJB-Namen verwendet werden, sind java:global, java:module und java:app. Applikationen mit EJB, die JNDI verwenden, müssen so geändert werden, dass Sie der neuen, standardisierten JNDI-Namespace Konvention folgen.

Beispiele für JNDI-Mappings

Beispiele von JNDI-Namespaces in früheren Releases und wie diese in der JBoss EAP 6 spezifiziert sind, finden Sie hier: Abschnitt 3.1.8.5, »Beispiele von JNDI-Namespaces in früheren Releases und wie diese in der JBoss EAP 6 spezifiziert sind«

3.1.8.2. Portierbare EJB JNDI-Namen

Zusammenfassung

Die Java EE 6 Spezifikation definiert vier logische Namespaces, jeden mit seinem eigenen Bereich, aber portierbare EJB Names werden nur an drei von ihnen gebunden. Die folgende Tabelle zeigt, wann und wie jeder Namespace verwendet wird.

Tabelle 3.1. Portierbare JNDI-Namespaces

JNDI-Namespace Beschreibung
java:global
Namen in diesem Namespace werden von allen in einer Applikationsserverinstanz deployten Applikationen geteilt. Verwenden Sie Namen um auf demselben Server deployte Archive von EJBs zu finden.
Im Folgenden sehen Sie ein Beispiel für ein java:global namespace: java:global/jboss-seam-booking/jboss-seam-booking-jar/HotelBookingAction
java:module
Namen in diesem Namespace werden von allen Komponenten in einem Modul geteilt, zum Beispiel allen Enterprise Beans in einem einzelnen EJB-Modul oder allen Komponenten in einem Web-Modul.
Im Folgenden sehen Sie ein Beispiel für ein java:module namespace: java:module/HotelBookingAction!org.jboss.seam.example.booking.HotelBooking
java:app
Namen in diesem Namespace werden von allen Komponenten in allen Modulen in einer einzelnen Applikation geteilt. Ein WAR und eine EJB Jar-Datei in derselben EAR-Datei hätten Zugriff auf die Ressourcen im java:app namespace.
Im Folgenden sehen Sie ein Beispiel für ein java:app namespace: java:app/jboss-seam-booking-jar/HotelBookingAction
Weitere Informationen zu JNDI-Namensgebungungskontexten finden SIe in Abschnitt EE.5.2.2, "Application Component Environment Namespaces" in der "JSR 316: JavaTM Platform, Enterprise Edition (Java EE) Specification, v6". Sie können die Spezifikation hier herunterladen: http://jcp.org/en/jsr/detail?id=316

3.1.8.3. Übersicht über die JNDI-Namespace Regeln

Zusammenfassung

Die JBoss EAP 6 wurde hinsichtlich der JNDI Namespace-Namen verbessert, um berechenbare und konsistente Regeln für jeden im Applikationsserver gebundenen Namen zu liefern sowie um zukünftige Kompatibilitätsprobleme zu vermeiden. Dies bedeutet, dass Sie Probleme mit den aktuellen Namespaces in Ihrer Applikation haben könnten, falls diese die neuen Regeln nicht berücksichtigen.

Namespaces sollten folgende Regeln befolgen:

  1. Unqualifizierte, relative Namen wie DefaultDS oder jdbc/DefaultDS sollten je nach Kontext relativ zu java:comp/env, java:module/env oder java:jboss/env qualifiziert werden.
  2. Unqualifizierte absolute Namen wie /jdbc/DefaultDS sollten relativ zu einem java:jboss/root Namen qualifiziert werden.
  3. Qualifizierte absolute Namen wie java:/jdbc/DefaultDS sollten auf dieselbe Weise wie unqualifizierte absolute Namen oben qualifiziert werden.
  4. Der spezielle java:jboss-Namespace wird über die gesamte AS Serverinstanz hinweg geteilt.
  5. Jeder relative Name mit einem java:-Präfix muss in einem der fünf Namespaces sein: comp, module, app, global oder dem proprietären jboss. Jeder mit java:xxx beginnende Name, bei dem xxx nicht mit einem der fünf obigen übereinstimmt, führt zu einem "invalid name"-Fehler (ungültiger Name).

3.1.8.4. Bearbeitung der Applikation zur Befolgung der neuen JNDI-Namespace Regeln

  • Nachfolgend sehen Sie ein Beispiel eines JNDI-Lookups in JBoss EAP 5.1. Dieser Code befindet sich in der Regel in einer Initialisierungsmethode.
    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);
    }
    
    Beachten Sie, dass der Lookup-Name OrderManagerApp/ProductManagerBean/local lautet.
  • Das nachfolgende Beispiel zeigt, wie derselbe Lookup in der JBoss EAP 6 mittels Abhängigkeitseinspeisung codiert würde.
    @EJB(lookup="java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager")
    private ProductManager productManager;
    
    Die Lookup-Werte sind jetzt als Mitgliedervariablen definiert und verwenden den neuen, portierbaren java:app JNDI-Namespace Namen java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager.
  • Falls Sie die Abhängigkeitseinspeisung lieber nicht verwenden möchten, so können Sie weiterhin wie oben InitialContext erstellen und den Lookup bzw. die Suche so bearbeiten, dass der neue JNDI Namespace Name verwendet wird.
    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. Beispiele von JNDI-Namespaces in früheren Releases und wie diese in der JBoss EAP 6 spezifiziert sind

Tabelle 3.2. JNDI-Namespace Mapping Tabelle

Namespace in JBoss EAP 5.x Namespace in der JBoss EAP 6 Anmerkungen
OrderManagerApp/ProductManagerBean/local java:module/ProductManagerBean!services.ejb.ProductManager Java EE 6 Standardbindung. Begrenzt durch das aktuelle Modul und nur innerhalb desselben Moduls zugänglich.
OrderManagerApp/ProductManagerBean/local java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager Java EE 6 Standardbindung. Begrenzt durch die aktuelle Applikation und nur innerhalb derselben Applikation zugänglich.
OrderManagerApp/ProductManagerBean/local java:global/OrderManagerApp/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager Java EE 6 Standardbindung. Begrenzt durch den Applikationsserver und allgemein zugänglich.
java:comp/UserTransaction java:comp/UserTransaction Der Namespace wird durch die aktuelle Komponente begrenzt. Nicht zugänglich für Threads die kein Java EE 6 sind, z.B. direkt von Ihrer Applikation erstellte Threads.
java:comp/UserTransaction java:jboss/UserTransaction Allgemein zugänglich, verwenden Sie dies, falls java:comp/UserTransaction nicht verfügbar ist
java:/TransactionManager java:jboss/TransactionManager  
java:/TransactionSynchronizationRegistry java:jboss/TransactionSynchronizationRegistry  

3.1.9. HTTP/HTTPS/AJP Konnektorattribute zuordnen

3.1.9.1. Zuordnen der HTTP/HTTPS/AJP Connector Attribute

Die folgende Tabelle zeigt, wie man HTTP, HTTPS und AJP Connector Attribute aus früheren Releases den neuen Attributen in Red Hat JBoss Enterprise Application Platform 6 zuordnet.

Tabelle 3.3. Zuordnen von Connector Attributen

Attributnamen in der früheren Release Entsprechung in JBoss EAP 6 Details
maxThreads max-connections Dieses Attribut misst den JBossWeb level thread/connection Pool. Es ist auf den Konnektoren im Web Subsystem eingerichtet. Der Standard ist 512 pro CPU Kern.
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http" enabled="true" max-connections="200" />
minSpareThreads
maxSpareThreads
N/A Es gibt kein Äquivalent für minSpareThreads oder maxSpareThreads, da kaum Anreiz zur Freigabe von Threads besteht. Wenn Sie einen Executor für den Konnektor benutzen anstatt des Standard Worker Thread Pools, wäre das Nächstliegende die core-threads Größe und keepalive-time Attribute.
proxyName
proxyPort
proxy-name
proxy-port
Dieses Attribut ist auf dem connector im web Subsystem eingerichtet.
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http" enabled="true" proxy-name="proxy.com" proxy-port="80"/>
redirectPort
redirect-port
Dieses Attribut ist auf dem connector im web Subsystem eingerichtet.
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
Dieses Attribut ist auf dem connector im web Subsystem eingerichtet.
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http" enable-lookups="true"/>"
MaxHttpHeaderSize
System Property Dieses Attribut wird unter Verwendung der System Properties eingerichtet. Der Standardwert ist 8 KB.
<system-properties>
    <property name="org.apache.coyote.http11.Http11Protocol.MAX_HEADER_SIZE" value="8192"/>
</system-properties>
maxKeepAliveRequests
System Property Dieses Attribut wird unter Verwendung der System Properties eingerichtet.
<system-properties>
    <property name="org.apache.coyote.http11.Http11Protocol.MAX_KEEP_ALIVE_REQUESTS" value="1"/>
</system-properties>
connectionTimeout
System Property Dieses Attribut wird unter Verwendung der System Properties eingerichtet. Folgende Konfiguration setzt das AJP connectionTimeout auf 600000 Millisekunden (10 Minuten) und das HTTP connectionTimeout auf 120000 Millisekunden (2 Minuten).
<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>
Kompression
System Property Dieses Attribut aktiviert Kompression. Sie können den Inhaltstyp bestimmen, der als text/html,text/xml,text/plain vorgegeben ist. Sie können auch eine minimale Größe von zu komprimierendem Inhalt angeben, was als 2048 Bytes vorgegeben ist. Kompression wird über die System Properties eingerichtet.
<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 Dieses Attribut wird unter Verwendung der System Properties eingerichtet.
<system-properties>
    <property name="org.apache.catalina.connector.URI_ENCODING" value="UTF-8"/>
</system-properties>
useBodyEncodingForURI
System Property Dieses Attribut wird unter Verwendung der System Properties eingerichtet.
<system-properties>
    <property name="org.apache.catalina.connector.USE_BODY_ENCODING_FOR_QUERY_STRING" value="true"/>
</system-properties>
server
System Property Dieses Attribut wird unter Verwendung der System Properties eingerichtet.
<system-properties>
    <property name="org.apache.coyote.http11.Http11Protocol.SERVER" value="NewServerHeader"/>
 </system-properties>
allowTrace
System Property Dieses Attribut wird unter Verwendung der System Properties eingerichtet.
<system-properties>
    <property name="org.apache.catalina.connector.ALLOW_TRACE " value="true"/>
 </system-properties>
xpoweredby
System Property Dieses Attribut wird unter Verwendung der System Properties eingerichtet.
<system-properties>
    <property name="org.apache.catalina.connector.X_POWERED_BY " value="true"/>
 </system-properties>
keepAliveTimeout
N/A
Vor der JBoss EAP 6.4 gab es keinen äquivalenten Paramater in JBoss EAP 6. Intern wurde es auf den Standardwert connectionTimeout gesetzt.
Bei der JBoss EAP 6.4, einer neuen System Property, wurde org.apache.coyote.http11.DEFAULT_KEEP_ALIVE_TIMEOUT eingeführt um das keepAliveTimeout zu kontrollieren. Das -Dorg.apache.coyote.http11.DEFAULT_KEEP_ALIVE_TIMEOUT Argument ist betroffen, wenn es mit dem -Dorg.apache.coyote.http11.DEFAULT_DISABLE_UPLOAD_TIMEOUT=true Argument verwendet wird.
disableUploadTimeout
connectionUploadTimeout
N/A
Derzeit gibt es keine äquivalenten Parameter in JBoss EAP 6. Das disableUploadTimeout ist standardmäßig wahr und das connectionUploadTimeout benutzt intern den connectionTimeout Wert.
packetSize
System Property Dieses Attribut wurde über die System Properties eingerichtet. Die folgende Konfiguration setzt die AJP packetSize auf 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
Der Wert 0 bedeutet unlimitiert. Beachten Sie, dass dieser Parameter die Datengröße nur dann limitieren kann, wenn Content-Type application/x-www-form-urlencoded ist. Weitere Informationen finden Sie unter dieser Lösung im Kundenportal: How to limit data size of HTTP POST method from a client to JBoss
tomcatAuthentication
System Property
Abhängig von der Version von JBoss EAP 6 wird dieses Attribut unter Verwendung der System Property org.apache.coyote.ajp.AprProcessor.TOMCATAUTHENTICATION oder org.apache.coyote.ajp.DEFAULT_TOMCAT_AUTHENTICATION eingerichtet. Ein Patch oder Upgrade ist für alle Versionen des Servers erforderlich.
Bei der JBoss EAP 6.0.1 wird tomcatAuthenticationunter Verwendung der folgenden Property konfiguriert.
<system-properties>
    <property name="org.apache.coyote.ajp.AprProcessor.TOMCATAUTHENTICATION" value="false"/>
</system-properties>
Bei der JBoss EAP 6.1 und späteren Versionen wird tomcatAuthentication folgendermaßen konfiguriert:
<system-properties>
    <property name="org.apache.coyote.ajp.DEFAULT_TOMCAT_AUTHENTICATION" value="false"/>
</system-properties>
Weitere Informationen finden Sie unter dieser Lösung im Kundenportal: How to configure tomcatAuthentication in JBoss EAP 6
Weitere Informationen über Konnektor Attributefinden Sie unter dieser Lösung im Kundenportal: Equivalent HTTP/HTTPS/AJP connector attributes mapping between JBoss EAP 5.x and JBoss EAP 6.x