3.2.11. Seam 2.2 アプリケーションの移行

3.2.11.1. Seam 2.2 アーカイブの JBoss Enterprise Application Platform 6 への移行

概要

Seam 2.2 アプリケーションを移行する際、データソースを設定し、モジュール依存関係を指定する必要があります。また、JBoss Enterprise Application Platform 6 に同梱されないアーカイブにアプリケーションの依存関係があるかを判断し、依存している JAR をアプリケーションの lib/ ディレクトリーにコピーする必要があります。

重要

Seam 2.2 で Hibernate を直接使用するアプリケーションは、アプリケーション内部にパッケージ化された Hibernate 3 のバージョンを使用できます。JBoss Enterprise Application Platform 6 の org.hibernate モジュールを介して提供される Hibernate 4 は、Seam 2.2 によりサポートされません。この例では、最初の手順として JBoss Enterprise Application Platform 6 でアプリケーションを実行します。Hibernate 3 を Seam 2.2 アプリケーションでパッケージ化することはサポートされた構成ではないことに注意してください。

手順3.27 Seam 2.2 アーカイブの移行

  1. データソース設定を更新する

    一部の Seam 2.2 の例は、java:/ExampleDS という名前のデフォルトの JDBC データソースを使用します。このデフォルトデータソースは JBoss Enterprise Application Platform 6 では java:jboss/datasources/ExampleDS に変更になりました。例のデータベースがアプリケーションによって使用される場合は、以下のいずれかの方法を実行します。
    • JBoss Enterprise Application Platform 6 に同梱されるサンプルデータベースを使用する場合は、既存の jta-data-source 要素をサンプルデータベースのデータソース JNDI 名に置き換えるよう META-INF/persistence.xml ファイルを変更します。
      <!-- <jta-data-source>java:/ExampleDS</jta-data-source> -->
      <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
      
    • 既存のデータベースを維持したい場合は、データソースの定義を EAP_HOME/standalone/configuration/standalone.xml ファイルに追加することができます。

      重要

      変更がサーバーの再起動後にも維持されるようにするには、サーバー設定ファイルの編集前にサーバーを停止する必要があります。
      JBoss Enterprise Application Platform 6 で定義されたデフォルトの HSQL データソースのコピーは以下のとおりです。
      <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>
      
    • jbossadmin コマンドラインインターフェースを使用してデータソースの定義を追加することも可能です。データソースを追加するために使用しなければならない構文の例は次のとおりです。行の最後にある "\" はコマンドが次の行に続くことを表しています。

      例3.1 データソース定義を追加する構文の例

      $ 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
      
    データソースの設定方法の詳細については 、 「DataSource 設定の更新」 を参照してください。
  2. 必要な依存関係を追加する

    Seam 2.2 アプリケーションは JSF 1.2 を使用するため、JSF 1.2 モジュールの依存関係を追加し、 JSF 2.0 モジュールを除外する必要があります。これを実行するには、以下のデータが格納される EAR の META-INF/ ディレクトリーに jboss-deployment-structure.xml ファイルを作成する必要があります。
    <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>
    
    アプリケーションがサードパーティー製のロギングフレームワークを使用する場合は、「ロギング依存関係の編集」で説明されているようにこれらの依存関係を追加する必要があります。
  3. アプリケーションが Hibernate 3.x を使用する場合は、最初に Hibernate 4 ライブラリーを使用してアプリケーションを実行する

    アプリケーションが Seam Managed Persistence Context、Hibernate 検索、検証、または Hibernate 4 で変更された他の機能を使用しない場合は、Hibernate 4 ライブラリーで実行できることがあります。ただし、Hibernate クラスを参照する ClassNotFoundExceptions または ClassCastExceptions がある場合や以下のようなエラーが発生した場合は、次の手順に従い、Hibernate 3.3 ライブラリーを使用するようアプリケーションを変更する必要があることがあります。
            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. 外部フレームワークまたは他の場所より依存するアーカイブをコピーする

    アプリケーションが Hibernate 3.x を使用し、アプリケーションで Hibernate 4 を問題なく使用できない場合は、Hibernate 3.x JAR を /lib ディレクトリーにコピーし、以下のように META-INF/jboss-deployment-structure.xml のデプロイメントセクションで Hibernate モジュールを除外する必要があります。
    <jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0">
     <deployment>
       <exclusions>
         <module name="org.hibernate"/>
       </exclusions>
     <deployment>
    </jboss-deployment-structure>
    
    アプリケーションで Hibernate 3.x をバンドルする場合は、他にも実行する必要がある手順があります。詳細については、 「Hibernate および JPA を使用するアプリケーションの変更設定」を参照してください。
  5. Seam 2.2 JNDI エラーをデバッグおよび解決する

    Seam 2.2 アプリケーションを移行する時に次のような javax.naming.NameNotFoundException エラーがログに記録されることがあります。
    javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''
    コード全体で JNDI ルックアップを変更しない場合は、以下のようにアプリケーションの components.xml ファイルを変更できます。
    1. 既存の core-init 要素の置き換え

      最初に、以下のように既存の core-init 要素を置き換える必要があります。
      <!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/>   -->
      <core:init debug="true" distributable="false"/>
      
      
    2. サーバーログでの JNDI バインディング INFO メッセージの検索

      次に、アプリケーションがデプロイされたときに、JNDI バインディング INFO メッセージがサーバーログに記録されていることを確認します。JNDI バインディングメッセージは以下のようになるはずです。
      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. コンポーネント要素の追加

      ログの各 JNDI バインディング INFO メッセージに対して、一致する component 要素を components.xml ファイルに追加します。
      <component class="org.jboss.seam.example.booking.AuthenticatorAction" jndi-name="java:app/jboss-seam-booking.jar/AuthenticatorAction" />
      
    移行の問題をデバッグおよび解決する方法の詳細については、 「移行の問題のデバッグと解決」を参照してください。
    Seam 2 アーカイブでの既知の移行の問題一覧については、 「Seam 2.2 アーカイブの移行の問題」を参照してください。
結果

Seam 2.2 アーカイブが JBoss Enterprise Application Platform 6 上にデプロイされ、正常に実行されます。