3.2.13. Migration von Seam 2.2 Applikationen

3.2.13.1. Migration der Seam 2.2 Archive zur JBoss EAP 6

Überblick

Wenn Sie eine Seam 2.2 Applikation migrieren, so müssen Sie die Datenquelle konfigurieren und mögliche Modulabhängigkeiten festlegen. Sie müssen außerdem festlegen, ob die Applikation Abhängigkeiten von Archiven besitzt, die nicht mit der JBoss EAP 6 geliefert werden und etwaige abhängige JARs in das lib/-Verzeichnis der Applikation kopieren.

Wichtig

Applikationen, die Hibernate direkt mit Seam 2.2 verwenden, können eine innerhalb der Applikation gepackte Version von Hibernate 3 verwenden. Hibernate 4, welches mittels des org.hibernate Moduls der JBoss EAP 6 bereitgestellt wird, wird von Seam 2.2 nicht unterstützt. Dieses Beispiel soll Ihnen dabei helfen, Ihre Applikation auf der JBoss EAP 6 in Betrieb zu nehmen. Bitte beachten Sie, dass das Packen von Hibernate 3 mit einer Seam 2.2 Applikation keine unterstützte Konfiguration ist.

Prozedur 3.25. Migration der Seam 2.2 Archive

  1. Aktualisierung der Datenquellen-Konfiguration

    Einige Seam 2.2 Beispiele verwenden die standardmäßige JDBC-Datenquelle namens java:/ExampleDS. Diese Standard-Datenquelle hat sich bei der JBoss EAP 6 zu java:jboss/datasources/ExampleDS geändert. Falls Ihre Applikation die Beispieldatenbank verwendet, so so können Sie eine der folgenden Vorgehensweisen wählen:
    • Falls Sie die mit der JBoss EAP 6 gelieferte Beispieldatenbank verwenden möchten, so bearbeiten Sie die META-INF/persistence.xml-Datei, damit sie das bestehende jta-data-source-Element mit dem Datenquellen JNDI-Namen der Beispieldatenbank ersetzt:
      <!-- <jta-data-source>java:/ExampleDS</jta-data-source> -->
      <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
    • Falls Sie Ihre bestehende Datenbank lieber behalten möchten, so können Sie die Datenquellendefinition der EAP_HOME/standalone/configuration/standalone.xml-Datei hinzufügen.

      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.
      Die folgende Definition ist eine Kopie der standardmäßigen HSQL Datenquelle, die in der JBoss EAP 6 definiert ist:
      <datasource name="ExampleDS" jndi-name="java:/ExampleDS" enabled="true" jta="true" use-java-context="true" use-ccm="true">
         <connection-url>jdbc:h2:mem:test;DB_CLOSE_DELAY=-1</connection-url>
         <driver>h2</driver>
         <security>
            <user-name>sa</user-name>
            <password>sa</password>
         </security>
      </datasource>
    • Sie können die Datenquellen-Definition auch mittels der Management-CLI-Befehlszeilen-Interface hinzufügen. Nachfolgend sehen Sie ein Beispiel für die Syntax, mit der Sie eine Datenquelle hinzufügen. Der "\" am Ende der Zeile zeigt die Fortsetzung des Befehls in der folgenden Zeile an.

      Beispiel 3.5. Beispiel der Syntax für die Hinzufügung der Datenquellen-Definition

      $ EAP_HOME/bin/jboss-cli --connect 
      [standalone@localhost:9999 /] data-source add --name=ExampleDS --jndi-name=java:/ExampleDS \ 
            --connection-url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1 --driver-name=h2 \ 
            --user-name=sa --password=sa
      
    Weitere Informationen zur Konfiguration einer Datenquelle finden Sie unter Abschnitt 3.1.6.2, »Aktualisierung der Datenquellen-Konfiguration«.
  2. Fügen Sie die erforderlichen Abhängigkeiten hinzu

    Da Seam 2.2 Applikationen JSF 1.2 verwenden, müssen Sie Abhängigkeiten für die JSF 1.2 Module hinzufügen und die JSF 2.0 Module ausschließen. Um dies zu bewerkstelligen, müssen Sie eine jboss-deployment-structure.xml-Datei im META-INF/-Verzeichnis des EAR erstellen, das folgende Daten enthält:
    <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>
    Falls Ihre Applikation Protokollierungs-Frameworks von Drittanbietern verwendet, so müssen Sie diese Abhängigkeiten wie hier beschrieben hinzufügen: Abschnitt 3.1.4.1, »Bearbeitung von Protokollierungsabhängigkeiten«.
  3. Falls Ihre Applikation Hibernate 3.x verwendet, so versuchen Sie die Applikation zunächst unter Verwendung von Hibernate 4 Bibliotheken auszuführen

    Falls Ihre Applikation Seam Managed Persistence Context, Hibernate Suche, Validierung und andere Features, die sich in Hibernate 4 geändert haben, nicht verwendet, so können Sie möglicherweise die Hibernate 4 Bibliotheken verwenden. Falls Sie jedoch ClassNotFoundExceptions oder ClassCastExceptions sehen, die auf Hibernate Klassen verweisen oder Fehler ähnlich dem folgenden sehen, so folgen Sie den Anweisungen im nachfolgenden Schritt und bearbeiten Sie die Applikation dahingehend, dass sie Hibernate 3.3 Bibliotheken verwendet.
            Caused by: java.lang.LinkageError: loader constraint violation in interface itable initialization: when resolving method "org.jboss.seam.persistence.HibernateSessionProxy.getSession(Lorg/hibernate/EntityMode;)Lorg/hibernate/Session;" the class loader (instance of org/jboss/modules/ModuleClassLoader) of the current class, org/jboss/seam/persistence/HibernateSessionProxy, and the class loader (instance of org/jboss/modules/ModuleClassLoader) for interface org/hibernate/Session have different Class objects for the type org/hibernate/Session used in the signature
    
  4. Kopieren Sie abhängige Archive von außerhalb liegenden Frameworks oder anderen Orten

    Falls Ihre Applikation Hibernate 3.x verwendet und Sie Hibernate 4 nicht erfolgreich mit Ihrer Applikation verwenden können, so müssen Sie die Hibernate 3.x JARs in das /lib-Verzeichnis kopieren und das Hibernate-Modul im Deployments-Abschnitt der META-INF/jboss-deployment-structure.xml wie folgt ausschließen:
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
     <deployment>
       <exclusions>
         <module name="org.hibernate"/>
       </exclusions>
     <deployment>
    </jboss-deployment-structure>
    Hier sind zusätzliche Schritte, die Sie beim bündeln von Hibernate 3.x mit Ihrer Applikation vornehmen müssen. Weitere Informationen finden Sie unter Abschnitt 3.2.2.2, »Konfiguration der Änderungen bei Applikationen, die Hibernate und JPA verwenden«.
  5. Fehlerbehebung und Auflösung von Seam 2.2 JNDI-Fehlern

    Bei der Migration einer Seam 2.2 Applikation kann es sein, dass Sie javax.naming.NameNotFoundExceptionFehler wie den folgenden im Protokoll sehen:
    javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''
    Falls Sie JNDI-Lookups nicht durch den Code hindurch bearbeiten wollen, so können Sie die components.xml-Datei der Applikation wie folgt bearbeiten:
    1. Ersetzen Sie das bestehende core-init Element

      Zuerst müssen Sie das bestehende core-init Element wie folgt ersetzen:
      <!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/>   -->
      <core:init debug="true" distributable="false"/>
      
    2. Finden Sie die JNDI-Binding INFO-Nachrichten im Serverprotokoll

      Anschließend finden Sie die JNDI-Binding INFO-Nachrichten im Serverprotokoll, die beim Deployment der Applikation gedruckt wurden. Die JNDI-Binding-Nachrichten sollten in etwa so aussehen:
      INFO org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor (MSC service thread 1-1) JNDI bindings for session bean
      named AuthenticatorAction in deployment unit subdeployment "jboss-seam-booking.jar" of deployment "jboss-seam-booking.ear" are as follows:
          java:global/jboss-seam-booking/jboss-seam-booking.jar/AuthenticatorAction!org.jboss.seam.example.booking.Authenticator
          java:app/jboss-seam-booking.jar/AuthenticatorAction!org.jboss.seam.example.booking.Authenticator
          java:module/AuthenticatorAction!org.jboss.seam.example.booking.Authenticator
          java:global/jboss-seam-booking/jboss-seam-booking.jar/AuthenticatorAction
          java:app/jboss-seam-booking.jar/AuthenticatorAction
          java:module/AuthenticatorAction
      
    3. Fügen Sie Komponentenelemente hinzu

      Für jede JNDI-Binding INFO-Nachricht im Protokoll fügen Sie dem components.xml-Datei ein entsprechendes component-Element hinzu:
      <component class="org.jboss.seam.example.booking.AuthenticatorAction" jndi-name="java:app/jboss-seam-booking.jar/AuthenticatorAction" />
    Weitere Informationen zur Fehlerbehebung und Auflösung von Migrationsproblemen finden Sie unter Abschnitt 4.2.1, »Fehler- und Problembehebung bei der Migration«.
    Eine Liste bekannter Migrationsprobleme mit Seam 2 Archiven finden Sie unter Abschnitt 3.2.13.2, »Seam 2.2 Archiv-Migrationsprobleme«.
Ergebnis

Das Seam 2.2 Archiv deployt und läuft nun auf der JBoss EAP 6.