移行ガイド


JBoss Enterprise Application Platform 6.2

For Use with Red Hat JBoss Enterprise Application Platform 6

エディッション 1

Nidhi Chaudhary

Lucas Costi

Russell Dickenson

Sande Gilda

Vikram Goyal

Eamon Logue

Darrin Mison

Scott Mumford

David Ryan

Misty Stanley-Jones

Keerat Verma

Tom Wells

概要

This book is a guide to migrating your application from previous versions of Red Hat JBoss Enterprise Application Platform.

前書き

第1章 はじめに

1.1. Red Hat JBoss Enterprise Application Platform 6 (JBoss EAP 6) の概要

Red Hat JBoss Enterprise Application Platform 6 (JBoss EAP 6) は、オープンな標準に基づき構築され、Java Enterprise Edition 6 の仕様に準拠する高速でセキュアな高性能ミドルウェアプラットフォームです。高可用性クラスタリング、強力なメッセージング、分散キャッシングなどの技術を JBoss Application Server 7 と統合し、安定したスケーラブルな高速プラットフォームを作り上げます。
新しいモジュラー構造により、必要な時だけサービスを有効にできるため、起動速度が大幅に向上します。管理コンソールと管理コマンドラインインターフェースを使用すると、XML 設定ファイルを手作業で編集する必要がなくなるため、スクリプトを作成して作業を自動化することが可能です。さらに、API と開発フレームワークも含まれており、これらを使用して堅牢で拡張性のある、セキュアな Java EE アプリケーションを迅速に開発することができます。

1.2. 移行ガイドの概要

JBoss EAP 6 は Java Enterprise Edition 6 仕様の軽量で高速の強力な実装です。アーキテクチャーはモジュラーサービスコンテナ上に構築され、アプリケーションが必要な時にサービスをオンデマンドで有効にします。このような新しいアーキテクチャーが導入されたため、JBoss EAP 5 で実行されるアプリケーションを JBoss EAP 6 で実行する際に変更が必要になる場合があります。
本ガイドは、JBoss EAP 5.1 のアプリケーションを JBoss EAP 6 で正常に実行し、デプロイするために必要な変更の文書化を目的としています。また、デプロイメントおよび実行時の問題の解決方法や、アプリケーションの挙動が変更されないようにする方法を説明します。これは新しいプラットフォームへ移行する第一歩となります。アプリケーションが正常にデプロイされ、実行された後、JBoss EAP 6 の新機能を使用するために各コンポーネントのアップグレードを計画できます。

第2章 移行の準備

2.1. 移行の準備

アプリケーションサーバーの構造が以前のバージョンと異なるため、移行ついて調査し、移行計画を立ててからアプリケーションを移行してください。
  1. JBoss EAP 6 の新機能と変更内容

    本リリースには、JBoss EAP 5 のアプリケーションのデプロイメントに影響する可能性がある変更が複数あります。これには、ファイルディレクトリー構造、スクリプト、デプロイメント設定、クラスローディング、JNDI ルックアップなどの変更が含まれます。詳細については、 「JBoss EAP 6 の新機能と変更内容」を参照してください。
  2. スタートガイドの確認

    https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ にある JBoss EAP 6 向け『開発ガイド『』』の章「アプリケーションの開発『』」を必ず参照してください。これには以下に関する重要な情報が含まれます。
    • Java EE 6
    • 新しいモジュール形式クラスローディングシステム
    • ファイル構造の変更
    • JBoss EAP 6 のダウンロードおよびインストール方法
    • JBoss Developer Studio のダウンロードおよびインストール方法
    • 各開発環境に対する Maven の設定方法
    • 製品に同梱されたクイックスタートサンプルアプリケーションのダウンロードおよび実行方法
  3. アプリケーションの分析および理解

    アプリケーションはそれぞれ異なるため、移行を開始する前に既存アプリケーションのコンポーネントやアーキテクチャーについて十分に理解する必要があります。

重要

アプリケーションを変更する前に、必ずバックアップコピーを作成するようにしてください。

2.2. JBoss EAP 6 の新機能と変更内容

はじめに

JBoss EAP 6 が以前のリリースと顕著に異なる点は次の通りです。

モジュールベースのクラスローディング
JBoss EAP 5 ではクラスローディングのアーキテクチャーは階層的でした。JBoss EAP 6 ではクラスローディングが JBoss モジュールベースとなりました。これにより、正確にアプリケーションを分離できるようになったため、サーバー実装クラスを隠し、アプリケーションが必要なクラスのみをロードできるようになりました。より優れたパフォーマンスを実現するため、クラスローディングは平行して実行されます。JBoss EAP 5 向けに書かれたアプリケーションはモジュールの依存関係を指定するために変更する必要があります。場合によってはアーカイブを再パッケージ化する必要があることもあります。詳細については、https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ にある JBoss EAP 6 向け『開発ガイド』『』の章「クラスローディングとモジュール『』」の「クラスローディングとモジュールの概要『』」を参照してください。
ドメイン管理
JBoss EAP 6 ではサーバーをスタンドアロンサーバーとして実行したり、管理対象ドメインで実行することが可能です。管理対象ドメインではサーバーグループ全体を一度に設定できるため、サーバーのネットワーク全体で設定を同期化できます。これにより、以前のリリース向けに構築されたアプリケーションが影響を受けることはありませんが、複数サーバーへのデプロイメントの管理を簡素化できます。詳細については、https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ にある JBoss EAP 6 向け『管理および設定ガイド』『』の「管理対象ドメインについて『』」を参照してください。

注記

ドメインモードは次の JBoss Enterprise 製品ではサポートされていません。
  • JBoss Portal Platform 6
デプロイメント設定
スタンドアロンサーバーと管理対象ドメイン
JBoss EAP 5 ではプロファイルベースのデプロイメント設定を使用し、これらのプロファイルは EAP_HOME/server/ ディレクトリーにありました。多くのアプリケーションにはセキュリティー、データベース、リソースアダプターなどの設定に対する複数の設定ファイルが含まれていました。JBoss EAP 6 では 1 つのファイルを使用してデプロイメントを設定できるようになりました。このファイルは、デプロイメントに使用されるすべてのサービスやサブシステムを設定するために使用されます。スタンドアロンサーバーは EAP_HOME/standalone/configuration/standalone.xml ファイルを使用して設定されます。管理対象ドメインで実行されているサーバーでは、サーバーは EAP_HOME/domain/configuration/domain.xml ファイルを使用して設定されます。JBoss EAP 5 の複数の設定ファイルに含まれる情報は、新しい単一の設定ファイルへ移行する必要があります。
デプロイメントの順序付け
JBoss EAP 6 は、デプロイメントに対して高速で平行した初期化を実行するため、パフォーマンスと効率性が向上します。ほとんどの場合でアプリケーションサーバーは自動的に依存関係を事前判断し、最も効率的なデプロイメントストラテジーを選択します。しかし、EAR としてデプロイされた複数のモジュールで構成され、CDI のインジェクションやリソース参照エントリーの代わりにレガシーの JNDI ルックアップを使用する JBoss EAP 5 のアプリケーションは、設定の変更が必要になります。
ディレクトリー構造とスクリプト
前述のとおり、JBoss EAP 6 はプロファイルベースのデプロイメント設定を使用しません。そのため、EAP_HOME/server/ ディレクトリーは存在しません。スタンドアロンサーバーの設定ファイルは EAP_HOME/standalone/configuration/ ディレクトリー、デプロイメントは EAP_HOME/standalone/deployments/ ディレクトリーにあります。管理対象ドメインで実行されているサーバーの設定ファイルは EAP_HOME/domain/configuration/ ディレクトリー、デプロイメントは EAP_HOME/domain/deployments/ ディレクトリーにあります。
JBoss EAP 5 では、Linux スクリプト EAP_HOME/bin/run.sh または Windows スクリプト EAP_HOME/bin/run.bat を使用してサーバーを起動しました。JBoss EAP 6 では、サーバーの起動方法によってサーバー起動スクリプトが異なります。 スタンドアロンサーバーを使用する場合は、Linux スクリプト EAP_HOME/bin/standalone.sh または Windows スクリプト EAP_HOME/bin/standalone.bat を使用します。 管理対象ドメインを起動する場合は、Linux スクリプト EAP_HOME/bin/domain.sh または Windows スクリプト EAP_HOME/bin/domain.bat を使用します。
JNDI ルックアップ
JBoss EAP 6 では、標準化された移植可能な JNDI 名前空間を使用するようになりました。JBoss EAP 5 向けに書かれた JNDI ルックアップを使用するアプリケーションは、新しい JNDI 名前空間の慣習に従って変更する必要があります。JNDI のネーミング構文についての詳細は 「移植可能な EJB JNDI 名」 を参照してください。
詳細については、https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ にある JBoss EAP 6 向け『開発ガイド『』』の「JBoss EAP 6 の新しい機能と変更された機能『』」を参照してください。

2.3. 廃止および未サポート機能リストの確認

アプリケーションを移行する前に、以前のリリースの JBoss EAP では使用可能で、本リリースでは廃止またはサポート対象外になった機能があることに注意する必要があります。このような機能の完全リストは、カスタマーポータル https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ にある JBoss EAP 6 向け『リリースノート』の「サポート対象外の機能」を参照してください。

第3章 アプリケーションの移行

3.1. ほとんどのアプリケーションで必要な変更

3.1.1. ほとんどのアプリケーションで必要な変更の確認

JBoss EAP 6 のクラスローディングと設定の変更はほとんどのアプリケーションに影響します。また、JBoss EAP 6 は新しい標準の移植可能な JNDI ネーミング構文を使用します。これらの変更はほとんどのアプリケーションに影響するため、アプリケーションを移行する際、最初に以下の情報を確認することが推奨されます。

3.1.2. クラスローディングの変更

3.1.2.1. クラスローディングの変更によるアプリケーションの更新
モジュラークラスローディングは JBoss EAP 6 での重大な変更の 1 つであり、ほぼすべてのアプリケーションが影響を受けます。アプリケーションを移行する際、最初に次の情報を確認してください。
  1. 最初に、アプリケーションのパッケージと依存関係を確認します。詳細については、 「クラスローディングの変更によるアプリケーション依存関係の更新」を参照してください。
  2. アプリケーションがロギングを行う場合、正しいモジュールの依存関係を指定する必要があります。詳細については、 「ロギング依存関係の編集」を参照してください。
  3. モジュラークラスローディングの変更により、EAR または WAR のパッケージ構造を変更する必要がある場合があります。詳細については、 「EAR および WAR パッケージの編集」を参照してください。
3.1.2.2. モジュールの依存関係の理解
概要

モジュールは独自のクラスと、明示的または暗黙的な依存関係を持つモジュールのクラスのみにアクセスすることが可能です。

手順3.1 モジュールの依存関係の理解

  1. 暗黙的な依存関係を理解する

    サーバー内のデプロイヤーは、javax.apisun.jdk などの一般的に使用されるモジュール依存関係を暗黙的かつ自動的に追加します。これにより、ランタイム時にデプロイメントに対してクラスを可視化でき、開発者が依存関係を明示的に追加する作業が軽減されます。暗黙的な依存関係がいつどのように追加されるかについては、https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ にある JBoss EAP 6 向け『開発ガイド『』』の章「クラスローディングとモジュール『』」に記載されている『暗黙的なモジュール依存関係』の説明を参照してください。
  2. 明示的な依存関係の理解

    その他のクラスに対してはモジュールを明示的に指定する必要があります。明示的に指定しないと、不明な依存関係が原因でデプロイメントエラーやランタイムエラーが発生します。依存関係が不明な場合は、サーバーログに ClassNotFoundExceptions トレースまたは NoClassDefFoundErrors トレースが記録されます。複数のモジュールが同じ JAR をロードしたり、異なるモジュールによってロードされるクラスを拡張するクラスを 1 つのモジュールがロードしたりする場合は、サーバーログに ClassCastExceptionsトレースが記録されます。依存関係を明示的に指定するには、MANIFEST.MF を変更するか、JBoss 固有のデプロイメント記述子ファイル jboss-deployment-structure.xml を作成します。モジュール依存関係の詳細については、https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ にある JBoss EAP 6 向け『開発ガイド『』』の章「クラスローディングとモジュール『』」に記載されている『クラスローディングとモジュールの概要』を参照してください。
3.1.2.3. クラスローディングの変更によるアプリケーション依存関係の更新
概要

JBoss EAP 6 のクラスローディングは、以前のバージョンの JBoss EAP とは大きく異なっています。JBoss EAP 6 のクラスローディングは、JBoss モジュールプロジェクトが基盤となっています。各ライブラリーは、すべての JAR をフラットなクラスパスにロードする単一の階層的なクラスローダーではなく、依存するモジュールに対してのみリンクするモジュールとなります。また、JBoss EAP 6 のデプロイメントもモジュールであり、クラスの依存関係が明示的に定義されていないと、アプリケーションサーバーの JAR に定義されているクラスへアクセスできません。アプリケーションサーバーによって定義されるモジュール依存関係の一部は自動的に設定されます。たとえば、Java EE アプリケーションをデプロイする場合、Java EE API の依存関係は自動的または暗黙的に追加されます。サーバーにより自動的に追加される依存関係の完全な一覧については、https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ にある JBoss EAP 6 用『開発ガイド』の章「『クラストーディングとモジュール』」に記載されている『暗黙的なモジュール依存関係』の説明を参照してください。

タスク

モジュラークラスローディングの変更に伴い、アプリケーションを JBoss EAP 6 に移行する際に以下のタスクを 1 つ以上実行する必要がある場合があります。

3.1.3. 設定ファイルの変更

3.1.3.1. JBoss EAP 6 のクラスローディングを制御するファイルの作成または変更
概要

モジュラークラスローディングを使用する JBoss EAP 6 の変更に伴い、依存関係を追加したり、自動的に依存関係がロードされないようにしたりするために、1 つ以上のファイルを作成または変更する必要がある場合があります。クラスローディングとクラスローディングの優先度については、https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ にある JBoss EAP 6 向け『開発ガイド『』』の章「クラスローディングとモジュール『』」を参照してください。

JBoss EAP 6 のクラスローディングを制御するために使用されるファイルは次のとおりです。
jboss-web.xml
jboss-web.xml ファイルに <class-loading> 要素が定義されている場合はこれを削除する必要があります。JBoss EAP 5 でこの要素によって引き起こされた動作は、JBoss EAP 6 ではクラスローディングのデフォルト動作となったため、この要素を定義する必要がなくなりました。この要素を削除しないと、サーバーログに ParseError と XMLStreamException が記録されます。
これは、コメントアウトされた jboss-web.xml ファイルの <class-loading> 要素の例になります。
<!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>


Copy to Clipboard Toggle word wrap
MANIFEST.MF
手作業による編集
アプリケーションが使用するコンポーネントやモジュールによって異なりますが、このファイルに 1 つ以上の依存関係を追加する必要がある場合があります。依存関係は Dependencies エントリーまたは Class-Path エントリーとして追加できます。
開発者によって編集された MANIFEST.MF の例は次のとおりです。
Manifest-Version: 1.0
Dependencies: org.jboss.logmanager
Class-Path: OrderManagerEJB.jar

Copy to Clipboard Toggle word wrap
このファイルを編集する場合、必ずファイルの最後にニューライン文字が含まれるようにしてください。
Maven を使用した生成
Maven を使用する場合、pom.xml ファイルを編集して MANIFEST.MF ファイルの依存関係を生成する必要があります。アプリケーションによって EJB 3.0 が使用される場合、pom.xml ファイルに次のようなセクションが含まれることがあります。
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-ejb-plugin</artifactId>
    <configuration>
        <ejbVersion>3.0</ejbVersion>
    </configuration>
</plugin>

Copy to Clipboard Toggle word wrap
EJB 3.0 コードが org.apache.commons.log を使用する場合、MANIFEST.MF ファイルにこの依存関係が存在しなければなりません。この依存関係を生成するには、次のように <plugin> 要素を pom.xml ファイルに追加します。
<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>

Copy to Clipboard Toggle word wrap
上記の例では、次の依存関係エントリのみが src/main/resources/META-INF/MANIFEST.MF ファイルに含まれる必要があります。
Dependencies: org.apache.commons.logging
Copy to Clipboard Toggle word wrap
Maven は完全な MANIFEST.MF ファイルを生成します。
Manifest-Version: 1.0
Dependencies: org.apache.commons.logging
Copy to Clipboard Toggle word wrap
jboss-deployment-structure.xml
このファイルは、クラスローディングを細かく制御するために使用される JBoss 固有のデプロイメント記述子です。MANIFEST.MF と同様に、このファイルを使用して依存関係を追加することが可能です。また、自動的な依存関係が追加されないようにしたり、追加のモジュールを定義することが可能で、EAR デプロイメントの分離されたクラスローディング動作を変更したり、追加のリソースルートをモジュールへ追加したりすることもできます。
JSF 1.2 モジュールの依存関係を追加し、JSF 2.0 モジュールが自動的にローディングされないようにする 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>
Copy to Clipboard Toggle word wrap
このファイルに関する詳細については、 「jboss-deployment-structure.xml」を参照してください。
application.xml
以前のバージョンの JBoss EAP では、jboss-app.xml ファイルを使用して EAR 内でデプロイメントの順番を制御しました。本バージョンより、Java EE6 仕様によって application.xml<initialize-in-order> 要素が提供されるようになり、EAR 内の Java EE モジュールがデプロイされる順番は、この要素によって制御されるようになりました。
ほとんどの場合、デプロイメントの順番を指定する必要はありません。依存関係インジェクションと、外部モジュールのコンポーネントを参照する resource-refs がアプリケーションによって使用される場合、アプリケーションサーバーは適切で最適なコンポーネントの順番を暗黙的に決定できるため、ほとんどの場合で <initialize-in-order> 要素は必要ありません。
myApp.ear 内に myBeans.jarmyApp.war を持つアプリケーションがあり、myApp.war@EJB のサーブレットが myBeans.jar より Bean をインジェクトする場合、アプリケーションサーバーは必ずサーブレットの起動前に EJB コンポーネントを使用可能にします。<initialize-in-order> 要素を使用する必要はありません。
しかし、次のようなレガシーの JNDI ルックアップスタイルのリモート参照を使用し、Bean へアクセスする場合はモジュールの順番を指定する必要がある場合があります。
init() {
  Context ctx = new InitialContext();
  ctx.lookup("TheBeanInMyBeansModule");
}
Copy to Clipboard Toggle word wrap
この場合、EJB コンポーネントが myBeans.jar にあることをサーバーが判断できないため、myBeans.jar のコンポーネントが myApp.war のコンポーネントの前に初期化され開始されるよう強制する必要があります。これには、 <initialize-in-order> 要素を true に設定し、myBeans.jar モジュールと myApp.war モジュールの順番を application.xml ファイルに指定します。
以下は <initialize-in-order> 要素を使用してデプロイメントの順番を制御する例になります。 myBeans.jarmyApp.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>
Copy to Clipboard Toggle word wrap
application.xml ファイルのスキーマは http://java.sun.com/xml/ns/javaee/application_6.xsd を参照してください。

注記

<initialize-in-order> 要素を true に設定するとデプロイメントの速度が遅くなることに注意してください。デプロイメントを最適化するときにコンテナの柔軟性が向上するため、依存関係インジェクションや resource-refs を使用して適切な依存関係を定義する方法が推奨されます。
jboss-ejb3.xml
Java Enterprise Edition (EE) が定義する ejb-jar.xml デプロイメント記述子によって提供される機能を上書きしたり追加したりするために、jboss.xmljboss-ejb3.xml デプロイメント記述子に置き換えられました。この新しいファイルは jboss.xml との互換性がないため、jboss.xml はデプロイメントで無視されます。
login-config.xml
login-config.xml ファイルはセキュリティー設定で使用されないようになりました。セキュリティーはサーバー設定ファイルの <security-domain> 要素に設定されるようになりました。スタンドアロンサーバーでは standalone/configuration/standalone.xml ファイルになります。管理対象ドメインでサーバーを実行している場合は domain/configuration/domain.xml ファイルになります。
3.1.3.2. jboss-deployment-structure.xml
jboss-deployment-structure.xml は JBoss EAP 6 の新しいオプションデプロイメント記述子です。このデプロイメント記述子を使用すると、デプロイメントのクラスローディングを制御できます。
このデプロイメント記述子の XML スキーマは、EAP_HOME/docs/schema/jboss-deployment-structure-1_2.xsd にあります。
3.1.3.3. 新しいモジュラークラスローディングシステムのパッケージリソース
概要

以前のバージョンの JBoss EAP では、WEB-INF/ ディレクトリー内のすべてのリソースが WAR クラスパスに追加されました。JBoss EAP 6 では、Web アプリケーションのアーティファクトは WEB-INF/classes および WEB-INF/lib ディレクトリーからのみロードされます。指定の場所でアプリケーションアーティファクトのパッケージ化に失敗した場合、ClassNotFoundExceptionNoClassDefError などのランタイムエラーが発生します。

これらのクラスローディングエラーを解決するには、アプリケーションアーカイブの構造を編集するか、カスタムモジュールを定義する必要があります。

リソースパッケージの編集
アプリケーションのみがリソースを使用できるようにするには、プロパティーファイル、JAR、およびその他のアーティファクトを WEB-INF/classes/ または WEB-INF/lib/ ディレクトリーへ移動し、WAR とバンドルします。この方法の詳細については、 「ResourceBundle プロパティーの場所変更」 を参照してください。
カスタムモジュールの作成
JBoss EAP サーバー上で実行されているすべてのアプリケーションが、カスタムリソースを使用できるようにするには、カスタムモジュールを作成する必要があります。この方法の詳細については、 「カスタムモジュールの作成」を参照してください。
3.1.3.4. ResourceBundle プロパティーの場所変更
概要

以前のバージョンの JBoss EAP では、EAP_HOME/server/SERVER_NAME/conf/ ディレクトリーはクラスパスに存在し、アプリケーションによる使用が可能でした。このプロパティーを JBoss EAP 6 のアプリケーションのクラスパスで使用できるようにするには、アプリケーション内でパッケージ化する必要があります。

手順3.2

  1. WAR アーカイブをデプロイする場合、これらのプロパティーを WAR の WEB-INF/classes/ フォルダーでパッケージ化する必要があります。
  2. これらのプロパティーを EAR のすべてのコンポーネントに対してアクセス可能にするには、JAR のルートでパッケージ化し、EAR の lib/ フォルダーに置く必要があります。
3.1.3.5. カスタムモジュールの作成
次の手順では、JBoss EAP サーバー上で実行されているすべてのアプリケーションがプロパティーファイルやその他のリソースを使用できるようにするために、カスタムモジュールを作成する方法について説明します。

手順3.3 カスタムモジュールの作成

  1. module/ ディレクトリー構造を作成し、ファイルを追加します。
    1. EAP_HOME/module ディレクトリー下にディレクトリー構造を作成し、ファイルや JAR が含まれるようにします。例は次のとおりです。
      $ cd EAP_HOME/modules/ $ cd EAP_HOME/modules/ $ cd EAP_HOME/modules/ $ mkdir -p myorg-conf/main/properties
      
      
      Copy to Clipboard Toggle word wrap
    2. 作成した EAP_HOME/modules/myorg-conf/main/properties/ ディレクトリーにプロパティーファイルを移動します。
    3. 次の XML が含まれる module.xml ファイルを EAP_HOME/modules/myorg-conf/main/ ディレクトリーに作成します。
      <module xmlns="urn:jboss:module:1.1" name="myorg-conf">
          <resources>
              <resource-root path="properties"/>
          </resources>
      </module>
      
      
      Copy to Clipboard Toggle word wrap
  2. サーバー設定ファイルの ee サブシステムを編集します。JBoss CLI を使用するか、手作業でファイルを編集します。
    • 次の手順に従って JBoss CLI を使用し、サーバー設定ファイルを編集します。
      1. サーバーを起動し、管理 CLI へ接続します。
        • Linux の場合は、コマンドラインで以下を入力します。
          $ EAP_HOME/bin/jboss-cli.sh --connect
          
          Copy to Clipboard Toggle word wrap
        • Windows の場合は、コマンドラインで以下を入力します。
          C:\>EAP_HOME\bin\jboss-cli.bat --connect
          
          Copy to Clipboard Toggle word wrap
        次の応答が表示されるはずです。
        Connected to standalone controller at localhost:9999
        Copy to Clipboard Toggle word wrap
      2. ee サブシステムに myorg-conf<global-modules> 要素を作成するには、コマンドラインで以下を入力します。
        /subsystem=ee:write-attribute(name=global-modules, value=[{"name"=>"myorg-conf","slot"=>"main"}])
        
        Copy to Clipboard Toggle word wrap
        次の結果が表示されるはずです。
        {"outcome" => "success"}
        
        Copy to Clipboard Toggle word wrap
    • サーバー設定ファイルを手作業で編集する場合は、次の手順に従ってください。
      1. サーバーを停止し、テキストエディターでサーバー設定ファイルを開きます。スタンドアロンサーバーを実行している場合は、EAP_HOME/standalone/configuration/standalone.xml ファイルになります。管理対象ドメインを実行している場合は、EAP_HOME/domain/configuration/domain.xml ファイルになります。
      2. ee サブシステムを見つけ、myorg-conf のグローバルモジュールを追加します。以下は、myorg-conf 要素が含まれるように編集された ee サブシステム要素の例になります。
        <subsystem xmlns="urn:jboss:domain:ee:1.0" >            
            <global-modules>
                <module name="myorg-conf" slot="main" />            
            </global-modules>
        </subsystem>
        
        
        Copy to Clipboard Toggle word wrap
  3. my.properties という名前のファイルを正しいモジュールの場所にコピーした場合は、以下のようなコードを使用してプロパティーファイルをロードできるようになります。
    Thread.currentThread().getContextClassLoader().getResource("my.properties");
    
    Copy to Clipboard Toggle word wrap

3.1.4. ロギングの変更

3.1.4.1. ロギング依存関係の編集
概要

JBoss LogManager はすべてのロギングフレームワークのフロントエンドをサポートするため、現在のロギングコードを保持することも、新しい JBoss のロギングインフラストラクチャーへ移行することも可能です。モジュラークラスローディングが変更されたため、いずれの場合でもアプリケーションを変更して必要な依存関係を追加する必要があるでしょう。

3.1.4.2. サードパーティーロギングフレームワークのアプリケーションコードの更新
概要

JBoss EAP 6 では、Apache Commons Logging、Apache log4j、SLF4J、Java Logging などの一般的なサードパーティーフレームワークのロギング依存関係はデフォルトで追加されています。ただし、log4j を使用し、ハンドラー (アペンダー) の設定にロギングサブシステムを使用しない場合は、JBoss EAP の log4j モジュールを除外する必要があります。

手順3.5 log4j.properties または log4j.xml ファイルを使用するよう JBoss EAP 6 を設定する

  1. 次の内容が含まれる 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>
        </deployment>
    </jboss-deployment-structure>
    
    
    Copy to Clipboard Toggle word wrap
  2. jboss-deployment-structure.xml ファイルは、WAR をデプロイする場合は META-INF/ ディレクトリーまたは WEB-INF/ ディレクトリーに置き、EAR をデプロイする場合は META-INF/ ディレクトリーに置きます。
  3. log4j.properties または log4j.xml ファイルを、EAR の lib/ ディレクトリーまたは WAR デプロイメントの WEB-INF/classes/ ディレクトリーに含めます。
  4. アプリケーションをデプロイします。

注記

log4j 設定ファイルを使用すると、実行時に log4j ロギング設定を変更できなくなります。
3.1.4.3. 新しい JBoss ロギングフレームワークを使用したコードの変更
概要

新しいフレームワークを使用するには、次のようにインポートとコードを変更します。

手順3.6 JBoss ロギングフレームワークを使用するようコードおよび依存関係を変更する

  1. インポートとロギングコードの変更

    新しい JBoss ロギングフレームワークを使用するコードの例は以下のとおりです。
    import org.jboss.logging.Level;
    import org.jboss.logging.Logger;
    
    private static final Logger logger = Logger.getLogger(MyClass.class.toString());
    
    if(logger.isTraceEnabled()) {
        logger.tracef("Starting...", subsystem);
    }
    
    Copy to Clipboard Toggle word wrap
  2. ロギング依存関係の追加

    JBoss ロギングクラスが含まれる JAR は org.jboss.logging という名前のモジュールにあります。MANIFEST-MF ファイルは次のようになるはずです。
    Manifest-Version: 1.0
    Dependencies: org.jboss.logging
    
    Copy to Clipboard Toggle word wrap
    モジュール依存関係の検索方法に関する詳細については、「クラスローディングの変更によるアプリケーション依存関係の更新」「移行の問題のデバッグと解決」を参照してください。

3.1.5. アプリケーションパッケージの変更

3.1.5.1. EAR および WAR パッケージの編集
概要

アプリケーションを移行する際、モジュラークラスローディングの変更に伴い、EAR または WAR のパッケージ構造を変更する必要がある場合があります。モジュール依存関係は次の順序でロードされます。

  1. システム依存関係
  2. ユーザー依存関係
  3. ローカルリソース
  4. デプロイメント間の依存性

手順3.7 アーカイブパッケージの編集

  1. WAR のパッケージ化

    WAR は単一のモジュールで、WAR のすべてのクラスは同じクラスローダーでロードされます。そのため WEB-INF/lib/ ディレクトリーにパッケージされるクラスは、WEB-INF/classes ディレクトリーのクラスと同様に処理されます。
  2. EAR のパッケージ化

    EAR は複数のモジュールによって構成されます。EAR/lib/ ディレクトリーは単一のモジュールで、EAR 内の各 WAR や EJB jar サブデプロイメントは個別のモジュールになります。依存関係が明示的に定義された場合を除き、クラスは EAR 内の他のモジュールにあるクラスへアクセスすることはできません。サブデプロイメントは常に親モジュール上で自動的な依存関係を持ち、親モジュールは EAR/lib/ ディレクトリーのクラスへのアクセスを許可します。しかし、サブデプロイメントはお互いのアクセスを許可するため常に自動的な依存関係を持っているわけではありません。この挙動は次のように ee サブシステム設定の <ear-subdeployments-isolated> 要素を設定すると制御することができます。
    <subsystem xmlns="urn:jboss:domain:ee:1.0" >            
      <ear-subdeployments-isolated>false</ear-subdeployments-isolated>
    </subsystem>
    
    Copy to Clipboard Toggle word wrap
    デフォルトでは false に設定され、EAR 内の他のサブデプロイメントに属するクラスがサブデプロイメントに対して可視化されます。
    クラスローディングの詳細については、https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ にある JBoss EAP 6 向け『開発ガイド『』』の章「クラスローディングとモジュール『』」を参照してください。

3.1.6. データソースおよびリソースアダプター設定の変更

3.1.6.1. 設定変更によるアプリケーションの更新
JBoss EAP 5 では、サービスやサブシステムが多くのファイルに設定されていました。JBoss EAP 6 では、設定は主に 1 つのファイルで行われます。アプリケーションが以下のサービスやリソースを使用する場合は、設定の変更が必要になることがあります。
  1. アプリケーションがデータソースを使用する場合は、 「DataSource 設定の更新」を参照してください。
  2. アプリケーションが JPA を使用し、現在 Hibernate JAR をバンドルする場合は、 「Hibernate または JPA 用のデータソースの設定」を参照し、移行のオプションについて確認してください。
  3. アプリケーションがリソースアダプターを使用する場合は、 「リソースアダプター設定の更新」を参照してください。
  4. 「アプリケーションセキュリティーの変更設定」を参照し、基本的なセキュリティーの設定変更方法について確認してください。
3.1.6.2. DataSource 設定の更新
概要

以前のバージョンの JBoss EAP では、ファイル名の最後に *-ds.xml が付くファイルに JCA データソースの設定が定義されていました。このファイルはサーバーの deploy/ ディレクトリーにデプロイされるか、アプリケーションによってパッケージ化されました。JDBC ドライバーは server/lib/ ディレクトリーにコピーされるか、アプリケーションの WEB-INF/lib/ ディレクトリーにパッケージ化されました。この設定方法は開発環境では今でもサポートされていますが、JBoss の管理ツールではサポートされていないため実稼働環境では推奨されません。

JBoss EAP 6 では、データソースはサーバー設定ファイルに設定されています。JBoss EAP 6 インスタンスが管理対象ドメインで実行されている場合、データソースは domain/configuration/domain.xml ファイルに設定されます。JBoss EAP 6 インスタンスがスタンドアロンサーバーとして実行されている場合、データソースは standalone/configuration/standalone.xml ファイルに設定されます。このように設定されたデータソースは、Web 管理コンソールやコマンドラインインターフェース (CLI) などが含まれる JBoss 管理インターフェースを使用して管理および制御されます。これらのツールはデプロイメントの管理や、管理対象ドメインで実行されている複数のサーバーの設定を容易にします。
次の項では、使用可能な管理ツールによって管理およびサポートされるよう、データソースの設定を変更する方法について説明します。
JBoss EAP 6 の管理可能なデータソース設定の移行

JDBC 4.0 対応のドライバーはデプロイメントまたはコアモジュールとしてインストールすることができます。JDBC 4.0 対応のドライバーには、ドライバークラス名を指定する META-INF/services/java.sql.Driver ファイルが含まれています。JDBC 4.0 対応でないドライバーには追加の設定が必要となります。ドライバーを JDBC 4.0 対応にする方法や、現在のデータソース設定を Web 管理コンソールや CLI によって管理可能な設定に更新する方法の詳細については、 「JDBC ドライバーのインストールと設定」を参照してください。

アプリケーションが Hibernate や JPA を使用する場合、追加の変更が必要となる場合があります。詳細については、 「Hibernate または JPA 用のデータソースの設定」を参照してください。
IronJacamar 移行ツールを使用した設定データの変換

IronJacamar ツールを使用するとデータソースおよびリソースアダプターの設定を移行できます。このツールは、*-ds.xml 形式の設定ファイルを JBoss EAP 6 が想定する形式に変換します。詳細は 「IronJacamar ツールを使用してデータソースとリソースアダプターの設定を移行する」を参照してください。

3.1.6.3. JDBC ドライバーのインストールと設定
概要

次の 2 つの方法の 1 つを用いて JDBC ドライバーをコンテナにインストールできます。

  • デプロイメントとしてのインストール
  • コアモジュールとしてのインストール
これらの方法の利点と欠点は次のとおりです。

JBoss EAP 6 では、データソースはサーバー設定ファイルに設定されています。JBoss EAP 6 インスタンスが管理対象ドメインで実行されている場合、データソースは domain/configuration/domain.xml ファイルに設定されます。JBoss EAP 6 インスタンスがスタンドアロンサーバーとして実行されている場合、データソースは standalone/configuration/standalone.xml ファイルに設定されます。両モードで共通のスキーマ参照情報は JBoss EAP 6 インストールの doc/schema/ ディレクトリーにあります。ここでは説明上、サーバーがスタンドアロンサーバーとして稼働し、データソースが standalone.xml ファイルに設定されていると仮定します。

手順3.8 JDBC ドライバーのインストールと設定

  1. JDBC ドライバーのインストール

    1. JDBC ドライバーのデプロイメントとしてのインストール

      これはドライバーのインストールに推奨される方法です。JDBC ドライバーがデプロイメントとしてインストールされると、普通の JAR としてデプロイされます。JBoss EAP 6 インスタンスがスタンドアロンサーバーとして実行されている場合は、 JDBC 4.0 対応の JAR を EAP_HOME/standalone/deployments/ ディレクトリーへコピーします。サーバーが管理対象ドメインとして実行されている場合は、JAR を EAP_HOME/domain/deployments/ ディレクトリーへコピーします。
      スタンドアロンサーバーにデプロイメントとしてインストールされた MySQL JDBC ドライバーの例は次のとおりです。
      $cp mysql-connector-java-5.1.15.jar EAP_HOME/standalone/deployments/EAP_HOME/standalone/deployments/
      Copy to Clipboard Toggle word wrap
      JDBC 4.0 対応のドライバーは自動的に認識され、名前とバージョンによってシステムへインストールされます。JDBC 4.0 対応の JAR にはドライバーのクラス名を指定する META-INF/services/java.sql.Driver という名前のテキストファイルが含まれてます。ドライバーが 4.0 対応でない場合は、次の方法の 1 つを用いてデプロイ可能にすることができます。
      • java.sql.Driver ファイルを作成し、META-INF/services/ パス下の JAR に追加します。このファイルには、次のようなドライバークラス名が含まれていなければなりません。
        com.mysql.jdbc.Driver
        Copy to Clipboard Toggle word wrap
      • java.sql.Driver ファイルをデプロイメントディレクトリーに作成します。スタンドアロンサーバーとして実行されている JBoss EAP 6 のインスタンスの場合、このファイルを EAP_HOME/standalone/deployments/META-INF/services/java.sql.Driver に置く必要があります。サーバーが管理ドメインで実行されている場合、EAP_HOME/domain/deployments/META-INF/services/java.sql.Driver に置く必要があります。
      この方法の利点は次のとおりです。
      • モジュールを定義する必要がないため、これが最も簡単な方法です。
      • サーバーが管理対象ドメインで実行されている場合は、この方法を使用するデプロイメントがドメイン内のすべてのサーバーに自動的に伝播されます。つまり、管理者はドライバー JAR を手動で配布する必要がありません。
      この方法の欠点は次のとおりです。
      • JDBC ドライバーが複数の JAR (たとえば、ドライバー JAR および依存ライセンス JAR またはローカリゼーション JAR) から構成される場合、ドライバーをデプロイメントとしてインストールすることはできません。JDBC ドライバーは、コアモジュールとしてインストールする必要があります。
      • ドライバーが JDBC 4.0 対応でない場合は、ドライバークラス名を含むファイルを作成し、JAR にインポートするか、deployments/ ディレクトリーにオーバーレイする必要があります。
    2. コアモジュールとしての JDBC ドライバーのインストール

      JDBC ドライバーをコアモジュールとしてインストールするには、EAP_HOME/modules/ ディレクトリー下にファイルパス構造を作成する必要があります。この構造には、JDBC ドライバー JAR、任意の追加ベンダーライセンスまたはローカリゼーション JAR、およびモジュールを定義する module.xml ファイルが含まれます。
      • MySQL JDBC ドライバーをコアモジュールとしてインストール

        1. ディレクトリー構造 EAP_HOME/modules/com/mysql/main/ を作成します。
        2. main/ サブディレクトリーで、MySQL JDBC ドライバーに対する以下のモジュール定義を含む module.xml ファイルを作成します。
          <?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>
          
          
          
          Copy to Clipboard Toggle word wrap
          モジュール名 "com.mysql" はこのモジュールのディレクトリー構造と一致します。<dependencies> 要素は、このモジュールの他のモジュールへの依存関係を指定するために使用されます。この場合、全 JDBC データソースの場合と同様に、javax.api という名前の他のモジュールによって定義される Java JDBC API に依存します。このモジュールは modules/system/layers/base/javax/api/main/ ディレクトリーに存在します。

          注記

          module.xml ファイルの最初に空白文字が存在しないようにしてください。空白文字が存在すると、このドライバーに対して 「New missing/unsatisfied dependencies」エラーが発生します。
        3. MySQL JDBC ドライバー JAR を EAP_HOME/modules/com/mysql/main/ ディレクトリーへコピーします。
          $ cp mysql-connector-java-5.1.15.jar EAP_HOME/modules/com/mysql/main/EAP_HOME/modules/com/mysql/main/
          Copy to Clipboard Toggle word wrap
      • IBM DB2 JDBC ドライバーおよびライセンス JAR をコアモジュールとしてインストール

        この例は、 JDBC ドライバー JAR 以外に JAR が必要なドライバーをデプロイする方法を示すためにのみ提供されています。
        1. ディレクトリー構造 EAP_HOME/modules/com/ibm/db2/main/ を作成します。
        2. main/ サブディレクトリーで、IBM DB2 JDBC ドライバーとライセンスに対する以下のモジュール定義を含む module.xml ファイルを作成します。
          <?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>
          
          
          Copy to Clipboard Toggle word wrap

          注記

          module.xml ファイルの最初に空白文字が存在しないようにしてください。空白文字が存在すると、このドライバーに対して 「New missing/unsatisfied dependencies」エラーが発生します。
        3. JDBC ドライバーおよびライセンス JAR を EAP_HOME/modules/com/ibm/db2/main/ ディレクトリーにコピーします。
          $ cp db2jcc.jar EAP_HOME/modules/com/ibm/db2/main/EAP_HOME/modules/com/ibm/db2/main/
          $ cp db2jcc_license_cisuz.jar EAP_HOME/modules/com/ibm/db2/main/EAP_HOME/modules/com/ibm/db2/main/
          Copy to Clipboard Toggle word wrap
      この方法の利点は次のとおりです。
      • これは、JDBC ドライバーが複数の JAR から構成される場合に有効な唯一の方法です。
      • この方法では、JDBC 4.0 対応でないドライバーは、ドライバー JAR を変更したり、ファイルオーバーレイを作成したりせずにインストールできます。
      この方法の欠点は次のとおりです。
      • モジュールのセットアップはより困難になります。
      • モジュールは、管理対象ドメインで実行されている各サーバーに手動でコピーする必要があります。
  2. データソースの設定

    1. データベースドライバーの追加

      <driver> 要素を同じファイルの <drivers> 要素に追加します。以前 *-ds.xml ファイルに定義されたデータソース情報と同じ情報が一部含まれます。
      最初にドライバー JAR が JDBC 4.0 対応であるか判断します。JDBC 4.0 対応の JAR にはドライバークラス名を指定する META-INF/services/java.sql.Driver ファイルが含まれています。サーバーはこのファイルを使用して JAR のドライバークラス名を探します。JDBC 4.0 対応の ドライバーの JAR には既に <driver-class> 要素が指定されているため、この要素は必要ありません。JDBC 4.0 対応 MySQL ドライバーのドライバー要素の例は次のとおりです。
      <driver name="mysql-connector-java-5.1.15.jar" module="com.mysql"/>
      
      Copy to Clipboard Toggle word wrap
      JDBC 4.0 対応でないドライバーには、ドライバークラスを指定する <driver-class> 属性が必要です。これは、ドライバークラス名を指定する META-INF/services/java.sql.Driver ファイルが存在しないためです。JDBC 4.0 対応でないドライバーのドライバー要素の例は、次のとおりです。
      <driver name="mysql-connector-java-5.1.15.jar" module="com.mysql"><driver-class>com.mysql.jdbc.Driver</driver-class></driver>
      
      
      Copy to Clipboard Toggle word wrap
    2. データソースの作成

      standalone.xml ファイルの <datasources> セクションに <datasource> 要素を作成します。このファイルには、以前に *-ds.xml ファイルに定義されたデータソース情報とほとんど同じ情報が含まれています。

      重要

      変更がサーバーの再起動後にも維持されるようにするには、サーバー設定ファイルの編集前にサーバーを停止する必要があります。
      standalone.xml ファイルの MySQL データソース要素の例は次のとおりです。
      <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>
      
      
      Copy to Clipboard Toggle word wrap
3.1.6.4. Hibernate または JPA 用のデータソースの設定

アプリケーションが JPA を使用し、現在 Hibernate JAR をバンドルする場合、JBoss EAP 6 に含まれる Hibernate を使用した方がよいでしょう。このバージョンの Hibernate を使用するには、アプリケーションから古いバージョンの Hibernate バンドルを削除する必要があります。

手順3.9 Hibernate バンドルの削除

  1. アプリケーションライブラリーフォルダーより Hibernate JAR を削除します。
  2. persistence.xml ファイルの <hibernate.transaction.manager_lookup_class> 要素は必要がないため、削除またはコメントアウトします。
3.1.6.5. リソースアダプター設定の更新
概要

以前のバージョンのアプリケーションサーバーでは、リソースアダプター設定は、ファイル名の最後に *-ds.xml が付くファイルで定義されました。JBoss EAP 6 では、リソースアダプターはサーバー設定ファイルで設定されます。管理対象ドメインで実行されている場合、設定ファイルは EAP_HOME/domain/configuration/domain.xml ファイルになります。スタンドアロンサーバーとして実行されている場合、EAP_HOME/standalone/configuration/standalone.xml ファイルのリソースアダプターを設定します。リソースアダプター記述子 にあるスキーマ参照情報は両モード共通です。

重要

変更がサーバーの再起動後にも維持されるようにするには、サーバー設定ファイルの編集前にサーバーを停止する必要があります。
リソースアダプターの定義

リソースアダプター記述子の情報は、サーバー設定ファイルの次のサブシステム要素下に定義されます。

<subsystem xmlns="urn:jboss:domain:resource-adapters:1.1"/>
Copy to Clipboard Toggle word wrap
以前にリソースアダプター *-ds.xml ファイルに定義された情報と同じものの一部を使用します。

以下に、サーバー設定ファイルのリソースアダプター要素の例を示します。
<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>
Copy to Clipboard Toggle word wrap

3.1.7. セキュリティーの変更

3.1.7.1. アプリケーションセキュリティーの変更設定
基本認証のセキュリティーの設定

以前のバージョンの JBoss EAP では、EAP_HOME/server/SERVER_NAME/conf/ ディレクトリーに置かれたプロパティーファイルはクラスパス上にあり、UsersRolesLoginModule によって簡単に見つかりました。JBoss EAP 6 ではディレクトリー構造が変更されたため、プロパティーファイルをアプリケーション内でパッケージ化し、クラスパスで使用できるようにする必要があります。

重要

変更がサーバーの再起動後にも維持されるようにするには、サーバー設定ファイルの編集前にサーバーを停止する必要があります。
基本認証のセキュリティーを設定するには、security-domains 下の新しいセキュリティードメインを standalone/configuration/standalone.xml または 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>
Copy to Clipboard Toggle word wrap
JBoss EAP 6 インスタンスがスタンドアロンサーバーとして実行されている場合、 ${jboss.server.config.dir}EAP_HOME/standalone/configuration/ ディレクトリーを参照します。インスタンスが管理対象ドメインで実行されている場合、 ${jboss.server.config.dir}EAP_HOME/domain/configuration/ ディレクトリーを参照します。
セキュリティードメイン名の変更

JBoss EAP 6 では、セキュリティードメインは名前で接頭辞 java:/jaas/ を使用しなくなりました。

  • Web アプリケーションの場合は、jboss-web.xml のセキュリティードメイン設定からこの接頭辞を削除する必要があります。
  • エンタープライズアプリケーションの場合は、jboss-ejb3.xml ファイルのセキュリティードメイン設定からこの接頭辞を削除する必要があります。JBoss EAP 6 では、jboss.xml はこのファイルに置き換えられました。

3.1.8. JNDI の変更

3.1.8.1. アプリケーションの JNDI 名前空間名の更新
概要

EJB 3.1 には、標準化されたグローバル JNDI 名前空間や、Java EE アプリケーションのさまざまなスコープへマップする名前空間が導入されました。移植可能な EJB 名は、java:globaljava:modulejava:app の 3 つのみへバインドされます。EJB を用いるアプリケーションが JNDI を使用する場合、そのアプリケーションを変更し、新しい標準 JNDI 名前空間の慣例に従うようにする必要があります。

JNDI マッピングの例

以前のリリースにおける JNDI 名前空間の例や、 JBoss EAP 6 で指定する方法については、 「以前のリリースでの JNDI 名前空間の例、および JBoss EAP 6 での名前空間の指定方法」を参照してください。

3.1.8.2. 移植可能な EJB JNDI 名
概要

Java EE 6 仕様には、独自のスコープを持つ 4 つの論理的な名前空間が定義されていますが、移植可能な EJB 名はそのうちの 3 つの名前空間へのみバインドされます。下表は、各名前空間の使用方法と使用時の詳細を表しています。

Expand
表3.1 移植可能な JNDI 名前空間
JNDI 名前空間 説明
java:global
この名前空間の名前は、アプリケーションサーバーインスタンスにデプロイされてたすべてのアプリケーションで共有されます。同じサーバーへデプロイされた EJB の外部アーカイブを検索するには、この名前空間の名前を使用します。
Java:global 名前空間の例は、java:global/jboss-seam-booking/jboss-seam-booking-jar/HotelBookingAction です。
java:module
この名前空間の名前は、1 つの EJB モジュールにある全エンタープライズ Bean や Web モジュールにある全コンポーネントなど、モジュール内の全コンポーネントで共有されます。
java:module 名前空間の例は、java:module/HotelBookingAction!org.jboss.seam.example.booking.HotelBooking です。
java:app
この名前空間の名前は、1つのアプリケーション内にある全モジュールのコンポーネントすべてで共有されます。例えば、同じ EAR ファイルにある WAR や EJB jar ファイルは java:app 名前空間のリソースにアクセスできます。
java:app 名前空間の例は、java:app/jboss-seam-booking-jar/HotelBookingAction です。
JNDI ネーミングコンテキストの詳細については、『JSR 316: JavaTM Platform, Enterprise Edition (Java EE) 仕様バージョン 6 (JSR 316: JavaTM Platform, Enterprise Edition (Java EE) Specification, v6)』のセクション EE.5.2.2「Application Component Environment Namespaces」 を参照してください。この仕様は、http://jcp.org/en/jsr/detail?id=316 からダウンロードすることができます。
3.1.8.3. JNDI 名前空間のルールの確認
概要

JBoss EAP 6 では JNDI 名前空間の名前が改良され、アプリケーションにバインドされた名前に対して予測可能で一貫性のあるルールを提供するだけでなく、将来的に互換性の問題が起こらないよう対処されます。そのため、現在の名前空間が新ルールに準拠しない場合、問題が発生することがあります。

名前空間は次のルールに準拠する必要があります。

  1. DefaultDSjdbc/DefaultDS などの不適切な相対名は、コンテキストに応じて java:comp/envjava:module/env、または java:jboss/env に対して相対的に修飾する必要があります。
  2. /jdbc/DefaultDS などの不適切な absolute 名は、java:jboss/root 名に対して相対的に修飾する必要があります。
  3. java:/jdbc/DefaultDS などの適切な absolute 名は、上記の不適切な absolute 名と同様に修飾する必要があります。
  4. 特別な java:jboss 名前空間は、 AS サーバーインスタンス全体で共有されます。
  5. java: 接頭辞を持つ relative 名は、compmoduleappglobal、または商用の jboss の 5 つの名前空間のいずれかに属する必要があります。xxx がこの 5 つのいずれにも一致しない java:xxx で始まる名前の場合は、無効な名前エラーが発生します。

3.1.8.4. JNDI 名前空間の新ルールに準拠するようアプリケーションを変更する

  • JBoss EAP 5.1 の JNDI ルックアップの例は次のとおりです。通常、このコードは初期化メソッドに存在します。
    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);
    }
    
    Copy to Clipboard Toggle word wrap
    ルックアップ名は OrderManagerApp/ProductManagerBean/local になります。
  • 次の例は、JBoss EAP 6 では同じルックアップがどのようにコード化されるかを表しています。
    @EJB(lookup="java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager")
    private ProductManager productManager;
    
    Copy to Clipboard Toggle word wrap
    ルックアップ値はメンバー変数として定義され、新しい移植可能な java:app JNDI 名前空間名である java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager が使用されます。
  • CDI を使用したくない場合は、前述のとおりに新しい InitialContext を作成し、新しい 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);
    }
    
    Copy to Clipboard Toggle word wrap

3.1.8.5. 以前のリリースでの JNDI 名前空間の例、および JBoss EAP 6 での名前空間の指定方法
Expand
表3.2
JBoss EAP 5.x の名前空間 JBoss EAP 6 の名前空間 追加コメント
OrderManagerApp/ProductManagerBean/local java:module/ProductManagerBean!services.ejb.ProductManager Java EE 6 の標準バインディング。現在のモジュールへスコープ指定され、同じモジュール内でのみアクセス可能。
OrderManagerApp/ProductManagerBean/local java:app/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager Java EE 6 の標準バインディング。現在のアプリケーションへスコープ指定され、同じアプリケーション内でのみアクセス可能。
OrderManagerApp/ProductManagerBean/local java:global/OrderManagerApp/OrderManagerEJB/ProductManagerBean!services.ejb.ProductManager Java EE 6 の標準バインディング。アプリケーションサーバーへスコープ指定され、グローバルにアクセス可能です。
java:comp/UserTransaction java:comp/UserTransaction 名前空間は現在のコンポーネントへスコープ指定されます。アプリケーションによって直接作成されるスレッドなど、Java EE 6 でないスレッドはアクセスできません。
java:comp/UserTransaction java:jboss/UserTransaction グローバルにアクセス可能です。java:comp/UserTransaction が使用できないときに使用します。
java:/TransactionManager java:jboss/TransactionManager
java:/TransactionSynchronizationRegistry java:jboss/TransactionSynchronizationRegistry

3.2. アプリケーションのアーキテクチャーやコンポーネントによって異なる変更

3.2.1. アプリケーションのアーキテクチャーやコンポーネントによって異なる変更の確認

アプリケーションが下記の技術やコンポーネントを使用する場合、JBoss EAP 6 への移行時にアプリケーションの変更が必要となることがあります。
Hibernate および JPA
アプリケーションが Hibernate または JPA を使用する場合は、アプリケーションを変更する必要があります。詳細については、 「Hibernate や JPA を使用するアプリケーションの更新」を参照してください。
REST
アプリケーションが JAX-RS を使用する場合、JBoss EAP 6 は自動的に RESTEasy を設定するため、手作業で設定する必要がなくなりました。詳細については、 「JAX-RS および RESTEasy の変更の設定」を参照してください。
LDAP
JBoss EAP 6 では LDAP セキュリティーレルムの設定が異なります。アプリケーションが LDAP を使用する場合は、 「LDAP セキュリティーレルムの変更設定」で詳細を確認してください。
メッセージング
JBoss Messaging は JBoss EAP 6 から除外されました。アプリケーションがメッセージングプロバイダーとして JBoss Messaging を使用する場合は、JBoss Messaging コードを HornetQ に置き換える必要があります。詳細については、 「HornetQ を JMS プロバイダーとして使用するためにアプリケーションを移行」を参照してください。
クラスタリング
JBoss EAP 6 では、クラスタリングを有効にする方法が変更になりました。詳細は、 「クラスタリングに対するアプリケーションの変更」を参照してください。
サービススタイルのデプロイメント
JBoss EAP 6 では、サービススタイル記述子を使用しないようになりましたが、できる限り変更がない状態でコンテナはサービススタイルデプロイメントをサポートします。デプロイメントの情報については、 「サービススタイルデプロイメントを使用するアプリケーションの更新」を参照してください。
リモート呼び出し
アプリケーションがリモート呼び出しを行う場合、JNDI を使用して Bean のプロキシをルックアップし、返されたプロキシ上で呼び出しすることができます。必要な構文や名前空間の変更については、 「JBoss EAP 5 にデプロイされ、JBoss EAP 6 へリモート呼び出しを行うアプリケーションの移行」を参照してください。
Seam 2.2
アプリケーションが Seam 2.2 を使用する場合は、 「Seam 2.2 アーカイブの JBoss EAP 6 への移行」を参照して必要な変更について確認してください。
Spring
アプリケーションが Spring を使用する場合は、 「Spring アプリケーションの移行」を参照してください。
移行に影響する可能性があるその他の変更
アプリケーションに影響する可能性がある JBoss EAP 6 のその他の変更については、 「移行に影響する可能性があるその他の変更について理解する」を参照してください。

3.2.2. Hibernate および JPA の変更

3.2.2.2. Hibernate および JPA を使用するアプリケーションの変更設定
概要

アプリケーションに persistence.xml ファイルが含まれていたり、コードが @PersistenceContext アノテーションや @PersistenceUnit アノテーションを使用する場合、 JBoss EAP 6 はデプロイメント中にこれを検出し、アプリケーションによって JPA が使用されることを想定します。Hibernate 4 とその他の依存関係の一部を暗黙的にアプリケーションのクラスパスへ追加します。

現在、アプリケーションが Hibernate 3 ライブラリーを使用する場合、ほとんどの場合で Hibernate 4 へ切り替えることが可能で、Hibernate 4 を使用して正常に実行されるはずです。しかし、アプリケーションをデプロイする時に ClassNotFoundExceptions が発生した場合、次の方法の 1 つを用いて問題解決を図ることができます。

重要

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

手順3.12 アプリケーションの設定

  1. 必要な Hibernate 3 の JAR をアプリケーションライブラリーへコピーする

    見つからないクラスが含まれる特定の Hibernate 3 JAR をアプリケーションの lib/ ディレクトリーへコピーするか、他の方法を使用してクラスパスに追加すると問題を解決できることがあります。これにより、Hibernate のバージョンを複数使用することが原因で ClassCastExceptions や他のクラスローディングの問題が発生することがあります。この問題が発生した場合、次の方法で対処する必要があります。
  2. Hibernate 3 ライブラリーのみを使用するようサーバーへ指示する

    JBoss EAP 6 では、Hibernate 3.5 (およびそれ以降のバージョン) の永続性プロバイダー jar をアプリケーションと共にパッケージ化することができます。サーバーで Hibernate 3 ライブラリーのみを使用し、Hibernate 4 ライブラリーを除外するようにするには、次のように jboss.as.jpa.providerModulepersistence.xmlhibernate3-bundled に設定する必要があります。
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
        <persistence-unit name="plannerdatasource_pu">
            <description>Hibernate 3 Persistence Unit.</description>
            <jta-data-source>java:jboss/datasources/PlannerDS</jta-data-source>
            <properties>
                <property name="hibernate.show_sql" value="false" />
                <property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" />
            </properties>
        </persistence-unit>
    </persistence>
    
    
    Copy to Clipboard Toggle word wrap
    Java Persistence API (JPA) デプロイヤーは、アプリケーションに永続性プロバイダーがあることを検出し、Hibernate 3 ライブラリーを使用します。JPA 永続性プロパティーの詳細については、 「永続ユニットプロパティー」を参照してください。
  3. Hibernate の 2 次キャッシュの無効化

    JBoss EAP 6 では、Hibernate 3 の 2 次キャッシュの挙動が以前のリリースと異なります。アプリケーションを用いて Hibernate の 2 次キャッシュを使用している場合、Hibernate 4 にアップグレードするまで 2 次キャッシュを無効にする必要があります。2 次キャッシュを無効にするには、persistence.xml ファイルの <hibernate.cache.use_second_level_cache>false に設定します。
3.2.2.3. 永続ユニットプロパティー
Hibernate 4.x 設定プロパティー

JBoss EAP 6 は、以下の Hibernate 4.x 設定プロパティを自動的に設定します。

Expand
表3.3 Hibernate 永続ユニットプロパティー
プロパティー名 デフォルト値 目的
hibernate.id.new_generator_mappings true
この設定は、@GeneratedValue(AUTO) を使用して新しいエンティティーに対して一意のインデックスキーを生成する場合に有効です。新規のアプリケーションのデフォルト値は true になるはずです。Hibernate 3.3.x を使用した既存のアプリケーションが継続してシーケンスオブジェクトやテーブルベースのジェネレーターを使用し、後方互換性を維持するにはデフォルト値を false に変更する必要がある場合があります。アプリケーションは persistence.xml ファイルにあるこの値を上書きすることが可能です。
この動作の詳細は、以下で提供されています。
hibernate.transaction.jta.platform org.hibernate.service.jta.platform.spi.JtaPlatform インターフェースのインスタンス
このクラスはトランザクションマネージャーやユーザーのトランザクション、トランザクション同期化レジストリーを Hibernate に渡します。
hibernate.ejb.resource_scanner org.hibernate.ejb.packaging.Scanner インターフェースのインスタンス
このクラスは、JBoss EAP 6 のアノテーションインデクサーを使用して、より高速なデプロイメントを提供する方法を認識しています。
hibernate.transaction.manager_lookup_class
このプロパティーは hibernate.transaction.jta.platform と競合することがあるため、persistence.xml に存在する場合は削除されます。
hibernate.session_factory_name QUALIFIED_PERSISTENCE_UNIT_NAME
アプリケーション名 + 永続ユニット名に設定されます。アプリケーションは異なる値を指定することができますが、JBoss EAP 6 インスタンス上のすべてのアプリケーションデプロイメントで一意となる値でなければなりません。
hibernate.session_factory_name_is_jndi false
アプリケーションが hibernate.session_factory_name の値を指定しなかった場合のみ設定されます。
hibernate.ejb.entitymanager_factory_name QUALIFIED_PERSISTENCE_UNIT_NAME
アプリケーション名 + 永続ユニット名に設定されます。アプリケーションは異なる値を指定することができますが、JBoss EAP 6 インスタンス上のすべてのアプリケーションデプロイメントで一意となる値でなければなりません。
Hibernate 4.x では new_generator_mappings true に設定されると以下が実行されます。
  • @GeneratedValue(AUTO)org.hibernate.id.enhanced.SequenceStyleGenerator へマッピングします。
  • @GeneratedValue(TABLE)org.hibernate.id.enhanced.TableGenerator へマッピングします。
  • @GeneratedValue(SEQUENCE)org.hibernate.id.enhanced.SequenceStyleGenerator へマッピングします。
Hibernate 4.x では new_generator_mappings false に設定されると以下が実行されます。
  • @GeneratedValue(AUTO) が Hibernate "native" へマッピングします。
  • @GeneratedValue(TABLE)org.hibernate.id.MultipleHiLoPerTableGenerator へマッピングします。
  • @GeneratedValue(SEQUENCE) が Hibernate "seqhilo" へマッピングします。
これらプロパティーの詳細を確認するには、http://www.hibernate.org/docs へ移動し、 Hibernate 4.1 Developer Guide を参照してください。
JPA 永続プロパティー

以下の JPA プロパティーが、persistence.xml ファイルの永続ユニット定義でサポートされます。

Expand
表3.4 JPA 永続ユニットプロパティー
プロパティー名 デフォルト値 目的
jboss.as.jpa.providerModule org.hibernate
永続プロバイダーモジュールの名前。
Hibernate 3 JAR がアプリケーションアーカイブに含まれる場合、値は hibernate3-bundled である必要があります。
永続プロバイダーがアプリケーションでパッケージ化された場合、この値は application である必要があります。
jboss.as.jpa.adapterModule org.jboss.as.jpa.hibernate:4
JBoss EAP 6 が永続プロバイダーと動作するようにする統合クラスの名前。
現在の有効値は以下のとおりです。
  • org.jboss.as.jpa.hibernate:4: これは、Hibernate 4 統合クラス用です。
  • org.jboss.as.jpa.hibernate:3: これは、Hibernate 3 統合クラス用です。
3.2.2.4. Hibernate 4 を使用するよう Hibernate 3 のアプリケーションを更新する
概要

Hibernate 4 を使用するようアプリケーションを更新する場合、一般的な更新は、アプリケーションが現在使用する Hibernate のバージョンに関係なく適用されます。その他の更新についてはアプリケーションが現在使用するバージョンを判断する必要があります。

手順3.13 Hibernate 4 を使用するようアプリケーションを更新する

  1. 自動インクリメントシーケンスジェネレーターのデフォルトの動作は JBoss EAP 6 で変更になりました。詳細については、 「Hibernate アイデンティティの自動生成値の既存動作を保持する」を参照してください。
  2. アプリケーションによって現在使用されている Hibernate のバージョンを判断し、下記より適切な更新手順を選択します。
  3. アプリケーションをクラスター化された環境で実行する場合は、 「クラスター環境で稼働する、移行された Seam および Hibernate アプリケーションの永続プロパティーの変更」を参照してください。
3.2.2.5. Hibernate アイデンティティの自動生成値の既存動作を保持する
Hibernate 3.5 には、@GeneratedValue を使用する際にアイデンティティやシーケンスカラムの生成方法を指示する hibernate.id.new_generator_mappings というコアプロパティーが導入されました。JBoss EAP 6 では、このプロパティーのデフォルト値が次のように設定されています。
  • ネイティブの Hibernate アプリケーションをデプロイする場合、デフォルト値は false になります。
  • JPA アプリケーションをデプロイする場合、デフォルト値は true になります。
新規アプリケーションのガイドライン

@GeneratedValue アノテーションを使用する新しいアプリケーションでは hibernate.id.new_generator_mappings プロパティーの値を true に設定するようにします。この設定は異なるデータベースにおける移植性が高まるため推奨設定となります。ほとんどの場合で効率がよく、場合によっては JPA 2 仕様との互換性に対応します。

  • 新しい JPA アプリケーションでは JBoss EAP 6 の hibernate.id.new_generator_mappings プロパティーのデフォルトは true になります。この値は変更しないでください。
  • 新しいネイティブの Hibernate アプリケーションでは JBoss EAP 6 の hibernate.id.new_generator_mappings プロパティーのデフォルトは false になります。このプロパティーを true に設定してください。
既存の JBoss EAP 5 アプリケーションに適用されるガイドライン

JBoss EAP 6 へ移行する際、新しいエンティティーのプライマリキー値の作成に、@GeneratedValue アノテーションを使用する既存のアプリケーションと同じジェネレーターが使用されるようにする必要があります。

  • 既存の JPA アプリケーションでは JBoss EAP 6 の hibernate.id.new_generator_mappings プロパティーのデフォルトは true になります。persistence.xml ファイルでこのプロパティーを false に設定してください。
  • 既存のネイティブ Hibernate アプリケーションでは JBoss EAP 6 の hibernate.id.new_generator_mappings プロパティーのデフォルト値は false になります。この値は変更しないでください。
これらのプロパティー設定の詳細については、 「永続ユニットプロパティー」を参照してください。
3.2.2.6. Hibernate 3.3.x アプリケーションの Hibernate 4.x への移行

手順3.14

  1. Hibernate の text タイプを JDBC LONGVARCHAR へマッピングする

    バージョンが 3.5 以前の Hibernate では text 型は JDBC CLOB へマッピングされていました。Java String プロパティーを JDBC CLOB へマッピングするため、新しい Hibernate タイプ materialized_clob が Hibernate 4 に追加されました。JDBC CLOB へのマッピングが目的で type="text" と設定されているプロパティーがアプリケーションにある場合は、次の項目の 1 つを実行する必要があります。
    1. アプリケーションが hbm マッピングファイルを使用する場合、プロパティーを type="materialized_clob" に変更します。
    2. アプリケーションがアノテーションを使用する場合、@Type(type = "text")@Lob に置き換えます。
  2. コードを確認し戻り値型の変更を探す

    数値集約の基準射影 (criteria projection) は HQL と同じ値型を返すようになるはずです。その結果、org.hibernate.criterion の以下の射影からの戻り型が変更されます。
    1. CountProjectionProjections.rowCount()Projections.count(propertyName)Projections.countDistinct(propertyName) の変更により、count および count distinct 射影は Long 値を返すようになります。
    2. Projections.sum(propertyName) の変更により、sum 射影はプロパティー型によって異なる値タイプを返すようになります。

      注記

      アプリケーションコードを変更しないと、java.lang.ClassCastException が発生する原因となります。
      1. Long、Short、Integer、プリミティブ型整数のいずれかとしてマッピングされているプロパティーは Long 値が返されます。
      2. Float、Double、プリミティブ浮動小数点型のいずれかとしてマッピングされているプロパティーは Double 値が返されます。
3.2.2.7. Hibernate 3.5.x アプリケーションの Hibernate 4.x への移行

手順3.15

  1. AnnotationConfiguration の設定へのマージ

    AnnotationConfiguration はすでに廃止されていますが、移行に影響しないようにする必要があります。
    hbm.xml ファイルを使用している場合、JBoss EAP 6 では 以前のリリースで使用された org.hibernate.cfg.DefaultNamingStrategy ではなく、AnnotationConfigurationorg.hibernate.cfg.EJB3NamingStrategy が使用されることに注意してください。そのため、名前付けの不一致が発生する可能性があります。名前付けストラテジーがデフォルトのアソシエーション (多対多および要素のコレクション) テーブルに依存する場合、この問題が発生することがあります。この問題を解決するには、レガシーの org.hibernate.cfg.DefaultNamingStrategy を使用するように Hibernate に指示するため、Configuration#setNamingStrategy を呼び出して org.hibernate.cfg.DefaultNamingStrategy#INSTANCE に渡します。
  2. 新しい Hibernate DTD ファイル名に適合するように名前空間を変更する

    Expand
    表3.5
    以前の DTD 名前空間 新しい DTD 名前空間
    http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd
    http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd
  3. 環境変数を編集する

    1. Oracle で materialized_clob または materialized_blob プロパティーを使用している場合、グローバル環境変数 hibernate.jdbc.use_streams_for_binary を true に設定する必要があります。
    2. PostgreSQL で CLOB または BLOB プロパティーを使用している場合、グローバル環境変数 hibernate.jdbc.use_streams_for_binary を false に設定する必要があります。
JPA コンテナーによって管理されるアプリケーションを移行する場合は、拡張された永続コンテキストのシリアル化に影響するプロパティーが自動的にコンテナーに渡されます。
ただし、Hibernate における変更により、移行した Seam または Hibernate アプリケーションをクラスター環境で実行すると、シリアル化の問題が発生する可能性があります。以下のようなエラーログが記録される場合があります。
javax.ejb.EJBTransactionRolledbackException: JBAS010361: Failed to deserialize 
....
Caused by: java.io.InvalidObjectException: could not resolve session factory during session deserialization [uuid=8aa29e74373ce3a301373ce3a44b0000, name=null]
Copy to Clipboard Toggle word wrap
このようなエラーを解決するには、設定ファイルのプロパティーを変更する必要があります。ほとんどの場合、設定ファイルは persistence.xml ファイルになります。ネイティブの Hibernate API アプリケーションでは hibernate.cfg.xml ファイルになります。

手順3.16 クラスター環境で稼働する永続プロパティー設定

  1. hibernate.session_factory_name 値を一意名に設定します。この名前は、JBoss EAP 6 インスタンス上のすべてのアプリケーションデプロイメントで一意となる必要があります。例は次のとおりです。
    <property name="hibernate.session_factory_name" value="jboss-seam-booking.ear_session_factory"/>
    
    
    Copy to Clipboard Toggle word wrap
  2. hibernate.ejb.entitymanager_factory_name 値を一意名に設定します。この名前は、JBoss EAP 6 インスタンス上のすべてのアプリケーションデプロイメントで一意となる必要があります。例は次のとおりです。
    <property name="hibernate.ejb.entitymanager_factory_name" value="seam-booking.ear_PersistenceUnitName"/>
    
    
    Copy to Clipboard Toggle word wrap
Hibernate JPA 永続ユニットプロパティーに関する詳細については、 「永続ユニットプロパティー」を参照してください。
3.2.2.9. JPA 2.0 の仕様に準拠するようアプリケーションを更新する
概要

JPA 2.0 の仕様では、永続コンテキストが JTA トランザクションの外部では伝播できないことが要件となっています。トランザクションスコープの永続コンテキストのみがアプリケーションによって使用される場合、JBoss EAP 6 での挙動は以前のバージョンと変わらないため、変更を加える必要はありません。アプリケーションが拡張永続コンテキスト (XPC) を使用してデータ変更のキューやバッチ処理を許可する場合は、アプリケーションを変更する必要があります。

永続コンテキストの伝播挙動

拡張永続コンテキストを使用するステートフルセッション Bean である Bean1 がアプリケーションにあり、トランザクションスコープの永続コンテキストを使用するステートレスセッション Bean である Bean2 を呼び出す場合、次のような挙動が想定されます。

  • Bean1 が JTA トランザクションを開始し、JTA トランザクションがアクティブな状態で Bean2 メソッドを呼び出す場合、JBoss EAP 6 での挙動は以前のリリースと変わらないため、変更を加える必要はありません。
  • Bean1 が JTA トランザクションを開始せず、Bean2 メソッドを呼び出す場合、JBoss EAP 6 は拡張永続コンテキストを Bean2 へ伝播しません。この挙動は、拡張永続コンテキストを Bean2 へ伝播した以前のリリースとは異なっています。拡張永続コンテキストがトランザクションエンティティーマネージャーによって Bean へ伝播されることをアプリケーションが想定している場合、アクティブな JTA トランザクション内で呼び出しを行うようにアプリケーションを変更する必要があります。

3.2.2.10. Infinispan による JPA/Hibernate 2 次キャッシュの置き換え
概要

2 次キャッシュ (2LC) に関し、 JBoss Cache は Infinispan に置き換えられました。これにより、persistence.xml ファイルの変更が必要になります。使用する 2 次キャッシュが JPA または Hibernate であるかによって、構文は若干異なります。ここで取り上げる例は Hibernate の使用が前提となっています。

以下は、JBoss EAP 5.x の persistence.xml ファイルで 2 次キャッシュのプロパティーを設定する例です。
<property name="hibernate.cache.region.factory_class"
     value="org.hibernate.cache.jbc2.JndiMultiplexedJBossCacheRegionFactory"/>
<property name="hibernate.cache.region.jbc2.cachefactory" value="java:CacheManager"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.region.jbc2.cfg.entity" value="mvcc-entity"/>
<property name="hibernate.cache.region_prefix" value="services"/>

Copy to Clipboard Toggle word wrap
以下の手順では、この例を使用して JBoss EAP 6 で Infinispan を設定します。

手順3.17 Infinispan を使用するよう persistence.xml ファイルを変更する

  1. JBoss EAP 6 の JPA アプリケーション向けに Infinispan を設定する

    JBoss EAP 6 で Infinispan を使用し、プロパティーを指定して JPA アプリケーションに同じ設定を行う方法は次のとおりです。
    <property name="hibernate.cache.use_second_level_cache" value="true"/>
    
    
    Copy to Clipboard Toggle word wrap
    また、次のように、shared-cache-modeENABLE_SELECTIVE または ALL の値で指定する必要があります。
    • デフォルト値は ENABLE_SELECTIVE で、これが推奨値となります。この場合、エンティティーは明示的にキャッシュ可能であるとマークされない限りキャッシュされません。
      <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
      
      
      Copy to Clipboard Toggle word wrap
    • ALL では、エンティティーはキャッシュ不可能としてマークした場合であっても常にキャッシュされます。
      <shared-cache-mode>ALL</shared-cache-mode>
      
      
      Copy to Clipboard Toggle word wrap
  2. JBoss EAP 6 のネイティブ Hibernate アプリケーション向けに Infinispan を設定する

    JBoss EAP 6 で Infinispan を使用し、ネイティブ Hibernate アプリケーションに同じ設定を指定する方法は次のとおりです。
    <property name="hibernate.cache.region.factory_class"
         value="org.jboss.as.jpa.hibernate4.infinispan.InfinispanRegionFactory"/>
    <property name="hibernate.cache.infinispan.cachemanager"
         value="java:jboss/infinispan/container/hibernate"/>     
    <property name="hibernate.transaction.manager_lookup_class"
         value="org.hibernate.transaction.JBossTransactionManagerLookup"/>
    <property name="hibernate.cache.use_second_level_cache" value="true"/>
    
    
    
    Copy to Clipboard Toggle word wrap
    また、以下の依存関係を MANIFEST.MF ファイルに追加する必要があります。
    Manifest-Version: 1.0
    依存関係: org.infinispan, org.hibernate
    
    Copy to Clipboard Toggle word wrap
Hibernate キャッシュプロパティーの詳細については、 「Hibernate キャッシュプロパティー」を参照してください。
3.2.2.11. Hibernate キャッシュプロパティー
Expand
表3.6 プロパティー
プロパティー名 説明
hibernate.cache.provider_class
カスタム CacheProvider のクラス名。
hibernate.cache.use_minimal_puts
ブール変数です。2 次キャッシュの操作を最適化し、読み取りを増やして書き込みを最小限にします。これはクラスター化されたキャッシュで最も便利な設定であり、Hibernate 3 ではクラスター化されたキャッシュの実装に対してデフォルトで有効になっています。
hibernate.cache.use_query_cache
ブール変数です。クエリーキャッシュを有効にします。各クエリーをキャッシュ可能に設定する必要があります。
hibernate.cache.use_second_level_cache
ブール変数です。<cache> マッピングを指定するクラスに対してデフォルトで有効になっている 2 次 キャッシュを完全に無効にするため使用されます。
hibernate.cache.query_cache_factory
カスタム QueryCache インターフェースのクラス名です。デフォルト値は組み込みの StandardQueryCache です。
hibernate.cache.region_prefix
2 次キャッシュのリージョン名に使用するプレフィックスです。
hibernate.cache.use_structured_entries
ブール変数です。人間が解読可能な形式でデータを 2 次キャッシュに保存するよう Hibernate を設定します。
hibernate.cache.default_cache_concurrency_strategy
@Cacheable または @Cache が使用される場合に使用するデフォルトの org.hibernate.annotations.CacheConcurrencyStrategy の名前を付与するため使用される設定です。@Cache(strategy="..") を使用してこのデフォルト値が上書きされます。
3.2.2.12. Hibernate Validator 4 への移行
概要

Hibernate Validator 4.x は、JSR 303 - Bean Validation を実装する完全に新しいコードベースです。Validator 3.x から 4.x への移行プロセスは非常に簡単ですが、アプリケーションの移行時にいくつかの変更を行う必要があります。

手順3.18 以下の 1 つまたは複数のタスクを実行する必要がある場合があります。

  1. デフォルトの ValidatorFactory へのアクセス

    JBoss EAP 6 は、デフォルトの ValidatorFactory を java:comp/ValidatorFactory 以下にある JNDI コンテキストにバインドします。
  2. ライフサイクルでトリガーされた検証の理解

    Hibernate Core 4 と組み合わせて使用する場合、ライフサイクルベースの検証は Hibernate Core により自動的に有効になります。
    1. 検証は、エンティティー INSERT 操作、UPDATE 操作、および DELETE 操作に対して行われます。
    2. 次のプロパティーを使用してイベントタイプによってグループが検証されるよう設定することができます。
      • javax.persistence.validation.group.pre-persist
      • javax.persistence.validation.group.pre-update
      • javax.persistence.validation.group.pre-remove
      これらのプロパティーの値は、検証するグループのカンマ区切り完全修飾クラス名です。
      検証グループは、Bean Validation 仕様の新しい機能です。この新しい機能を使用しない場合は、Hibernate Validator 4 に移行するときに変更を必要としません。
    3. ライフサイクルベース検証は、javax.persistence.validation.mode プロパティーを none に設定することにより無効にできます。このプロパティーの他の有効値は auto (デフォルト値)、callback、および ddl です。
  3. アプリケーションが手動の検証を使用するよう設定

    1. 手動で検証を制御する場合は、次のいずれかの方法で Validator を作成できます。
      • getValidator() メソッドを使用して、ValidatorFactory から Validator インスタンスを作成します。
      • Validator インスタンスを EJB、CDI Bean、または他の Java EE インジェクト可能リソースにインジェクトします。
    2. Validator インスタンスをカスタマイズするために、ValidatorFactory.usingContext() により返された ValidatorContext を使用できます。この API を使用して、カスタム MessageInterpolatorTraverableResolver、および ConstraintValidatorFactory を設定できます。これらのインターフェースは、Bean Validation 仕様で指定され、Hibernate Validator 4 で新しい機能です。
  4. 新しい Bean Validation の制約を使用するようコードを変更

    Hibernate Validator 4 への移行時に、新しい Bean レベル検証制約では、コードの変更が必要です。
    1. Hibernate Validator 4 にアップグレードする場合は、次のパッケージの制約を使用する必要があります。
      • javax.validation.constraints
      • org.hibernate.validator.constraints
    2. Hibernate Validator 3 に存在していたすべての制約は、Hibernate Validator 4 でも引き続き利用できます。これらを使用するには、指定されたクラスをインポートします。場合によっては、制約パラメーターの名前またはタイプを変更する必要があります。
  5. カスタム制約の使用

    Hibernate Validator 3 では、カスタム制約でorg.hibernate.validator.Validator インターフェースを実装する必要がありました。Hibernate Validator 4 では、javax.validation.ConstraintValidator インターフェースを実装する必要があります。このインターフェースには、以前のインターフェースと同じ initialize() メソッドと isValid() メソッドが含まれますが、メソッドシグネチャーが変更されました。また、代替の DDL は Hibernate Validator 4 でサポートされなくなりました。

3.2.3. JSF の変更

3.2.3.1. アプリケーションが JSF の古いバージョンを使用できるようにする
概要

アプリケーションが JSF の古いバージョンを使用する場合は、JSF 2.0 にアップグレードする必要はありません。代わりに、jboss-deployment-structure.xml ファイルを作成して、JBoss EAP 6 がアプリケーションデプロイメントで JSF 2.0 ではなく JSF 1.2 を使用するよう要求できます。この JBoss 固有のデプロイメント記述子は、クラスローディングを制御するために使用され、WAR の META-INF/ または WEB-INF/ ディレクトリー、あるいは EAR の META-INF/ ディレクトリーに格納されます。

JSF 1.2 モジュールの依存関係を追加し、JSF 2.0 モジュールが自動的にローディングされないようにする 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>

Copy to Clipboard Toggle word wrap

3.2.4. Web Services Changes

3.2.4.1. Web サービスの変更
JBoss EAP 6 は、JAX-WS Web サービスエンドポイントのデプロイメントをサポートします。このサポートは JBossWS によって提供されます。Web サービスの詳細は、https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ にある JBoss EAP 6 向け『開発ガイド『』』の章「JAX-WS Web サービス『』」を参照してください。
JBossWS 4 には、移行に影響する可能性がある以下の変更が含まれています。
JBossWS API プロジェクトの変更
JBossWS では、SPI および Common コンポーネントがリファクタリングされました。下表は、アプリケーションの移行に影響する可能性がある API およびパッケージの変更を表しています。
Expand
表3.7 サイズログハンドラープロパティー
従来の JAR 従来のパッケージ 新しい JAR 新しいパッケージ
JBossWS SPI org.jboss.wsf.spi.annotation.* JBossWS API org.jboss.ws.api.annotation.*
JBossWS SPI org.jboss.wsf.spi.binding.* JBossWS API org.jboss.ws.api.binding.*
JBossWS SPI org.jboss.wsf.spi.management.recording.* JBossWS API org.jboss.ws.api.monitoring.*
JBossWS SPI org.jboss.wsf.spi.tools.* JBossWS API org.jboss.ws.api.tools.*
JBossWS SPI org.jboss.wsf.spi.tools.ant.* JBossWS API org.jboss.ws.tools.ant.*
JBossWS SPI org.jboss.wsf.spi.tools.cmd.* JBossWS API org.jboss.ws.tools.cmd.*
JBossWS SPI org.jboss.wsf.spi.util.ServiceLoader JBossWS API org.jboss.ws.api.util.ServiceLoader
JBossWS Common org.jboss.wsf.common.* JBossWS API org.jboss.ws.common.*
JBossWS Common org.jboss.wsf.common.handler.* JBossWS API org.jboss.ws.api.handler.*
JBossWS Common org.jboss.wsf.common.addressing.* JBossWS API org.jboss.ws.api.addressing.*
JBossWS Common org.jboss.wsf.common.DOMUtils JBossWS API org.jboss.ws.api.util.DOMUtils
JBossWS Native org.jboss.ws.annotation.EndpointConfig JBossWS API org.jboss.ws.api.annotation.EndpointConfig
@WebContext アノテーション
JBossWS 3.4.x では、このアノテーションは JBossWS SPI プロジェクトの org.jboss.wsf.spi.annotation.WebContext としてパッケージ化されていました。JBossWS 4.0 では、このアノテーションは JBossWS API プロジェクトの org.jboss.ws.api.annotation.WebContext に移動しました。アプリケーションに廃止された依存関係が含まれている場合は、アプリケーションのソースコードのインポートおよび依存関係を置き換え、新しい JBossWS API JAR に対してコンパイルする必要があります。
また、後方互換性への非対応が変更になりました。String[] virtualHosts 属性が String virtualHosts へ変更になりました。JBoss EAP 6 では、デプロイメント毎に 1 つの仮想ホストのみを指定できます。複数の Web サービスが @WebContext アノテーションを使用する場合は、デプロイメントアーカイブに定義されるすべてのエンドポイントで virtualHost の値が同じになるようにする必要があります。
エンドポイントの設定
JBossWS 4.0 は、JBoss Web Services スタックと、ほとんどの Apache CXF プロジェクトモジュールとの統合を実現します。統合レイヤーにより、JAX-WS を含む標準の Web サービス API を使用できます。また、複雑な設定を必要とせずに、JBoss EAP 6 コンテナ上で Apache CFX の拡張機能を使用できます。
JBoss EAP 6 のドメイン設定にある webservice サブシステムには、事前定義されたエンドポイントの設定が含まれています。独自のエンドポイント設定を追加で設定することも可能です。指定のエンドポイント設定の参照には、@org.jboss.ws.api.annotation.EndpointConfig アノテーションを使用します。
JBoss サーバーで Web サービスエンドポイントを設定する方法の詳細は、https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ にある JBoss EAP 6 向け『開発ガイド』の章「JAX-WS Web サービス『』」を参照してください。
jboss-webservices.xml デプロイメント記述子
JBossWS 4.0 には、Web サービスを設定する新しいデプロイメント記述子が導入されました。jboss-webservices.xml ファイルが指定のデプロイメントの追加情報を提供し、廃止された jboss.xml ファイルを部分的に置き換えます。
EJB Web サービスデプロイメントでは、jboss-webservices.xml 記述子ファイルの想定される場所は META-INF/ ディレクトリー内になります。WAR ファイルでバンドルされた POJO および EJB Web サービスエンドポイントの想定される場所は、WEB-INF/ ディレクトリーの jboss-webservices.xml ファイル内になります。
以下は、jboss-webservices.xml 記述子ファイルの例と、要素を説明する表になります。
<webservices>
    <context-root>foo<context-root>    
    <config-name>Standard WSSecurity Endpoint</config-name>
    <config-file>META-INF/custom.xml</config-file>
    <property>
        <name>prop.name</name>
        <value>prop.value</value>
    </property>
    <port-component>
        <ejb-name>TestService</ejb-name>
        <port-component-name>TestServicePort</port-component-name>
        <port-component-uri>/*</port-component-uri>
        <auth-method>BASIC</auth-method>
        <transport-guarantee>NONE</transport-guarantee>
        <secure-wsdl-access>true</secure-wsdl-access>
    </port-component>
    <webservice-description>
        <webservice-description-name>TestService</webservice-description-name>
        <wsdl-publish-location>file:///bar/foo.wsdl</wsdl-publish-location>
    </webservice-description>
</webservices>

Copy to Clipboard Toggle word wrap
Expand
表3.8 jboss-webservice.xml ファイル要素の説明
要素名 説明
context-root
Web サービスデプロイメントのコンテキストルートをカスタマイズするために使用されます。
config-name
config-file
指定のエンドポイント設定へエンドポイントデプロイメントを関連付けするために使用されます。エンドポイント設定は、参照された設定ファイルまたはドメイン設定の webservices サブシステムに指定されます。
property
Web サービススタックの挙動を設定するため、簡単なプロパティー名と値のペアを指定するために使用されます。
port-component
EJB エンドポイントのターゲット URI のカスタマイズまたはセキュリティー関連プロパティーの設定に使用されます。
webservice-description
Web サービス WSDL がパブリッシュされる場所をカスタマイズまたは上書きするために使用されます。

3.2.5. JAX-RS および RESTEasy の変更

3.2.5.1. JAX-RS および RESTEasy の変更の設定
JBoss EAP 6 は自動的に RESTEasy を設定するため、手作業で設定する必要はありません。そのため、web.xml ファイルから既存の RESTEasy の設定をすべて削除し、次の 3 つのオプションの 1 つに置き換える必要があります。

  1. Subclass javax.ws.rs.core.Application および @ApplicationPath annotation アノテーションを使用します。
    これが最も簡単なオプションで、xml の設定が必要ありません。次のようにアプリケーションで javax.ws.rs.core.Application をサブクラス化し、 JAX-RS クラスを使用可能にするパスを用いてアノテーションを付けます。
    @ApplicationPath("/mypath")
    public class MyApplication extends Application {
    }
    
    Copy to Clipboard Toggle word wrap
    上記の例では、JAX-RS リソースはパス /MY_WEB_APP_CONTEXT/mypath/ で使用できるようになります。

    注記

    パスは /mypath/* ではなく /mypath として指定する必要があることに注意してください。最後にフォワードスラッシュやアスタリスクがあってはなりません。
  2. サブクラス javax.ws.rs.core.Application および JAX-RS マッピングの設定に web.xml を使用します。
    @ApplicationPath アノテーションを使用したくない場合でも javax.ws.rs.core.Application をサブクラス化する必要があります。サブクラス化した後に web.xml ファイルに JAX-RS マッピングを設定します。
    public class MyApplication extends Application {
    }
    
    Copy to Clipboard Toggle word wrap
    <servlet-mapping>
       <servlet-name>com.acme.MyApplication</servlet-name>
       <url-pattern>/hello/*</url-pattern>
    </servlet-mapping>
    
    Copy to Clipboard Toggle word wrap
    上記の例では、JAX-RS リソースはパス /MY_WEB_APP_CONTEXT/hello で使用できるようになります。

    注記

    この方法を使用して @ApplicationPath アノテーションを使用して設定されたアプリケーションパスを上書きすることもできます。
  3. web.xml ファイルを変更します。
    Application をサブクラス化したくない場合、次のように web.xml ファイルで JAX-RS のマッピングを設定することが可能です。
    <servlet-mapping>
       <servlet-name>javax.ws.rs.core.Application</servlet-name>
       <url-pattern>/hello/*</url-pattern>
    </servlet-mapping>
    
    Copy to Clipboard Toggle word wrap
    上記の例では、JAX-RS リソースはパス /MY_WEB_APP_CONTEXT/hello で使用できるようになります。

    注記

    このオプションを選択した場合、マッピングの追加のみが必要となります。対応するサーブレットを追加する必要はありません。対応するサーブレットはサーバーによって自動的に追加されるはずです。

3.2.6. LDAP セキュリティーレルムの変更

3.2.6.1. LDAP セキュリティーレルムの変更設定
JBoss EAP 5 では LDAP セキュリティーレルムは login-config.xml ファイルの <application-policy> 要素に設定されていました。JBoss EAP 6 では、LDAP セキュリティーレルムはサーバー設定ファイルの <security-domain> 要素に設定されています。サーバー設定ファイルはスタンドアロンサーバーでは standalone/configuration/standalone.xml ファイルになります。サーバーが管理ドメインで実行されている場合、domain/configuration/domain.xml ファイルがサーバー設定ファイルになります。
JBoss EAP 5 の login-config.xml ファイルにある LDAP セキュリティーレルム設定の例は次のとおりです。
<application-policy name="mcp_ldap_domain">
  <authentication>
    <login-module code="org.jboss.security.auth.spi.LdapExtLoginModule" flag="required">
      <module-option name="java.naming.factory.initial">com.sun.jndi.ldap.LdapCtxFactory</module-option>
      <module-option name="java.naming.security.authentication">simple</module-option>
      ....
    </login-module>
  </authentication>
</application-policy>
Copy to Clipboard Toggle word wrap
JBoss EAP 6 のサーバーファイルにある LDAP 設定の例は次のとおりです。
<subsystem xmlns="urn:jboss:domain:security:1.0">
  <security-domains>
    <security-domain name="mcp_ldap_domain" cache-type="default">
      <authentication>
        <login-module code="org.jboss.security.auth.spi.LdapLoginModule" flag="required">
          <module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/>
          <module-option name="java.naming.security.authentication" value="simple"/>
          ...
        </login-module>
      </authentication>
    </security-domain>
  </security-domains>
</subsystem>
Copy to Clipboard Toggle word wrap

注記

JBoss EAP 6 では XML パーサーが変更になりました。JBoss EAP 5 では、次のようにモジュールオプションを要素の内容として指定しました。
<module-option name="java.naming.factory.initial">com.sun.jndi.ldap.LdapCtxFactory</module-option>
Copy to Clipboard Toggle word wrap
JBoss Enterprise Application Platform 6 では、次のようにモジュールオプションを "value=" で要素属性として指定する必要があります。
<module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/>
Copy to Clipboard Toggle word wrap

3.2.7. HornetQ の変更

3.2.7.1. HornetQ および NFS について
ほとんどのケースでは、NFS は、同期ロッキングメカニズムの動作方法のため、HornetQ で使用する JMS データを格納する適切な手段です (NIO をジャーナルタイプとして使用する場合)。ただし、NFS は特定の状況では Red Hat Enterprise Linux サーバーでのみ使用できます。これは、Red Hat Enterprise Linux により使用された NFS 実装が原因です。
Red Hat Enterprise Linux の NFS 実装は、ダイレクト I/O (O_DIRECT フラグセットでファイルを開く) およびカーネルベースの非同期 I/O の両方をサポートします。これらの機能が両方あるため、厳格な設定ルール下で NFS を共有ストレージオプションとして使用可能です。
  • Red Hat Enterprise Linux NFS クライアントのキャッシュは無効にする必要があります。

重要

サーバーログは、JBoss EAP 6 が起動された後にチェックし、ネイティブライブラリーが正常にロードされ、ASYNCIO ジャーナルタイプが使用されることを確認する必要があります。ネイティブライブラリーのロードに失敗した場合は、HornetQ が失敗して NIO ジャーナルタイプを使用し、これはサーバーログに示されます。

重要

非同期 I/O を実装するネイティブライブラリーを使用するには、JBoss EAP 6 が実行されている Red Hat Enterprise Linux システムに libaio がインストールされている必要があります。
3.2.7.2. 既存の JMS メッセージを JBoss EAP 6 へ移行するために JMS ブリッジを設定する
JBoss EAP 6 では、デフォルトの JMS 実装が JBoss Messaging から HornetQ に変更になりました。JMS ブリッジを使用すると、最も簡単に JMS メッセージを別の環境に移行できます。JMS ブリッジはソースの JMS 宛先からメッセージを消費し、ターゲットの JMS 宛先へ送信します。JMS ブリッジを設定およびデプロイできるサーバーは、JBoss EAP 5.x サーバー、JBoss EAP 6.1 サーバー、およびそれ以降のサーバーです。設定手順は次のとおりです。

手順3.19 JBoss EAP 5.x サーバーへデプロイされた JMS ブリッジの設定

リリース間のクラスの競合を防ぐため、次の手順を用いて JBoss EAP 5.x の JMS ブリッジを設定する必要があります。SAR ディレクトリーおよびブリッジの名前は任意で、他の名前に変更できます。
  1. EAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar のように、JBoss EAP 5 デプロイディレクトリーに SAR を格納するサブディレクトリーを作成します。
  2. EAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/META-INF という名前のサブディレクトリーを作成します。
  3. 以下と似た情報が含まれる jboss-service.xml ファイルを EAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/META-INF/ ディレクトリーに作成します。
    <server>
       <loader-repository>
          com.example:archive=unique-archive-name
          <loader-repository-config>java2ParentDelegation=false</loader-repository-config>
       </loader-repository> 
    
       <!-- JBoss EAP 6 JMS Provider --> 
       <mbean code="org.jboss.jms.jndi.JMSProviderLoader" name="jboss.messaging:service=JMSProviderLoader,name=EnterpriseApplicationPlatform6JMSProvider">
          <attribute name="ProviderName">EnterpriseApplicationPlatform6JMSProvider</attribute>
          <attribute name="ProviderAdapterClass">org.jboss.jms.jndi.JNDIProviderAdapter</attribute>
          <attribute name="FactoryRef">jms/RemoteConnectionFactory</attribute> 
          <attribute name="QueueFactoryRef">jms/RemoteConnectionFactory</attribute>  
          <attribute name="TopicFactoryRef">jms/RemoteConnectionFactory</attribute>      
          <attribute name="Properties">
             java.naming.factory.initial=org.jboss.naming.remote.client.InitialContextFactory
             java.naming.provider.url=remote://EnterpriseApplicationPlatform6host:4447
             java.naming.security.principal=jbossuser
             java.naming.security.credentials=jbosspass
          </attribute>
       </mbean> 
    
       <mbean code="org.jboss.jms.server.bridge.BridgeService" name="jboss.jms:service=Bridge,name=MyBridgeName" xmbean-dd="xmdesc/Bridge-xmbean.xml">      
          <depends optional-attribute-name="SourceProviderLoader">jboss.messaging:service=JMSProviderLoader,name=JMSProvider</depends>          
          <depends optional-attribute-name="TargetProviderLoader">jboss.messaging:service=JMSProviderLoader,name=EnterpriseApplicationPlatform6JMSProvider</depends>          
          <attribute name="SourceDestinationLookup">/queue/A</attribute>      
          <attribute name="TargetDestinationLookup">jms/queue/test</attribute>       
          <attribute name="QualityOfServiceMode">1</attribute>           
          <attribute name="MaxBatchSize">1</attribute>      
          <attribute name="MaxBatchTime">-1</attribute>           
          <attribute name="FailureRetryInterval">60000</attribute>      
          <attribute name="MaxRetries">-1</attribute>      
          <attribute name="AddMessageIDInHeader">false</attribute>
          <attribute name="TargetUsername">jbossuser</attribute>
          <attribute name="TargetPassword">jbosspass</attribute>
       </mbean>
    </server>
            
    
    
    Copy to Clipboard Toggle word wrap

    注記

    <load-repository> は SAR に分離されたクラスローダーが確実に存在するようにします。JNDI ルックアップとブリッジの「ターゲット」の両方に、パスワードが 「jbosspass」であるユーザー 「jbossuser」のセキュリティー認証情報が含まれていることに注意してください。これは、JBoss EAP 6 はデフォルトで保護されているからです。パスワードが 「jbosspass」であるユーザー「jbossuser」は guest ロールを持ち、EAP_HOME/bin/add_user.sh スクリプトを使用して ApplicationRealm に作成されました。
  4. 次の JAR を EAP_HOME/modules/system/layers/base/ ディレクトリーから EAP5_HOME/server/PROFILE_NAME/deploy/myBridge.sar/ ディレクトリーへコピーします。 VERSION_NUMBER を JBoss EAP 6 ディストリビューションの実際のバージョン番号に置き換えてください。
    • org/hornetq/main/hornetq-core-VERSION_NUMBER.jar
    • org/hornetq/main/hornetq-jms-VERSION_NUMBER.jar
    • org/jboss/ejb-client/main/jboss-ejb-client-VERSION_NUMBER.jar
    • org/jboss/logging/main/jboss-logging-VERSION_NUMBER.jar
    • org/jboss/logmanager/main/jboss-logmanager-VERSION_NUMBER.jar
    • org/jboss/marshalling/main/jboss-marshalling-VERSION_NUMBER.jar
    • org/jboss/marshalling/river/main/jboss-marshalling-river-VERSION_NUMBER.jar
    • org/jboss/remote-naming/main/jboss-remote-naming-VERSION_NUMBER.jar
    • org/jboss/remoting3/main/jboss-remoting-VERSION_NUMBER.jar
    • org/jboss/sasl/main/jboss-sasl-VERSION_NUMBER.jar
    • org/jboss/netty/main/netty-VERSION_NUMBER.jar
    • org/jboss/remoting3/remote-jmx/main/remoting-jmx-VERSION_NUMBER.jar
    • org/jboss/xnio/main/xnio-api-VERSION_NUMBER.jar
    • org/jboss/xnio/nio/main.xnio-nio-VERSION_NUMBER.jar

    注記

    javax API クラスは JBoss EAP 5.x のクラスと競合するため、単にそのまま EAP_HOME/bin/client/jboss-client.jar をコピーしないようにしてください。

手順3.20 JBoss EAP 6.x サーバーへデプロイされた JMS ブリッジの設定

JBoss EAP 6.1 およびそれ以降では、JMS ブリッジを使用して JMS 1.1 に準拠するサーバーからメッセージをブリッジできます。ソースおよびターゲットの JMS リソースは JNDI を使用してルックアップされるため、ソースメッセージングプロバイダーの JNDI ルックアップクラスまたはメッセージブローカーは JBoss モジュールでバンドルされる必要があります。次の手順では、例として架空の「MyCustomMQ」メッセージブローカーが使用されています。
  1. メッセージプロバイダーの JBoss モジュールを作成します。
    1. 新しいモジュール向けに EAP_HOME/modules/system/layers/base/ 下にディレクトリー構造を作成します。main/ サブディレクトリーには、クライアント JAR と module.xml ファイルを格納します。EAP_HOME/modules/system/layers/base/org/mycustommq/main/ は MyCustomMQ メッセージングプロバイダー用に作成されたディレクトリー構造の例になります。
    2. main/ サブディレクトリー内に、メッセージングプロバイダーのモジュール定義が含まれる module.xml ファイルを作成します。MyCustomMQ メッセージプロバイダー用に作成された module.xml の例は次のとおりです。
      <?xml version="1.0" encoding="UTF-8"?>
      <module xmlns="urn:jboss:module:1.1" name="org.mycustommq">
          <properties>
              <property name="jboss.api" value="private"/>
          </properties> 
      
          <resources>
              <!-- Insert resources required to connect to the source or target   -->
              <resource-root path="mycustommq-1.2.3.jar" />
              <resource-root path="mylogapi-0.0.1.jar" />
          </resources> 
      
          <dependencies>
             <!-- Add the dependencies required by JMS Bridge code                 -->
             <module name="javax.api" />
             <module name="javax.jms.api" />
             <module name="javax.transaction.api"/>
             <!-- Add a dependency on the org.hornetq module since we send         -->
             <!-- messages tothe HornetQ server embedded in the local EAP instance -->
             <module name="org.hornetq" />
          </dependencies>
      </module>
      
      
      Copy to Clipboard Toggle word wrap
    3. ソースリソースの JNDI ルックアップに必要なメッセージングプロバイダー JAR をモジュールの main/ サブディレクトリーへコピーします。MyCustomMQ モジュールのディレクトリー構造は次のようになるはずです。
      modules/
      `-- system
          `-- layers
              `-- base
                  `-- org
                        `-- mycustommq
                            `-- main
                                |-- mycustommq-1.2.3.jar
                                |-- mylogapi-0.0.1.jar
                                |-- module.xml
      
      Copy to Clipboard Toggle word wrap
  2. JBoss EAP 6 サーバーの messaging サブシステムに JMS ブリッジを設定します。
    1. 設定を行う前に、サーバーを停止し、現在のサーバー設定ファイルをバックアップしてください。スタンドアロンサーバーを実行している場合は、EAP_HOME/standalone/configuration/standalone-full-ha.xml ファイルをバックアップします。管理対象ドメインを実行している場合は、EAP_HOME/domain/configuration/domain.xml ファイルおよび EAP_HOME/domain/configuration/host.xml ファイルを両方バックアップします。
    2. <jms-bridge> 要素を、サーバー設定ファイルの messaging サブシステムへ追加します。<source> および <target> 要素は、JNDI ルックアップに使用される JMS リソースの名前を提供します。<user> および <password> クレデンシャルが指定されいると、JMS 接続の作成時に引数として渡されます。
      MyCustomMQ メッセージングプロバイダー用に設定された <jms-bridge> 要素の例は次のとおりです。
      <subsystem xmlns="urn:jboss:domain:messaging:1.3">
         ...
         <jms-bridge name="myBridge" module="org.mycustommq">
            <source>
               <connection-factory name="ConnectionFactory"/>
               <destination name="sourceQ"/>
               <user>user1</user>
               <password>pwd1</password>
               <context>
                  <property key="java.naming.factory.initial" value="org.mycustommq.jndi.MyCustomMQInitialContextFactory"/>
                  <property key="java.naming.provider.url"    value="tcp://127.0.0.1:9292"/>
               </context>
            </source>
            <target>
               <connection-factory name="java:/ConnectionFactory"/>
               <destination name="/jms/targetQ"/>
            </target>
            <quality-of-service>DUPLICATES_OK</quality-of-service>
            <failure-retry-interval>500</failure-retry-interval>
            <max-retries>1</max-retries>
            <max-batch-size>500</max-batch-size>
            <max-batch-time>500</max-batch-time>
            <add-messageID-in-header>true</add-messageID-in-header>
         </jms-bridge>
      </subsystem>
      
      
      Copy to Clipboard Toggle word wrap
      JNDI プロパティーは <source><context> 要素に定義されています。上記の <target> の例のように、<context> 要素を省略すると、JMS リソースはローカルインスタンスでルックアップされます。
3.2.7.3. HornetQ を JMS プロバイダーとして使用するためにアプリケーションを移行
JBoss Messaging は、JBoss EAP 6 に同梱されなくなりました。アプリケーションがメッセージングプロバイダーとして JBoss Messaging を使用する場合は、JBoss Messaging コードを HornetQ と置き換える必要があります。

手順3.21 開始する前に

  1. クライアントとサーバーをシャットダウンします。
  2. JBoss Messaging データのバックアップコピーを作成します。メッセージデータは、JBM_ という接頭辞でデータベースのテーブルに格納されます。

手順3.22 HornetQ へのプロバイダーの変更

  1. 設定の転送

    既存の JBoss Messaging 設定を JBoss EAP 6 設定に転送します。以下の設定が、 JBoss Mesaging サーバーにあるデプロイメント記述子に存在します。
    • 接続ファクトリーサービス設定
      この設定は、 JBoss Messaging サーバーにデプロイされた JMS 接続ファクトリーを定義します。JBoss Messaging は、アプリケーションサーバーのデプロイメントディレクトリーにある connection-factories-service.xml という名前のファイルで接続ファクトリーを設定します。
    • 宛先設定
      この設定は、JBoss Messaging サーバーでデプロイされた JMS キューおよびトピックを定義します。デフォルトでは、JBoss Messaging は、アプリケーションサーバーのデプロイメントディレクトリーにある destinations-service.xml という名前のファイルで宛先を設定します。
    • メッセージブリッジサービス設定
      この設定には、JBoss Messaging サーバーでデプロイされたブリッジサービスが含まれます。デフォルトではブリッジがデプロイされないため、デプロイメントファイルの名前は、JBoss Messaging インストールによって異なります。
  2. アプリケーションコードの変更

    アプリケーションコードで標準的な JMS を使用する場合は、コードの変更が必要ありません。ただし、アプリケーションがクラスターに接続する場合は、クラスタリングセマンティクスについて HornetQ ドキュメンテーションを参照する必要があります。クラスタリングは、JMS 仕様の範囲外であり、クラスタリング機能の各実装において JBoss Messaging は非常に異なる方法を取ります。
    アプリケーションが JBoss Messaging に固有な機能を使用する場合は、HornetQ で利用可能な同等の機能を使用するようコードを変更する必要があります。
    HornetQ でメッセージングを設定する方法の詳細については、 「HornetQ でのメッセージングの設定」を参照してください。
  3. 既存のメッセージの移行

    JMS ブリッジを使用して JBoss Messaging データベースのすべてのメッセージを HornetQ ジャーナルに移動します。JMS ブリッジの設定手順については、 「既存の JMS メッセージを JBoss EAP 6 へ移行するために JMS ブリッジを設定する」を参照してください。
3.2.7.4. HornetQ でのメッセージングの設定
JBoss EAP 6 でのメッセージングの設定では、管理コンソールまたは管理 CLI の使用が推奨されます。どちらの管理ツールでも、standalone.xmldomain.xml 設定ファイルを手作業で編集せずに永続的な変更を行うことができますが、デフォルト設定ファイルのメッセージングコンポーネントについて理解できると便利です。デフォルトの設定ファイルでは、管理ツールを使用するドキュメントサンプルにより参考用の設定ファイル断片が提供されます。

3.2.8. クラスタリングの変更

3.2.8.1. クラスタリングに対するアプリケーションの変更

手順3.23

  1. クラスタリグが有効な状態で JBoss EAP 6 を起動する

    JBoss EAP 5.x でクラスタリングを有効にするには、次のように all プロファイル (またはその派生プロファイル) を使用してサーバーインスタンスを起動する必要がありました。
    $ EAP5_HOME/bin/run.sh -c all
    JBoss EAP 6 でクラスタリングを有効にする方法は、サーバーがスタンドアロンであるかまたは管理ドメインで実行されているかによって異なります。
    1. 管理対象ドメインで実行されているサーバーに対してクラスタリングを有効にする

      ドメインコントローラーを使用して起動したサーバーに対してクラスタリングを有効にするには、domain.xml を更新し、ha プロファイルと ha-sockets ソケットバインディンググループを使用するサーバーグループを指定します。例は次のとおりです。
      <server-groups>
        <server-group name="main-server-group" profile="ha">
          <jvm name="default">
            <heap size="64m" max-size="512m"/>
          </jvm>
          <socket-binding-group ref="ha-sockets"/>
        </server-group>
      </server-group>
      
      Copy to Clipboard Toggle word wrap
    2. スタンドアローンサーバーに対してクラスタリングを有効にする

      スタンドアロンサーバーに対してクラスタリングを有効にするには、$ EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME のように、適切な設定ファイルを使用してサーバーを起動します。
  2. バインドアドレスを指定する

    JBoss EAP 5.x では、通常 $ EAP_HOME/bin/run.sh -c all -b 192.168.0.2 のように -b コマンドライン引数を用いて、クラスタリングに使用するバインドアドレスを指定しました。
    JBoss EAP 6 では、JBoss EAP 6 の設定ファイル内の関連するソケットバインディングによってバインドアドレスが明示的に定義されます。ドメインコントローラーを用いて起動したサーバーの場合、バインドアドレスは domain/configuration/host.xml ファイル内で指定されます。スタンドアロンサーバーの場合、バインドアドレスは standalone-ha.xml ファイル内で指定されます。
    <interfaces>
      <interface name="management">
        <inet-address value="192.168.0.2"/>
          </interface>
          <interface name="public">
        <inet-address value="192.168.0.2"/>
      </interface>
    </interfaces>
    
    Copy to Clipboard Toggle word wrap
    <socket-binding-groups>
      <socket-binding-group name="ha-sockets" default-interface="public">
        <!-- ... -->
      </socket-binding-group>
    </socket-binding-groups>
    
    Copy to Clipboard Toggle word wrap
    上記の例では、public インターフェースは、ha-sockets ソケットバインディンググループ内のすべてのソケットに対するデフォルトのインターフェースとして指定されます。
  3. jvmRoute が mod_jk と mod_proxy をサポートするよう設定する

    JBoss EAP 5 では、Web サーバー jvmRouteserver.xml ファイルのプロパティーを使用して設定されていました。JBoss EAP 6 では、jvmRoute 属性は、以下のように instance-id 属性を使用してサーバー設定ファイルの Web サブシステムで設定されます。
    <subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false" instance-id="{JVM_ROUTE_SERVER}">
    
    
    Copy to Clipboard Toggle word wrap
    上記の {JVM_ROUTE_SERVER} は、jvmRoute サーバー ID で置き換える必要があります。
    instance-id は、管理コンソールを使用して設定することもできます。
  4. マルチキャストアドレスおよびポートを指定する

    JBoss EAP 5.x では、 $ EAP_HOME/bin/run.sh -c all -u 228.11.11.11 -m 45688 のように、コマンドライン引数 -u を使用してクラスター内の通信に使用されるマルチキャストアドレスを指定できました。 同様に、引数 -m を使用してクラスター内の通信に使用されるポートを指定できました。
    JBoss EAP 6 では、クラスター内の通信に使用されるマルチキャストアドレスとポートは、以下のように該当する JGroups プロトコルにより参照されたソケットバインディングにより定義されます。
    <subsystem xmlns="urn:jboss:domain:jgroups:1.0" default-stack="udp">
        <stack name="udp">
            <transport type="UDP" socket-binding="jgroups-udp"/>
            <!-- ... -->
        </stack>
    </subsystem>
    
    Copy to Clipboard Toggle word wrap
    <socket-binding-groups>
        <socket-binding-group name="ha-sockets" default-interface="public">
            <!-- ... -->
            <socket-binding name="jgroups-udp" port="55200" multicast-address="228.11.11.11" multicast-port="45688"/>
            <!-- ... -->
        </socket-binding-group>
    </socket-binding-groups>
    
    
    Copy to Clipboard Toggle word wrap
    コマンドラインでマルチキャストアドレスおよびポートを指定する場合は、マルチキャストアドレスとポートをシステムプロパティーとして定義し、サーバーを起動するときにこれらのプロパティーをコマンドラインで使用できます。以下の例では、 jboss.mcast.addr は、マルチキャストアドレスの変数名であり、 jboss.mcast.port はポートの変数名です。
    <socket-binding name="jgroups-udp" port="55200"
     multicast-address="${jboss.mcast.addr:230.0.0.4}" multicast-port="${jboss.mcast.port:45688}"/>
    
    
    Copy to Clipboard Toggle word wrap
    次に、コマンドライン引数 $ EAP_HOME/bin/domain.sh -Djboss.mcast.addr=228.11.11.11 -Djboss.mcast.port=45688 を使用してサーバーを起動できます。
  5. 代替のプロトコルスタックを使用する

    JBoss EAP 5.x では、jboss.default.jgroups.stack システムプロパティーを使用してすべてのクラスタリングサービスに使用されるデフォルトのプロトコルスタックを操作することができました。$ EAP_HOME/bin/run.sh -c all -Djboss.default.jgroups.stack=tcp
    JBoss EAP 6 では、domain.xml または standalone-ha.xml 内の JGroups サブシステムによってデフォルトのプロトコルスタックが定義されます。
    <subsystem xmlns="urn:jboss:domain:jgroups:1.0" default-stack="udp">
        <stack name="udp">
            <!-- ... -->
        </stack>
    </subsystem>
    
    Copy to Clipboard Toggle word wrap
  6. バディーレプリケーション

    JBoss EAP 5.x は JBoss Cache のバディーレプリケーションを使用して、クラスターのすべてのインスタンスへのデータレプリケーションを抑制しました。JBoss サーバーの起動時に、コマンドラインで引数 -Djboss.cluster.buddyRepl を渡す必要がありました。
    JBoss EAP 6 ではバディーレプリケーションは、Infinispan のはるかに優れた分散キャッシュまたは DIST モードに置き換えられました。DIST (分散) は強力なクラスタリングモードで、サーバーがクラスターに追加されると Infinispan によって直線的なスケーラビリティを実現できます。サーバーが DIST キャッシングモードを使用するよう設定する方法の例は次のとおりです。
    1. コマンドラインを開き、次のように HA または Full プロファイルのいずれかでサーバーを起動します。
      EAP_HOME/bin/standalone.sh -c standalone-ha.xml
      Copy to Clipboard Toggle word wrap
    2. 別のコマンドラインを開き、管理 CLI へ接続します。
      • Linux の場合は、コマンドラインで以下を入力します。
        $ EAP_HOME/bin/jboss-cli.sh --connect
        
        Copy to Clipboard Toggle word wrap
      • Windows の場合は、コマンドラインで以下を入力します。
        C:\>EAP_HOME\bin\jboss-cli.bat --connect
        
        Copy to Clipboard Toggle word wrap
      次の応答が表示されるはずです。
      Connected to standalone controller at localhost:9999
      Copy to Clipboard Toggle word wrap
    3. 以下のコマンドを実行します。
      /subsystem=infinispan/cache-container=web/:write-attribute(name=default-cache,value=dist)
      /subsystem=infinispan/cache-container=web/distributed-cache=dist/:write-attribute(name=owners,value=3)
      :reload
      
      Copy to Clipboard Toggle word wrap
      各コマンドの後に、以下の応答が表示されるはずです。
      "outcome" => "success"
      
      Copy to Clipboard Toggle word wrap
      これらのコマンドは、standalone-ha.xml ファイルの infinispan サブシステムに以下の設定を作成します。
      <cache-container name="web" aliases="standard-session-cache" default-cache="dist" module="org.jboss.as.clustering.web.infinispan">
          <transport lock-timeout="60000"/>
          <replicated-cache name="repl" mode="ASYNC" batching="true">
              <file-store/>
          </replicated-cache>
          <replicated-cache name="sso" mode="SYNC" batching="true"/>
          <distributed-cache name="dist" owners="3" l1-lifespan="0" mode="ASYNC" batching="true">
              <file-store/>
          </distributed-cache>
      </cache-container>
      
      
      Copy to Clipboard Toggle word wrap
      詳細は、https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ にある JBoss EAP 6 向け『開発ガイド『』』の章「Web アプリケーションのクラスター化『』」を参照してください。
3.2.8.2. HA シングルトンの実装
概要

JBoss EAP 5 では、HA シングルトンアーカイブは他のデプロイメントとは別に deploy-hasingleton/ ディレクトリーにデプロイされていました。これは自動デプロイメントが発生しないようにするためで、また確実に HASingletonDeployer サービスがデプロイメントを制御し、クラスターのマスターノードのみにアーカイブがデプロイされるようにするための処置でした。ホットデプロイメント機能がなかったため、再デプロイメントにはサーバーの再起動が必要でした。また、マスターノードに障害が発生し、他のノードがマスターとして引き継ぐ必要がある場合、シングルトンサービスはサービスを提供するためデプロイメントプロセス全体を実行する必要がありました。

JBoss EAP 6 ではこれが変更になりました。SingletonService を使用してクラスターの各ノードに目的のサービスがインストールされますが、サービスは一度に 1 つのノード上でのみ起動されます。これにより、デプロイメントの要件が簡素化され、ノード間でシングルトンマスターサービスを移動するために必要な時間が最小限になります。

手順3.24 HA シングルトンサービスの実装

  1. HA シングルトンサービスアプリケーションを作成します。

    シングルトンサービスとしてデプロイされる SingletonService デコレーターでラッピングされたサービスの簡単な例は次のとおりです。
    1. シングルトンサービスを作成します。

      以下のリストは、シングルトンサービスの例です。
      package com.mycompany.hasingleton.service.ejb;
      
      import java.util.concurrent.atomic.AtomicBoolean;
      import java.util.logging.Logger;
      
      import org.jboss.as.server.ServerEnvironment;
      import org.jboss.msc.inject.Injector;
      import org.jboss.msc.service.Service;
      import org.jboss.msc.service.ServiceName;
      import org.jboss.msc.service.StartContext;
      import org.jboss.msc.service.StartException;
      import org.jboss.msc.service.StopContext;
      import org.jboss.msc.value.InjectedValue;
      
      /**
       * @author <a href="mailto:wfink@redhat.com">Wolf-Dieter Fink</a>
       */
      public class EnvironmentService implements Service<String> {
          private static final Logger LOGGER = Logger.getLogger(EnvironmentService.class.getCanonicalName());
          public static final ServiceName SINGLETON_SERVICE_NAME = ServiceName.JBOSS.append("quickstart", "ha", "singleton");
          /**
           * A flag whether the service is started.
           */
          private final AtomicBoolean started = new AtomicBoolean(false);
      
          private String nodeName;
      
          private final InjectedValue<ServerEnvironment> env = new InjectedValue<ServerEnvironment>();
      
          public Injector<ServerEnvironment> getEnvInjector() {
              return this.env;
          }
      
          /**
           * @return the name of the server node
           */
          public String getValue() throws IllegalStateException, IllegalArgumentException {
              if (!started.get()) {
                  throw new IllegalStateException("The service '" + this.getClass().getName() + "' is not ready!");
              }
              return this.nodeName;
          }
      
          public void start(StartContext arg0) throws StartException {
              if (!started.compareAndSet(false, true)) {
                  throw new StartException("The service is still started!");
              }
              LOGGER.info("Start service '" + this.getClass().getName() + "'");
              this.nodeName = this.env.getValue().getNodeName();
          }
      
          public void stop(StopContext arg0) {
              if (!started.compareAndSet(true, false)) {
                  LOGGER.warning("The service '" + this.getClass().getName() + "' is not active!");
              } else {
                  LOGGER.info("Stop service '" + this.getClass().getName() + "'");
              }
          }
      }
      
      
      Copy to Clipboard Toggle word wrap
    2. サーバー起動時にサービスを SingletonService として起動するためにシングルトン EJB を作成します。

      以下のリストは、サーバー起動時に SingletonService を起動するシングルトン EJB の例です。
      package com.mycompany.hasingleton.service.ejb;
      
      import java.util.Collection;
      import java.util.EnumSet;
      
      import javax.annotation.PostConstruct;
      import javax.annotation.PreDestroy;
      import javax.ejb.Singleton;
      import javax.ejb.Startup;
      
      import org.jboss.as.clustering.singleton.SingletonService;
      import org.jboss.as.server.CurrentServiceContainer;
      import org.jboss.as.server.ServerEnvironment;
      import org.jboss.as.server.ServerEnvironmentService;
      import org.jboss.msc.service.AbstractServiceListener;
      import org.jboss.msc.service.ServiceController;
      import org.jboss.msc.service.ServiceController.Transition;
      import org.jboss.msc.service.ServiceListener;
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      
      
      /**
       * A Singleton EJB to create the SingletonService during startup.
       * 
       * @author <a href="mailto:wfink@redhat.com">Wolf-Dieter Fink</a>
       */
      @Singleton
      @Startup
      public class StartupSingleton {
        private static final Logger LOGGER = LoggerFactory.getLogger(StartupSingleton.class);
      
        /**
         * Create the Service and wait until it is started.<br/>
         * Will log a message if the service will not start in 10sec. 
         */
        @PostConstruct
        protected void startup() {
          LOGGER.info("StartupSingleton will be initialized!");
      
          EnvironmentService service = new EnvironmentService();
          SingletonService<String> singleton = new SingletonService<String>(service, EnvironmentService.SINGLETON_SERVICE_NAME);
          // if there is a node where the Singleton should deployed the election policy might set,
          // otherwise the JGroups coordinator will start it
          //singleton.setElectionPolicy(new PreferredSingletonElectionPolicy(new NamePreference("node2/cluster"), new SimpleSingletonElectionPolicy()));
          ServiceController<String> controller = singleton.build(CurrentServiceContainer.getServiceContainer())
              .addDependency(ServerEnvironmentService.SERVICE_NAME, ServerEnvironment.class, service.getEnvInjector())
              .install();
      
          controller.setMode(ServiceController.Mode.ACTIVE);
          try {
            wait(controller, EnumSet.of(ServiceController.State.DOWN, ServiceController.State.STARTING), ServiceController.State.UP);
            LOGGER.info("StartupSingleton has started the Service");
          } catch (IllegalStateException e) {
            LOGGER.warn("Singleton Service {} not started, are you sure to start in a cluster (HA) environment?",EnvironmentService.SINGLETON_SERVICE_NAME);
          }
        }
      
        /**
         * Remove the service during undeploy or shutdown
         */
        @PreDestroy
        protected void destroy() {
          LOGGER.info("StartupSingleton will be removed!");
          ServiceController<?> controller = CurrentServiceContainer.getServiceContainer().getRequiredService(EnvironmentService.SINGLETON_SERVICE_NAME);
          controller.setMode(ServiceController.Mode.REMOVE);
          try {
            wait(controller, EnumSet.of(ServiceController.State.UP, ServiceController.State.STOPPING, ServiceController.State.DOWN), ServiceController.State.REMOVED);
          } catch (IllegalStateException e) {
            LOGGER.warn("Singleton Service {} has not be stopped correctly!",EnvironmentService.SINGLETON_SERVICE_NAME);
          }
        }
      
        private static <T> void wait(ServiceController<T> controller, Collection<ServiceController.State> expectedStates, ServiceController.State targetState) {
          if (controller.getState() != targetState) {
            ServiceListener<T> listener = new NotifyingServiceListener<T>();
            controller.addListener(listener);
            try {
              synchronized (controller) {
                int maxRetry = 2;
                while (expectedStates.contains(controller.getState()) && maxRetry > 0) {
                  LOGGER.info("Service controller state is {}, waiting for transition to {}", new Object[] {controller.getState(), targetState});
                  controller.wait(5000);
                  maxRetry--;
                }
              }
            } catch (InterruptedException e) {
              LOGGER.warn("Wait on startup is interrupted!");
              Thread.currentThread().interrupt();
            }
            controller.removeListener(listener);
            ServiceController.State state = controller.getState();
            LOGGER.info("Service controller state is now {}",state);
            if (state != targetState) {
              throw new IllegalStateException(String.format("Failed to wait for state to transition to %s.  Current state is %s", targetState, state), controller.getStartException());
            }
          }
        }
      
        private static class NotifyingServiceListener<T> extends AbstractServiceListener<T> {
          @Override
          public void transition(ServiceController<? extends T> controller, Transition transition) {
            synchronized (controller) {
              controller.notify();
            }
          }
        }
      }
      
      
      Copy to Clipboard Toggle word wrap
    3. クライアントよりサービスへアクセスするためステートレスセッション Bean を作成します。

      以下は、クライアントからサービスにアクセスするステートレスセッション Bean の例です。
      package com.mycompany.hasingleton.service.ejb;
      
      import javax.ejb.Stateless;
      
      import org.jboss.as.server.CurrentServiceContainer;
      import org.jboss.msc.service.ServiceController;
      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;
      
      /**
       * A simple SLSB to access the internal SingletonService.
       * 
       * @author <a href="mailto:wfink@redhat.com">Wolf-Dieter Fink</a>
       */
      @Stateless
      public class ServiceAccessBean implements ServiceAccess {
          private static final Logger LOGGER = LoggerFactory.getLogger(ServiceAccessBean.class);
      
          public String getNodeNameOfService() {
              LOGGER.info("getNodeNameOfService() is called()");
              ServiceController<?> service = CurrentServiceContainer.getServiceContainer().getService(
                      EnvironmentService.SINGLETON_SERVICE_NAME);
              LOGGER.debug("SERVICE {}", service);
              if (service != null) {
                  return (String) service.getValue();
              } else {
                  throw new IllegalStateException("Service '" + EnvironmentService.SINGLETON_SERVICE_NAME + "' not found!");
              }
          }
      }
      
      
      Copy to Clipboard Toggle word wrap
    4. SingletonService のビジネスロジックインターフェースを作成します。

      以下は、SingletonService に対するビジネスロジックインターフェースの例です。
      package com.mycompany.hasingleton.service.ejb;
      
      import javax.ejb.Remote;
      
      /**
       * Business interface to access the SingletonService via this EJB
       * 
       * @author <a href="mailto:wfink@redhat.com">Wolf-Dieter Fink</a>
       */
      @Remote
      public interface ServiceAccess {
          public abstract String getNodeNameOfService();
      } 
      
      
      
      Copy to Clipboard Toggle word wrap
  2. クラスタリングが有効な状態で各 JBoss EAP 6 インスタンスを起動します。

    クラスターを有効化する方法は、サーバーがスタンドアローンであるか管理対象ドメインで実行されているかによって異なります。
    1. 管理対象ドメインで実行されているサーバーに対してクラスタリングを有効にします。

      管理 CLI を使用してクラスタリングを有効にするか、設定ファイルを手動で編集できます。
      • 管理 CLI を使用してクラスタリングを有効にします。

        1. ドメインコントローラーを起動します。

        2. オペレーティングシステムのコマンドプロンプトを開きます。

        3. ドメインコントローラーの IP アドレスまたは DNS 名を渡して管理 CLI に接続します。

          この例では、ドメインコントローラーの IP アドレスが 192.168.0.14 であることを前提とします。
          • Linux の場合は、コマンドラインで以下を入力します。
            $ EAP_HOME/bin/jboss-cli.sh --connect --controller=192.168.0.14
            
            Copy to Clipboard Toggle word wrap
          • Windows の場合は、コマンドラインで以下を入力します。
            C:\>EAP_HOME\bin\jboss-cli.bat --connect --controller=192.168.0.14
            
            Copy to Clipboard Toggle word wrap
          次の応答が表示されるはずです。
          Connected to domain controller at 192.168.0.14
          Copy to Clipboard Toggle word wrap
        4. main-server サーバーグループを追加します。

          [domain@192.168.0.14:9999 /] /server-group=main-server-group:add(profile="ha",socket-binding-group="ha-sockets") 
          {
              "outcome" => "success",
              "result" => undefined,
              "server-groups" => undefined
          }
          
          Copy to Clipboard Toggle word wrap
        5. server-one という名前のサーバーを作成し、main-server サーバーグループに追加します。

          [domain@192.168.0.14:9999 /]  /host=station14Host2/server-config=server-one:add(group=main-server-group,auto-start=false)
          {
              "outcome" => "success",
              "result" => undefined
          }
          
          Copy to Clipboard Toggle word wrap
        6. main-server サーバーグループに対して JVM を設定します。

          [domain@192.168.0.14:9999 /] /server-group=main-server-group/jvm=default:add(heap-size=64m,max-heap-size=512m)
          {
              "outcome" => "success",
              "result" => undefined,
              "server-groups" => undefined
          }
          
          Copy to Clipboard Toggle word wrap
        7. server-two という名前のサーバーを作成し、別のサーバーグループに置き、ポートオフセットを 100 に設定します。

          [domain@192.168.0.14:9999 /]  /host=station14Host2/server-config=server-two:add(group=distinct2,socket-binding-port-offset=100)
          {
              "outcome" => "success",
              "result" => undefined
          }
          
          Copy to Clipboard Toggle word wrap
      • サーバー設定ファイルを手動で編集してクラスタリングを有効にします。

        1. JBoss EAP 6 サーバーを停止します。

          重要

          変更がサーバーの再起動後にも維持されるようにするには、サーバー設定ファイルの編集前にサーバーを停止する必要があります。
        2. domain.xml 設定ファイルを開いて編集します。

          ha プロファイルと ha-sockets ソケットバインディンググループを使用するサーバーグループを指定します。例は次のとおりです。
          <server-groups>
            <server-group name="main-server-group" profile="ha">
              <jvm name="default">
                <heap size="64m" max-size="512m"/>
              </jvm>
              <socket-binding-group ref="ha-sockets"/>
            </server-group>
          </server-groups>
          
          
          Copy to Clipboard Toggle word wrap
        3. host.xml 設定ファイルを開いて編集します。

          以下のようにファイルを変更します。
          <servers>
            <server name="server-one" group="main-server-group" auto-start="false"/>
            <server name="server-two" group="distinct2">
              <socket-bindings port-offset="100"/>
            </server>
          <servers>
          
          
          Copy to Clipboard Toggle word wrap
        4. サーバーを起動します。

          • Linux の場合は、EAP_HOME/bin/domain.sh と入力します。
          • Microsoft Windows の場合は、EAP_HOME\bin\domain.bat と入力します。
    2. スタンドアローンサーバーに対してクラスタリングを有効にする

      スタンドアローンサーバーに対してクラスタリングを有効にするには、次のようにノード名と standalone-ha.xml 設定ファイルを使用してサーバーを起動します。
      • Linux の場合は、EAP_HOME/bin/standalone.sh --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME と入力します。
      • Microsoft Windows の場合は、EAP_HOME\bin\standalone.bat --server-config=standalone-ha.xml -Djboss.node.name=UNIQUE_NODE_NAME と入力します。

    注記

    1 つのマシン上で複数のサーバーが実行されている時にポートの競合が発生しないようにするため、別のインターフェースでバインドするように各サーバーインスタンスに対して standalone-ha.xml ファイルを設定します。または、コマンドラインで -Djboss.socket.binding.port-offset=100 のような引数を使用し、ポートオフセットを持つ後続のサーバーインスタンスを開始して対応することも可能です 。
  3. アプリケーションをサーバーにデプロイします。

    Maven を使用してアプリケーションをデプロイする場合は、次の Maven コマンドを使用してデフォルトのポートで稼働しているサーバーへデプロイします。
    mvn clean install jboss-as:deploy
    追加のサーバーをデプロイするには、サーバー名とポート番号をコマンドラインに渡します。
    mvn clean package jboss-as:deploy -Ddeploy.hostname=localhost -Ddeploy.port=10099

3.2.9. サービススタイルデプロイメントの変更

3.2.9.1. サービススタイルデプロイメントを使用するアプリケーションの更新
概要

JBoss EAP 6 はサービススタイル記述子を使用しないようになりましたが、できる限り変更がない状態でコンテナはサービススタイルデプロイメントをサポートします。そのため、JBoss EAP 5.x アプリケーションの jboss-service.xml または jboss-beans.xml デプロイメント記述子を使用した場合、JBoss EAP 6 へ変更をほとんどまたは全く加えなくても実行できるはずです。継続してファイルを EAR や SAR にパッケージ化することが可能ですが、ファイルを直接 deployments ディレクトリーに置くこともできます。スタンドアロンサーバーをを実行している場合、deployments ディレクトリーは EAP_HOME/standalone/deployments/ になります。管理ドメインを実行している場合、 deployments フォルダーは EAP_HOME/domain/deployments/ になります。

3.2.10. リモート呼び出しの変更

概要

JBoss EAP 6 では、次の 2 つの方法でサーバーへリモート呼び出しすることができます。

  • 新しい JBoss 固有の EJB クライアント API を使用して呼び出しを行う。
  • JNDI を使用して Bean のプロキシをルックアップし、返されたプロキシ上で呼び出しを行う。
本項では 2 つ目の方法について取り上げます。JNDI を使用するクライアントは コーディングの変更が必要となります。

JBoss EAP 5 では、EJB リモートインターフェースはデフォルトで JNDI にてバインドされ、ローカルインターフェースの場合は「ejbName/local」、リモートインターフェースの場合は「ejbName/remote」という名前でした。クライアントアプリケーションは 「ejbName/remote」を使用して Bean をルックアップしました。
JBoss EAP 6 では、以下の構文を用いて ejb:NAMESPACE_NAME を使用して EJB へリモートアクセスします。ステートレス Bean の場合、構文は次のようになります。
ejb:<app-name>/<module-name>/<distinct-name>/<bean-name>!<fully-qualified-classname-of-the-remote-interface>

Copy to Clipboard Toggle word wrap
ステートフル Bean の場合は次のようになります。
ejb:<app-name>/<module-name>/<distinct-name>/<bean-name>!<fully-qualified-classname-of-the-remote-interface>?stateful

Copy to Clipboard Toggle word wrap
上記の構文で置き換える必要のある値は次のとおりです。
  • <app-name> - デプロイされた EJB のアプリケーション名。通常、.ear 接尾辞を抜かした ear 名になりますが、application.xml ファイルで名前が上書きされる場合があります。アプリケーションが .ear としてデプロイされていない場合、この値は空の文字列となります。この例は EAR としてデプロイされていないことを仮定します。
  • <module-name> - サーバー上のデプロイされた EJB のモジュール名。通常、.jar 接尾辞を除いた EJB デプロイメントの jar 名になりますが、ejb-jar.xml を使用して名前が上書きされる場合があります。この例では、EJB が jboss-as-ejb-remote-app.jar にデプロイされていることを仮定しているため、モジュール名は jboss-as-ejb-remote-app になります。
  • <distinct-name> - EJB の任意の distinct name です。この例では distinct name は使用しないため、空の文字列を使用します。
  • <bean-name> - デフォルトでは Bean 実装クラスの簡単なクラス名になります。
  • <fully-qualified-classname-of-the-remote-interface> - リモートビューの完全修飾クラス名。
クライアントコードの更新

次のステートレス EJB を JBoss EAP 6 サーバーにデプロイしたことにします。これにより、Bean のリモートビューが公開されます。

@Stateless
@Remote(RemoteCalculator.class)
public class CalculatorBean implements RemoteCalculator {
 
    @Override
    public int add(int a, int b) {
        return a + b;
    }
 
    @Override
    public int subtract(int a, int b) {
        return a - b;
    }
}
Copy to Clipboard Toggle word wrap
JBoss EAP 5 では、クライアント EJB のルックアップと呼び出しが次のようにコード化されていました。
InitialContext ctx = new InitialContext();
RemoteCalculator calculator = (RemoteCalculator) ctx.lookup("CalculatorBean/remote");
int a = 204;
int b = 340;
int sum = calculator.add(a, b);
Copy to Clipboard Toggle word wrap
JBoss EAP 6 では前述の情報を使用して、クライアントのルックアップと呼び出しが次のようにコード化されます。
final Hashtable jndiProperties = new Hashtable();
jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
final Context context = new InitialContext(jndiProperties);
final String appName = "";
final String moduleName = "jboss-as-ejb-remote-app";
final String distinctName = "";
final String beanName = CalculatorBean.class.getSimpleName();
final String viewClassName = RemoteCalculator.class.getName();
final RemoteCalculator statelessRemoteCalculator =  (RemoteCalculator) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName);
 
int a = 204;
int b = 340;
int sum = statelessRemoteCalculator.add(a, b);
Copy to Clipboard Toggle word wrap
クライアントがステートフル EJB にアクセスしている場合、次のようにコンテキストルックアップの最後に "?stateful" を追加する必要があります。
final RemoteCalculator statefulRemoteCalculator =  (RemoteCalculator) context.lookup("ejb:" + appName + "/" + moduleName + "/" + distinctName + "/" + beanName + "!" + viewClassName + "?stateful")
Copy to Clipboard Toggle word wrap

サーバーおよびクライアントコードを含む完全な作業例は Quickstart にあります。詳細については、https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ にある JBoss EAP 6 向け『開発ガイド『』』の章「アプリケーションの開発『』」に記載された「『クイックスタートチュートリアルの確認』」を参照してください。
JNDI を使用したリモート呼び出しの詳細については、https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ にある JBoss EAP 6 向け『開発ガイド『』』の章「Enterprise JavaBeans『』」に記載された「JNDI を使用したリモートでのセッション Bean の呼び出し『』」を参照してください。
3.2.10.2. JNDI を使用したリモートでのセッション Bean の呼び出し
このタスクは、JNDI を使用してセッション Bean の呼び出すリモートクライアントへサポートを追加する方法を説明します。Maven を使用してプロジェクトがビルドされていることが前提となります。
ejb-remote クイックスタートには、この機能のデモを行う Maven プロジェクトが含まれています。このクイックスタートには、デプロイするセッション Bean のプロジェクトとリモートクライアントのプロジェクトの両方が含まれています。下記のコード例はリモートクライアントのプロジェクトから引用されています。
このタスクでは、セッション Bean に認証の必要がないことが前提となっています。

要件

始める前に、次の前提条件を満たしている必要があります。
  • Maven プロジェクトが作成され、使用できる状態です。
  • JBoss EAP 6 の Maven リポジトリが既に追加されています。
  • 呼び出しするセッション Bean が既にデプロイされています。
  • デプロイされたセッション Bean がリモートビジネスインターフェースを実装します。
  • セッション Bean のリモートビジネスインターフェースは Maven 依存関係として使用できます。リモートビジネスインターフェースが JAR ファイルとしてのみ使用できる場合は、JAR をアーティファクトとして Maven リポジトリに追加することが推奨されます。手順については、http://maven.apache.org/plugins/maven-install-plugin/usage.html にある Maven ドキュメントの install:install-file ゴールを参照してください。
  • セッション Bean をホストするサーバーのホスト名と JNDI ポートを覚えておく必要があります。
リモートクライアントよりセッション Bean を呼び出すには、最初にプロジェクトを適切に設定する必要があります。

手順3.25 セッション Bean のリモート呼び出しに対する Maven プロジェクト設定を追加する

  1. 必要なプロジェクト依存関係の追加

    必要な依存関係が含まれるようにするため、プロジェクトの pom.xml を更新する必要があります。
  2. jboss-ejb-client.properties ファイルの追加

    JBoss EJB クライアント API は、JNDI サービスの接続情報が含まれる jboss-ejb-client.properties という名前のプロジェクトのルートにファイルがあることを想定します。このファイルを以下の内容と共にプロジェクトの src/main/resources/ ディレクトリーに追加します。
    # In the following line, set SSL_ENABLED to true for SSL
    remote.connectionprovider.create.options.org.xnio.Options.SSL_ENABLED=false
    remote.connections=default
    # Uncomment the following line to set SSL_STARTTLS to true for SSL
    # remote.connection.default.connect.options.org.xnio.Options.SSL_STARTTLS=true
    remote.connection.default.host=localhost
    remote.connection.default.port = 4447
    remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
    # Add any of the following SASL options if required
    # remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOANONYMOUS=false
    # remote.connection.default.connect.options.org.xnio.Options.SASL_POLICY_NOPLAINTEXT=false
    # remote.connection.default.connect.options.org.xnio.Options.SASL_DISALLOWED_MECHANISMS=JBOSS-LOCAL-USER
    
    
    Copy to Clipboard Toggle word wrap
    ホスト名とポートを変更してサーバーと一致するようにします。4447 がデフォルトのポート番号です。 安全な接続の場合、SSL_ENABLED 行を true に設定し、 SSL_STARTTLS 行をアンコメントします。コンテナ内のリモーティングインターフェースは同じポートを使用して安全な接続と安全でない接続をサポートします。
  3. リモートビジネスインターフェースの依存関係の追加

    セッション Bean のリモートビジネスインターフェースに対する pom.xml に Maven の依存関係を追加します。
    <dependency>
       <groupId>org.jboss.as.quickstarts</groupId>
       <artifactId>jboss-as-ejb-remote-server-side</artifactId>
       <type>ejb-client</type>
       <version>${project.version}</version>
    </dependency>
    
    Copy to Clipboard Toggle word wrap
これでプロジェクトが適切に設定されたため、コードを追加してセッション Bean へアクセスしたり呼び出ししたりすることができるようになりました。

手順3.26 JNDI を使用して Bean プロキシを取得し、Bean のメソッドを呼び出す

  1. チェック例外の処理

    次のコードに使用されるメソッドの 2 つ (InitialContext() および lookup()) は、タイプ javax.naming.NamingException のチェック済み例外を持っています。これらのメソッド呼び出しは NamingException をキャッチする try/catch ブロックか、NamingException のスローが宣言されたメソッドに存在する必要があります。ejb-remote クイックスタートでは、2 番目の方法を使用します。
  2. JNDI コンテキストの作成

    JNDI コンテキストオブジェクトはサーバーよりリソースを要求するメカニズムを提供します。次のコードを使用して JNDI コンテキストを作成します。
    final Hashtable jndiProperties = new Hashtable();
    jndiProperties.put(Context.URL_PKG_PREFIXES, "org.jboss.ejb.client.naming");
    final Context context = new InitialContext(jndiProperties);
    
    Copy to Clipboard Toggle word wrap
    JNDI サービスの接続プロパティーは jboss-ejb-client.properties ファイルより読み取られます。
  3. JNDI コンテキストの lookup() メソッドを使用した Bean プロキシの取得

    Bean プロキシの lookup() メソッドを呼び出し、必要なセッション Bean の JNDI 名 へ渡します。これにより、呼び出したいメソッドが含まれるリモートビジネスインターフェースのタイプへキャストされなければならないオブジェクトが返されます。
    final RemoteCalculator statelessRemoteCalculator = (RemoteCalculator) context.lookup(
        "ejb:/jboss-as-ejb-remote-server-side/CalculatorBean!" + 
        RemoteCalculator.class.getName());
    
    
    Copy to Clipboard Toggle word wrap
    セッション Bean の JNDI 名は特別な構文によって定義されます。
  4. 呼び出しメソッド

    プロキシ Bean オブジェクトを取得したため、リモートビジネスインターフェースに含まれるすべてのメソッドを呼び出しすることができます。
    int a = 204;
    int b = 340;
    System.out.println("Adding " + a + " and " + b + " via the remote stateless calculator deployed on the server");
    int sum = statelessRemoteCalculator.add(a, b);
    System.out.println("Remote calculator returned sum = " + sum);
    
    Copy to Clipboard Toggle word wrap
    メソッド呼び出し要求が実行されるサーバー上で、プロキシ Bean がメソッド呼び出し要求をセッション Bean へ渡します。結果はプロキシ Bean へ返され、プロキシ Bean によって結果が呼び出し側へ返されます。プロキシ Bean とリモートセッション Bean 間の通信は呼び出し側に透過的です。
これで、Maven プロジェクトを設定してリモートサーバー上で呼び出しを行うセッション Bean をサポートし、JNDI を使用してサーバーより読み出したプロキシ Bean を使用してセッション Bean メソッドを呼び出すコードを作成できるようになりました。

3.2.11. EJB 2.x の変更

3.2.11.1. EJB 2.x を使用するアプリケーションの更新
JBoss EAP 6 は EJB 2.x へのサポートを提供しますが、一部コードの変更が必要で、サーバーを完全なプロファイルで起動する必要があります。

手順3.27 JBoss EAP 6 で EJB 2.x を起動する

  1. JNDI 名前空間の新しいルールを使用するようコードを変更する

    EJB 3.0 と同様に、EJB 2.x でも完全な JNDI プレフィックスを使用する必要があります。新しい JNDI 名前空間ルールやコード例の詳細については、 「アプリケーションの JNDI 名前空間名の更新」を参照してください。
    以前のリリースから JNDI 名前空間を更新する方法を表す例は 「以前のリリースでの JNDI 名前空間の例、および JBoss EAP 6 での名前空間の指定方法」にあります。
  2. jboss-web.xml ファイル記述子を変更する

    <ejb-ref> に対する <jndi-name> を変更し、新しい JNDI 完全修飾ルックアップ形式を使用するようにします。
  3. jboss.xml デプロイメント記述子ファイルを置き換える

    Java Enterprise Edition (EE) によって定義される ejb-jar.xml デプロイメント記述子によって提供される機能を上書きしたり追加するために、jboss.xmljboss-ejb3.xml デプロイメント記述子に置き換えられました。この新しいファイルは jboss.xml との互換性がないため、jboss.xml はデプロイメントで無視されます。
  4. 完全プロファイルでサーバーを起動する

    EJB 2.x には Java Enterprise Edition 6 の完全プロファイルが必要となります。完全プロファイルで JBoss EAP 6 を起動するには、サーバーの起動時に引数 -c standalone-full.xml をコマンドラインに渡します。
  5. クラスター化はサポートされない

    EJB 2.x エンティティー Bean のクラスター化は JBoss EAP 6 ではサポートされないようになりました。

3.2.12. JBoss AOP Changes

3.2.12.1. JBoss AOP を使用するアプリケーションの更新
JBoss AOP (Aspect Oriented Programming) は JBoss EAP 6 には含まれていません。以前のリリースでは、JBoss AOP は EJB コンテナによって使用されていましたが、JBoss EAP 6 では EJB コンテナは新しいメカニズムを使用します。アプリケーションが JBoss AOP を使用する場合、次のようにアプリケーションコードを変更する必要があります。
アプリケーションのリファクタリング

  • 以前、ejb3-interceptors-aop.xml ファイルで行われた標準的な EJB3 設定は、サーバー設定ファイルで設定されるようになりました。スタンドアロンサーバーの場合、このファイルは standalone/configuration/standalone-full.xml ファイルになります。サーバーが管理ドメインで実行されている場合は domain/configuration/domain.xml ファイルになります。
  • サーバー側の AOP インターセプターが標準の Java EE Interceptor を使用するよう変更する必要があります。コンテナインターセプターの詳細や、アプリケーションでクライアント側インターセプターを使用する方法については、https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ にある JBoss EAP 6 向け『開発ガイド『』』の章「コンテナインターセプター『』」を参照してください。

JBoss AOP ライブラリーの使用

  • コードをリファクタリングできない場合は、JBoss AOP ライブラリーのコピーを取得し、そのコピーとアプリケーションをバンドルできます。AOP ライブラリーは JBoss EAP 6 で動作することがありますが、デプロイされません。手動でデプロイするには、サーバーの起動時にコマンドライン引数 Djboss.aop.path=PATH_TO_AOP_CONFIG を使用します。

    注記

    JBoss AOP ライブラリーは JBoss EAP 6 で動作することがありますが、この設定はサポートされません。

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

3.2.13.1. Seam 2.2 アーカイブの JBoss EAP 6 への移行
概要

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

重要

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

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

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

    一部の Seam 2.2 の例は、java:/ExampleDS という名前のデフォルトの JDBC データソースを使用します。このデフォルトデータソースは JBoss EAP 6 では java:jboss/datasources/ExampleDS に変更になりました。例のデータベースがアプリケーションによって使用される場合、以下の方法の 1 つ実行します。
    • JBoss EAP 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>
      
      Copy to Clipboard Toggle word wrap
    • 既存のデータベースを維持したい場合は、データソースの定義を EAP_HOME/standalone/configuration/standalone.xml ファイルに追加することができます。

      重要

      変更がサーバーの再起動後にも維持されるようにするには、サーバー設定ファイルの編集前にサーバーを停止する必要があります。
      JBoss EAP 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>
      
      Copy to Clipboard Toggle word wrap
    • 管理 CLI コマンドラインインターフェースを使用してデータソースの定義を追加することも可能です。データソースを追加する場合に使用しなければならない構文の例は次のとおりです。行の最後にある「\」はコマンドが次の行に続くことを表しています。

      例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
      
      Copy to Clipboard Toggle word wrap
    データソースの設定方法の詳細については 、 「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>
    
    Copy to Clipboard Toggle word wrap
    アプリケーションがサードパーティー製のロギングフレームワークを使用する場合は、「ロギング依存関係の編集」で説明されているようにこれらの依存関係を追加する必要があります。
  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
    
    Copy to Clipboard Toggle word wrap
  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>
    
    Copy to Clipboard Toggle word wrap
    アプリケーションで 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 ''
    Copy to Clipboard Toggle word wrap
    コード全体で 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"/>
      
      
      Copy to Clipboard Toggle word wrap
    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
      
      Copy to Clipboard Toggle word wrap
    3. コンポーネント要素の追加

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

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

3.2.13.2. Seam 2.2 アーカイブの移行の問題
Seam 2.2 Drools と Java 7 の互換性がない
Seam 2.2 Drools と Java 7 は互換性がなく、エラー org.drools.RuntimeDroolsException: value '1.7' is not a valid language level が発生します。
Seam 2.2.5 の署名された cglib.jar によって Spring の例が動作しない
JBoss EAP 5 の Seam 2.2.5 に含まれる、署名された cglib.jar を使用して Spring サンプルが実行されると、次の原因で実行に失敗します。
java.lang.SecurityException: class "org.jboss.seam.example.spring.UserService$$EnhancerByCGLIB$$7d6c3d12"'s signer information does not match signer information of other classes in the same package
Copy to Clipboard Toggle word wrap
この問題を回避するには、次のように cglib.jar を無署名にします。
zip -d $SEAM_DIR/lib/cglib.jar META-INF/JBOSSCOD\*
Seambay の例が NotLoggedInException によって失敗する
SOAPRequestHandler のメッセージを処理する際に SOAP メッセージのヘッダーが null であるため、conversation ID が設定されないことがこの問題の原因です。
この問題を回避するには、https://issues.jboss.org/browse/JBPAPP-8376 の記述とおりに org.jboss.seam.webservice.SOAPRequestHandler.handleOutbound を上書きします。
Seambay の例が UnsupportedOperationException: no transaction によって失敗する
このバグは、JBoss EAP 6 で UserTransaction の JNDI 名が変更になったことが原因です。
この問題を回避するには https://issues.jboss.org/browse/JBPAPP-8322 の記述とおりに org.jboss.seam.transaction.Transaction.getUserTransaction を上書きします。
Tasks の例が org.jboss.resteasy.spi.UnhandledException: Unable to unmarshall request body をスローする
このバグの原因は JBoss EAP 5.1.2 に含まれる seam-resteasy-2.2.5 と、JBoss EAP 6 に含まれる RESTEasy 2.3.1.GA の間に互換性がないことです。
この問題を回避するには、https://issues.jboss.org/browse/JBPAPP-8315 のとおり jboss-deployment-structure.xml を使用してメインデプロイメントより resteasy-jaxrs、resteasy-jettison-provider、resteasy-jaxb-provider を除外し、jboss-seam-tasks.war より resteasy-jaxrs、resteasy-jettison-provider、resteasy-jaxb-provider、resteasy-yaml-provider を除外します。その後、EAR に Seam 2.2 とバンドルされる RESTEasy ライブラリーが含まれるようにする必要があります。
AJAX の要求中に org.jboss.seam.core.SynchronizationInterceptor とステートフルコンポーネントインスタンスの EJB ロックがデッドロックする
「Caused by javax.servlet.ServletException with message: "javax.el.ELException: /main.xhtml @36,71 value="#{hotelSearch.pageSize}": org.jboss.seam.core.LockTimeoutException: could not acquire lock on @Synchronized component: hotelSearch」が含まれるエラーページまたは同様のエラーメッセージが表示されます。
Seam 2 はステートフルセッション Bean (SFSB) ロックの外部で異なるスコープにて独自のロッキングを行うことが問題となります。そのため、同じトランザクションでスレッドが EJB へ 2 回アクセスすると、最初の呼び出しの後に seam ロックではなく SFSB ロックを取得します。その後、2 つ目のスレッドは seam ロックを取得でき、EJB ロックをヒットし待機します。最初のスレッドが 2 回目の呼び出しを実行しようとすると、seam 2 インターセプター上でブロックし、デッドロックが発生します。Java EE 5 では平行アクセスが行われると即座に例外がスローされましたが、Java EE 6 ではこの挙動が変更されました。
この問題を回避するには EJB に @AccessTimeout(0) を追加します。これにより、この状態に陥った時に即座に ConcurrentAccessException がスローされるようになります。
Dvdstore の例の注文作成が javax.ejb.EJBTransactionRolledbackException によって失敗する
dvdstore サンプルが以下のエラーを表示します。
JBAS011437: Found extended persistence context in SFSB invocation call stack but that cannot be used because the transaction already has a transactional context associated with it. This can be avoided by changing application code, either eliminate the extended persistence context or the transactional context. See JPA spec 2.0 section 7.6.3.1.
Copy to Clipboard Toggle word wrap
この問題は JPA 仕様の変更が原因です。
この問題を修正するには、CheckoutAction クラスと ShowOrdersAction クラスの永続コンテキストを transactional に変更し、エンティティーマネージャーのマージ操作を cancelOrder および detailOrder メソッドで使用します。
JBoss Cache の Seam キャッシュプロバイダーを JBoss EAP 6 で使用できない
JBoss Cache は JBoss EAP 6 ではサポートされていません。そのため、JBoss Cache の Seam キャッシュプロバイダーは、以下エラーによりアプリケーションサーバーの Seam アプリケーションで失敗します。
java.lang.NoClassDefFoundError: org/jboss/util/xml/JBossEntityResolver
Copy to Clipboard Toggle word wrap
.
JBoss EAP 6 での JPA エンティティーの Hibernate 3.3.x 自動スキャンの問題
この問題を修正するには、すべてのエンティティークラスを手動で persistence.xml ファイルにリストします。例は次のとおりです。
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="1.0">
    <persistence-unit name="example_pu">
        <description>Hibernate 3 Persistence Unit.</description>
        <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
        <properties>
            <property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" />
        </properties>
        <class>com.acme.Foo</class>
        <class>com.acme.Bar</class>
    </persistence-unit>
</persistence>

Copy to Clipboard Toggle word wrap
EJB でないスレッドから EJB Seam コンポーネントを呼び出すと javax.naming.NameNotFoundException が発生する
この問題は、新しいモジュラークラスローディングシステムを実装し、新たに標準化された JNDI 名前空間の慣例を採用する JBoss EAP 6 の変更が原因です。java:app 名前空間は、単一のアプリケーションですべてのコンポーネントによって共有される名前を対象としています。Quartz の非同期スレッドなどの EE でないスレッドは、アプリケーションサーバーインスタンスにデプロイされたすべてのアプリケーションによって共有される java:global 名前空間を使用する必要があります。
Quartz 非同期メソッドより EJB Seam コンポーネントを呼び出そうとした時に javax.naming.NameNotFoundException を受信した場合、グローバル JNDI 名を使用するように components.xml ファイルを次のように変更する必要があります。
<component class="org.jboss.seam.example.quartz.MyBean" jndi-name="java:global/seam-quartz/quartz-ejb/myBean"/>

Copy to Clipboard Toggle word wrap
JNDI の変更に関する詳細は、「アプリケーションの JNDI 名前空間名の更新」 を参照してください。この問題の詳細は、カスタマーポータル https://access.redhat.com/site/documentation/JBoss_Web_Framework_Kit/ の JBoss Web Framework Kit『』 向け『2.2.0 Release Notes『』』に記載されている「BZ#948215 - Seam2.3 javax.naming.NameNotFoundException trying to call EJB Seam components from quartz asynchronous methods『』」を参照してください。

3.2.14. Spring アプリケーションの移行

3.2.14.1. Spring アプリケーションの移行
Spring アプリケーションの移行については、JBoss Web Framework Kit のドキュメントを参照してください。このドキュメントは https://access.redhat.com のカスタマーポータルよりダウンロード可能です。ナレッジ製品ドキュメントとクリックし、JBoss Enterprise Middleware より JBoss Web Framework Kit のリンクをクリックします。

3.2.15. 移行に影響するその他の変更

3.2.15.1. 移行に影響する可能性があるその他の変更について理解する
移行に影響を与える可能性がある JBoss EAP 6 のその他の変更内容は次の通りです。
3.2.15.2. Maven プラグイン名の変更
jboss-maven-plugin は更新されていないため、JBoss EAP 6 では動作しません。org.jboss.as.plugins:jboss-as-maven-plugin を使用して正しいディレクトリーをデプロイする必要があります。
3.2.15.3. クライアントアプリケーションの変更
JBoss EAP 6 に接続するクライアントアプリケーションの移行を計画する場合、クライアントライブラリーをバンドルする JAR の名前と場所が変更になったことに注意してください。この JAR の名前は jboss-client.jar に変更され、EAP_HOME/bin/client/ ディレクトリーにあります。この JAR は EAP_HOME/client/jbossall-client.jar に置き換わるもので、リモートクライアントから JBoss EAP 6 に接続するために必要なすべての依存関係が含まれています。

第4章 ツールとヒント

4.1. 移行に役立つリソース

4.1.1. 移行に役立つリソース

アプリケーションを JBoss EAP 6 に移行する時に便利なリソースの一覧は次のとおりです。
ツール
設定変更の一部を自動化するのに役立つツールが複数あります。詳細については、 「移行に便利なツールについて理解する」を参照してください。
デバッグのヒント
アプリケーションの移行時に発生する問題やエラーの最も一般的な原因と解決法については、 「移行の問題のデバッグと解決」を参照してください。
移行の例
JBoss EAP 6 へ移行されたアプリケーションの例については、 「サンプルアプリケーションの移行の確認」を参照してください。

4.1.2. 移行に便利なツールについて理解する

概要

移行に便利なツールは複数あります。これらのツールとその説明の一覧は次のとおりです。

Tattletale
モジュラークラスローディングの変更に伴い、アプリケーション依存関係を検索し、修正する必要があります。Tattletale は依存するモジュールの名前を特定し、アプリケーションに対して設定 XML を生成する時に便利なツールです。
IronJacamar 移行ツール
JBoss EAP 6 ではデータソースとリソースアダプターは個別のファイルに設定されていません。データソースとリソースアダプターはサーバー設定ファイルに定義され、新しいスキーマを使用します。IronJacamar 移行ツールは以前の設定を JBoss EAP 6 が想定する形式に変換するときに便利です。

4.1.3. Tattletale を用いたアプリケーション依存関係の検索

概要

JBoss EAP 6 のモジュラークラスローディングの変更に伴い、アプリケーションを移行する時に JBoss ログに ClassNotFoundException または ClassCastException トレースが記録されることがあります。このエラーを解決するには、例外が指定するクラスが含まれる JAR を探す必要があります。

Tattletale はアプリケーションを再帰的にスキャンし、その内容の詳細レポートを提供する優れたサードパーティーツールです。Tattletale 1.2.0.Bata2 やそれ移行のバージョンには JBoss EAP 6 で使用される新しい JBoss Modules のクラスローディングに役立つ追加のサポートが含まれています。Tattletale の 「JBoss EAP 6」レポートを使用して、自動的に依存するモジュール名を特定および生成し、アプリケーションの jboss-deployment-structure.xml ファイルが含まれるようにすることが可能です。

手順4.1 Tattletale をインストールおよび実行してアプリケーションの依存関係を検索する

注記

Tattletale は JBoss EAP 6 の一部としてはサポートされないサードパーティーのツールです。Tattletale のインストール方法や使用方法に関する最新のドキュメントは、Tattletale の Web サイト http://www.jboss.org/tattletale をご覧ください。

4.1.4. Tattletale のダウンロードとインストール

手順4.2

  1. http://sourceforge.net/projects/jboss/files/JBoss%20Tattletale より Tattletale バージョン 1.2.0.Beta2 またはそれ以降のバージョンをダウンロードします。
  2. 希望のディレクトリーにファイルを展開します。
  3. 次のように TATTLETALE_HOME/jboss-tattletale.properties ファイルを変更します。
    1. ee6as7profiles プロパティーに追加します。
      profiles=java5, java6, ee6, as7
      Copy to Clipboard Toggle word wrap
    2. scanreports プロパティーをアンコメントします。

注記

Tattletale は JBoss EAP 6 の一部としてはサポートされないサードパーティーのツールです。Tattletale のインストール方法や使用方法に関する最新のドキュメントは、Tattletale の Web サイト http://www.jboss.org/tattletale をご覧ください。

4.1.5. Tattletale レポートの作成および確認

手順4.3

  1. 次のコマンドを実行して Tattletale レポートを作成します。 java -jar TATTLETALE_HOME/tattletale.jarAPPLICATION_ARCHIVEOUTPUT_DIRECTORY
    たとえば、 java -jar tattletale-1.2.0.Beta2/tattletale.jar applications/jboss-seam-booking.ear output-results/ となります。
  2. ブラウザーで OUTPUT_DIRECTORY/index.html ファイルを開き、「Reports」セクション下の「JBoss EAP 6」をクリックします。
    1. 左側の列にはアプリケーションによって使用されるアーカイブが一覧表示されます。ARCHIVE_NAME リンクをクリックし、場所やマニュフェスト情報、含まれるクラスなどアーカイブの詳細を表示します。
    2. 右側の列にある jboss-deployment-structure.xml リンクは、左側の列に名前が表示されているアーカイブのモジュール依存関係を指定する方法を表示します。このリンクをクリックし、アーカイブのデプロイメント依存関係モジュール情報を定義する方法を確認します。

注記

Tattletale は JBoss EAP 6 の一部としてはサポートされないサードパーティーのツールです。Tattletale のインストール方法や使用方法に関する最新のドキュメントは、Tattletale の Web サイト http://www.jboss.org/tattletale をご覧ください。

4.1.6. IronJacamar ツールを使用してデータソースとリソースアダプターの設定を移行する

概要

以前のバージョンのアプリケーションサーバーでは、ファイル名が *-ds.xml で終わるファイルを使用してデータソースとリソースアダプターが設定されデプロイされました。IronJacamar 1.1 ディストリビューションには、これらの設定ファイルを JBoss EAP 6 が想定する形式に変換できるツールが含まれています。このツールは、以前のリリースよりソースの設定ファイルを解析し、XML 設定を作成してファイルを新しい形式で出力します。この XML を、JBoss EAP 6 のサーバー設定ファイルにある正しいサブシステム下にコピーおよび貼り付けできます。このツールは、できる限り以前の属性や要素を新しい形式に変換しますが、生成されたファイルに変更を追加する必要がある場合があります。

注記

IronJacamar 移行ツールは JBoss EAP 6 の一部としてはサポートされないサードパーティーのツールです。IronJacamar に関する情報は http://www.jboss.org/ironjacamar を参照してください。このツールのインストール方法や使用方法についての最新のドキュメントは http://www.ironjacamar.org/documentation.html を参照してください。

4.1.7. IronJacamar 移行ツールのダウンロードとインストール

注記

移行ツールは IronJacamar 1.1 およびそれ以降のバージョンでのみ使用可能です。

手順4.5

  1. IronJacamar 1.1 以降のディストリビューションを http://www.jboss.org/ironjacamar/downloads/ よりダウンロードします。
  2. 希望のディレクトリーにダウンロードしたファイルを展開します。
  3. IronJacamar ディストリビューションのコンバータースクリプトを探します。
    • Linux スクリプトは、IRONJACAMAR_HOME/doc/as/converter.sh にあります。
    • Windows バッチファイルは、IRONJACAMAR_HOME/doc/as/converter.bat にあります。

注記

IronJacamar 移行ツールは JBoss EAP 6 の一部としてはサポートされないサードパーティーのツールです。IronJacamar に関する情報は http://www.jboss.org/ironjacamar を参照してください。このツールのインストール方法や使用方法についての最新のドキュメントは http://www.ironjacamar.org/documentation.html を参照してください。

4.1.8. IronJacamar 移行ツールを使用したデータソース設定ファイルの変換

手順4.6

  1. コマンドラインを開き、IRONJACAMAR_HOME/docs/as/ ディレクトリーへ移動します。
  2. 以下のコマンドを入力して、コンバータースクリプトを実行します。
    • Linux の場合: ./converter.sh -ds SOURCE_FILE TARGET_FILE
    • Microsoft Windows の場合: ./converter.bat -ds SOURCE_FILE TARGET_FILE
    SOURCE_FILE は以前のリリースのデータソース -ds.xml ファイルです。TARGET_FILE に新しい設定が含まれます。
    例えば、カレントディレクトリーにある jboss-seam-booking-ds.xml データソース設定ファイルを変換するには、以下のように入力します。
    • Linux の場合: ./converter.sh -ds jboss-seam-booking-ds.xmlnew-datasource-config.xml
    • Microsoft Windows の場合: ./converter.bat -ds jboss-seam-booking-ds.xmlnew-datasource-config.xml
    データソース変換のパラメーターは -ds になります。
  3. ターゲットファイルから <datasource> 要素をコピーし、<subsystem xmlns="urn:jboss:domain:datasources:1.1"><datasources> 要素下のサーバー設定ファイルに貼り付けます。

    重要

    変更がサーバーの再起動後にも維持されるようにするには、サーバー設定ファイルの編集前にサーバーを停止する必要があります。
    • 管理対象ドメインで実行している場合は、XML を EAP_HOME/domain/configuration/domain.xml ファイルにコピーします。
    • スタンドアロンサーバーとして実行している場合は、XML を EAP_HOME/standalone/configuration/standalone.xml ファイルにコピーします。
  4. 新しい設定ファイルに生成された XML を変更します。
    以下に、JBoss EAP 5.x に同梱された Seam 2.2 Booking サンプルの jboss-seam-booking-ds.xml データソースの例を示します。
    <?xml version="1.0" encoding="UTF-8"?>
    <datasources>
      <local-tx-datasource>
        <jndi-name>bookingDatasource</jndi-name>
        <connection-url>jdbc:hsqldb:.</connection-url>
        <driver-class>org.hsqldb.jdbcDriver</driver-class>
        <user-name>sa</user-name>
        <password></password>
      </local-tx-datasource>
    </datasources>
    
    Copy to Clipboard Toggle word wrap
    以下はコンバータースクリプトを実行して生成された設定ファイルになります。生成されたファイルには <driver-class> 要素が含まれます。JBoss EAP 6 では、<driver> 要素を使用してドライバークラスを定義する方法が推奨されます。 <driver-class> 要素がコメントアウトされ、対応する <driver> 要素が追加された JBoss EAP 6 の設定ファイルにある XML は次のようになります。
    <subsystem xmlns="urn:jboss:domain:datasources:1.1">
      <datasources>
        <datasource enabled="true" jndi-name="java:jboss/datasources/bookingDatasource" jta="true"
                pool-name="bookingDatasource" use-ccm="true" use-java-context="true">
          <connection-url>jdbc:hsqldb:.</connection-url>
          <!-- Comment out the following driver-class element 
               since it is not the preferred way to define this.
               <driver-class>org.hsqldb.jdbcDriver</driver-class>     -->
          <transaction-isolation>TRANSACTION_NONE</transaction-isolation>
          <pool>
            <prefill>false</prefill>
            <use-strict-min>false</use-strict-min>
            <flush-strategy>FailingConnectionOnly</flush-strategy>
          </pool>
          <security>
            <user-name>sa</user-name>
            <password/>
          </security>
          <validation>
            <validate-on-match>false</validate-on-match>
            <background-validation>false</background-validation>
            <use-fast-fail>false</use-fast-fail>
          </validation>
          <timeout/>
          <statement>
            <track-statements>false</track-statements>
          </statement>
        </datasource>
        <drivers>
          <!-- The following driver element was not in the 
         XML target file. It was created manually. -->
          <driver name="h2" module="com.h2database.h2">
            <xa-datasource-class>org.h2.jdbcx.JdbcDataSource</xa-datasource-class>
            </driver>
          </drivers>
      </datasources>
    </subsystem>
    
    
    Copy to Clipboard Toggle word wrap

注記

IronJacamar 移行ツールは JBoss EAP 6 の一部としてはサポートされないサードパーティーのツールです。IronJacamar に関する情報は http://www.jboss.org/ironjacamar を参照してください。このツールのインストール方法や使用方法についての最新のドキュメントは http://www.ironjacamar.org/documentation.html を参照してください。

4.1.9. IronJacamar 移行ツールを使用したリソースアダプター設定ファイルの変換

手順4.7

  1. コマンドラインを開き、IRONJACAMAR_HOME/docs/as/ ディレクトリーへ移動します。
  2. 以下のコマンドを入力して、コンバータースクリプトを実行します。
    • Linux の場合: ./converter.sh -ra SOURCE_FILE TARGET_FILE
    • Microsoft Windows の場合: ./converter.bat -ra SOURCE_FILE TARGET_FILE
    SOURCE_FILE は以前のリリースのリソースアダプター -ds.xml ファイルです。TARGET_FILE には、新しい設定が含まれます。
    例えば、カレントディレクトリーにある mttestadapter-ds.xml リソースアダプター設定ファイルを変換するには、以下のように入力します。
    • Linux の場合: ./converter.sh -ra mttestadapter-ds.xmlnew-adapter-config.xml
    • Microsoft Windows の場合: ./converter.bat -ra mttestadapter-ds.xmlnew-adapter-config.xml
    リソースアダプター変換のパラメーターは -ra になります。
  3. ターゲットファイルから <resource-adapters> 要素全体をコピーし、<subsystem xmlns="urn:jboss:domain:resource-adapters:1.1"> 要素下のサーバー設定ファイルに貼り付けます。

    重要

    変更がサーバーの再起動後にも維持されるようにするには、サーバー設定ファイルの編集前にサーバーを停止する必要があります。
    • 管理対象ドメインで実行している場合は、XML を EAP_HOME/domain/configuration/domain.xml ファイルにコピーします。
    • スタンドアロンサーバーとして実行している場合は、XML を EAP_HOME/standalone/configuration/standalone.xml ファイルにコピーします。
  4. 新しい設定ファイルに生成された XML を変更します。
    以下に、JBoss EAP 5.x TestSuite の mttestadapter-ds.xml リソースアダプター設定ファイルの例を示します。
    <?xml version="1.0" encoding="UTF-8"?>
      <!-- ==================================================================== -->
      <!-- ConnectionManager setup for jboss test adapter                       -->
      <!-- Build jmx-api (build/build.sh all) and view for config documentation -->
      <!-- ==================================================================== -->
    <connection-factories>
      <tx-connection-factory>
        <jndi-name>JBossTestCF</jndi-name>
        <xa-transaction/>
        <rar-name>jbosstestadapter.rar</rar-name>
        <connection-definition>javax.resource.cci.ConnectionFactory</connection-definition>
        <config-property name="IntegerProperty" type="java.lang.Integer">2</config-property>
        <config-property name="BooleanProperty" type="java.lang.Boolean">false</config-property>
        <config-property name="DoubleProperty" type="java.lang.Double">5.5</config-property>
        <config-property name="UrlProperty" type="java.net.URL">http://www.jboss.org</config-property>
        <config-property name="sleepInStart" type="long">200</config-property>
        <config-property name="sleepInStop" type="long">200</config-property>
      </tx-connection-factory>
      <tx-connection-factory>
        <jndi-name>JBossTestCF2</jndi-name>
        <xa-transaction/>
        <rar-name>jbosstestadapter.rar</rar-name>
        <connection-definition>javax.resource.cci.ConnectionFactory</connection-definition>
        <config-property name="IntegerProperty" type="java.lang.Integer">2</config-property>
        <config-property name="BooleanProperty" type="java.lang.Boolean">false</config-property>
        <config-property name="DoubleProperty" type="java.lang.Double">5.5</config-property>
        <config-property name="UrlProperty" type="java.net.URL">http://www.jboss.org</config-property>
        <config-property name="sleepInStart" type="long">200</config-property>
        <config-property name="sleepInStop" type="long">200</config-property>
      </tx-connection-factory>
      <tx-connection-factory>
        <jndi-name>JBossTestCFByTx</jndi-name>
        <xa-transaction/>
        <track-connection-by-tx>true</track-connection-by-tx>
        <rar-name>jbosstestadapter.rar</rar-name>
        <connection-definition>javax.resource.cci.ConnectionFactory</connection-definition>
        <config-property name="IntegerProperty" type="java.lang.Integer">2</config-property>
        <config-property name="BooleanProperty" type="java.lang.Boolean">false</config-property>
        <config-property name="DoubleProperty" type="java.lang.Double">5.5</config-property>
        <config-property name="UrlProperty" type="java.net.URL">http://www.jboss.org</config-property>
        <config-property name="sleepInStart" type="long">200</config-property>
        <config-property name="sleepInStop" type="long">200</config-property>
      </tx-connection-factory>
    </connection-factories>
    
    Copy to Clipboard Toggle word wrap
    以下はコンバータースクリプトを実行して生成された設定ファイルになります。生成された XML ファイルのクラス名属性値 「FIXME_MCF_CLASS_NAME」を管理対象接続ファクトリー (この例では、「org.jboss.test.jca.adapter.TestManagedConnectionFactory」) の正しいクラス名に置き換えます。JBoss EAP 6 の設定ファイルにある <class-name> 要素値が変更された XML は次のようになります。
    <subsystem xmlns="urn:jboss:domain:resource-adapters:1.1">
      <resource-adapters>
        <resource-adapter>
          <archive>jbosstestadapter.rar</archive>
          <transaction-support>XATransaction</transaction-support>
          <connection-definitions>
      <!-- Replace the "FIXME_MCF_CLASS_NAME" class-name value with the correct class name
      <connection-definition class-name="FIXME_MCF_CLASS_NAME" enabled="true"
        jndi-name="java:jboss/JBossTestCF" pool-name="JBossTestCF" 
        use-ccm="true" use-java-context="true"> -->
      <connection-definition 
        class-name="org.jboss.test.jca.adapter.TestManagedConnectionFactory" 
        enabled="true"
        jndi-name="java:jboss/JBossTestCF" pool-name="JBossTestCF" 
        use-ccm="true" use-java-context="true">
        <config-property name="IntegerProperty">2</config-property>
        <config-property name="sleepInStart">200</config-property>
        <config-property name="sleepInStop">200</config-property>
        <config-property name="BooleanProperty">false</config-property>
        <config-property name="UrlProperty">http://www.jboss.org</config-property>
        <config-property name="DoubleProperty">5.5</config-property>
        <pool>
          <prefill>false</prefill>
          <use-strict-min>false</use-strict-min>
          <flush-strategy>FailingConnectionOnly</flush-strategy>
        </pool>
        <security>
          <application/>
        </security>
        <timeout/>
        <validation>
          <background-validation>false</background-validation>
          <use-fast-fail>false</use-fast-fail>
        </validation>
      </connection-definition>
          </connection-definitions>
        </resource-adapter>
        <resource-adapter>
          <archive>jbosstestadapter.rar</archive>
          <transaction-support>XATransaction</transaction-support>
          <connection-definitions>
      <!-- Replace the "FIXME_MCF_CLASS_NAME" class-name value with the correct class name
       <connection-definition class-name="FIXME_MCF_CLASS_NAME" enabled="true"
        jndi-name="java:jboss/JBossTestCF2" pool-name="JBossTestCF2" 
        use-ccm="true" use-java-context="true"> -->
      <connection-definition 
        class-name="org.jboss.test.jca.adapter.TestManagedConnectionFactory" 
        enabled="true"
        jndi-name="java:jboss/JBossTestCF2" pool-name="JBossTestCF2" 
        use-ccm="true" use-java-context="true">
        <config-property name="IntegerProperty">2</config-property>
        <config-property name="sleepInStart">200</config-property>
        <config-property name="sleepInStop">200</config-property>
        <config-property name="BooleanProperty">false</config-property>
        <config-property name="UrlProperty">http://www.jboss.org</config-property>
        <config-property name="DoubleProperty">5.5</config-property>
        <pool>
          <prefill>false</prefill>
          <use-strict-min>false</use-strict-min>
          <flush-strategy>FailingConnectionOnly</flush-strategy>
        </pool>
        <security>
          <application/>
        </security>
        <timeout/>
        <validation>
          <background-validation>false</background-validation>
          <use-fast-fail>false</use-fast-fail>
        </validation>
      </connection-definition>
          </connection-definitions>
        </resource-adapter>
        <resource-adapter>
          <archive>jbosstestadapter.rar</archive>
          <transaction-support>XATransaction</transaction-support>
          <connection-definitions>
      <!-- Replace the "FIXME_MCF_CLASS_NAME" class-name value with the correct class name
      <connection-definition class-name="FIXME_MCF_CLASS_NAME" enabled="true"
         jndi-name="java:jboss/JBossTestCFByTx" pool-name="JBossTestCFByTx" 
         use-ccm="true" use-java-context="true"> -->
      <connection-definition 
        class-name="org.jboss.test.jca.adapter.TestManagedConnectionFactory" 
        enabled="true"
        jndi-name="java:jboss/JBossTestCFByTx" pool-name="JBossTestCFByTx" 
        use-ccm="true" use-java-context="true">
        <config-property name="IntegerProperty">2</config-property>
        <config-property name="sleepInStart">200</config-property>
        <config-property name="sleepInStop">200</config-property>
        <config-property name="BooleanProperty">false</config-property>
        <config-property name="UrlProperty">http://www.jboss.org</config-property>
        <config-property name="DoubleProperty">5.5</config-property>
        <pool>
          <prefill>false</prefill>
          <use-strict-min>false</use-strict-min>
          <flush-strategy>FailingConnectionOnly</flush-strategy>
        </pool>
        <security>
          <application/>
        </security>
        <timeout/>
        <validation>
          <background-validation>false</background-validation>
          <use-fast-fail>false</use-fast-fail>
        </validation>
      </connection-definition>
          </connection-definitions>
        </resource-adapter>
      </resource-adapters>
    </subsystem>
    
    
    Copy to Clipboard Toggle word wrap

注記

IronJacamar 移行ツールは JBoss EAP 6 の一部としてはサポートされないサードパーティーのツールです。IronJacamar に関する情報は http://www.jboss.org/ironjacamar を参照してください。このツールのインストール方法や使用方法についての最新のドキュメントは http://www.ironjacamar.org/documentation.html を参照してください。

4.2. 移行の問題のデバッグ

4.2.1. 移行の問題のデバッグと解決

クラスローディングや JNDI ネーミングルール、アプリケーションのその他の変更に伴い、アプリケーションをそのままデプロイしようとすると例外やその他のエラーが発生することがあります。発生する可能性のある一般的な例外やエラーの一部を解決する方法については以下を参照してください。

4.2.2. ClassNotFoundExceptions および NoClassDefFoundErrors のデバッグと解決

概要

通常、ClassNotFoundExceptions は未解決の依存関係が原因で発生します。そのため、他のモジュール上で依存関係を明示的に定義するか、外部ソースより JAR をコピーする必要があります。

手順4.8

  1. 最初に、「JBoss モジュール依存関係の検索」の手順を実行します。
  2. 見つからないクラスのモジュールがない場合は、「以前のインストールでの JAR の検索」に記載されているように JAR を探します。

4.2.3. JBoss モジュール依存関係の検索

依存関係を解決するには、最初に EAP_HOME/modules/system/layers/base/ ディレクトリー内で ClassNotFoundException によって指定されたクラスが含まれるモジュールを探します。クラスのモジュールを見つけた場合は、マニフェストエントリーに依存関係を追加する必要があります。
例えば、ログに次の ClassNotFoundException トレースが記録されているとします。
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.Log 
    from [Module "deployment.TopicIndex.war:main" from Service Module Loader]
    at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:188)
Copy to Clipboard Toggle word wrap
この場合、次の手順を実行してこのクラスが含まれる JBoss モジュールを探します。

手順4.9

  1. 最初にクラスの明白なモジュールがあるかを判断します。
    1. EAP_HOME/modules/system/layers/base/ ディレクトリーへ移動し、ClassNotFoundException で指定されたクラスと一致するモジュールパスを探します。
      モジュールパス org/apache/commons/logging/ が見つかります。
    2. EAP_HOME/modules/system/layers/base/org/apache/commons/logging/main/module.xml ファイルを開き、モジュール名を探します。この例では "org.apache.commons.logging" になります。
    3. MANIFEST.MF ファイルの Dependencies にモジュール名を追加します。
      Manifest-Version: 1.0
      Dependencies: org.apache.commons.logging
      
      Copy to Clipboard Toggle word wrap
  2. クラスの明白なモジュールパスがない場合、依存関係を他の場所で探す必要があることがあります。
    1. Tattletale レポートで ClassNotFoundException によって名前付けされたクラスを探します。
    2. EAP_HOME/modules ディレクトリーで JAR が含まれているモジュールを探し、前の手順のとおりにモジュール名を探します。

4.2.4. 以前のインストールでの JAR の検索

サーバーによって定義されたモジュールにパッケージ化された JAR にクラスがない場合は、EAP5_HOME インストールまたは以前のサーバーの lib/ ディレクトリーで JAR を探します。
例えば、ログに次の ClassNotFoundException トレースが記録されているとします。
Caused by: java.lang.NoClassDefFoundError: org/hibernate/validator/ClassValidator at java.lang.Class.getDeclaredMethods0(Native Method)
Copy to Clipboard Toggle word wrap
この場合、次を実行してこのクラスが含まれる JAR を探します。
  1. ターミナルを開き、EAP5_HOME/ ディレクトリーに移動します。
  2. コマンドを実行します。
    grep 'org.hibernate.validator.ClassValidator' `find . \-name '*.jar'`
  3. 複数の結果が表示されることもあります。その場合、必要な JAR は次のとおりです。
    Binary file ./jboss-eap-5.1/seam/lib/hibernate-validator.jar matches
    Copy to Clipboard Toggle word wrap
  4. この JAR をアプリケーションの lib/ ディレクトリーへコピーします。
    大量の JAR が必要な場合は、クラスのモジュールを定義した方が簡単な場合があります。詳細については、https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ にある JBoss EAP 6 向け『開発ガイド』の章『アプリケーションの開発』の『モジュール』を参照してください。
  5. アプリケーションを再ビルドし、再デプロイします。

4.2.5. ClassCastExceptions のデバッグと解決

ClassCastExceptions は、拡張するクラスではなく他のクラスによってクラスがロードされる時に発生することが多くあります。また、同じクラスが複数の JAR に存在することが原因である場合もあります。

手順4.10

  1. ClassCastException によって名前付けされたクラスが含まれる JAR をすべて見つけるため、アプリケーションを検索します。クラスに対して定義されたモジュールがある場合、アプリケーションの WAR や EAR より重複する JAR を探し、削除します。
  2. クラスが含まれる JBoss モジュールを探し、MANIFEST.MF ファイルまたは jboss-deployment-structure.xml ファイルに依存関係を明示的に定義します。詳細については、https://access.redhat.com/site/documentation/JBoss_Enterprise_Application_Platform/ にある JBoss EAP 6 向け『開発ガイド『』』の章「クラスローディングとモジュール『』」の「クラスローディングとサブデプロイメント『』」を参照してください。
  3. 上記の手順に従っても解決されない場合、クラスローダーの情報をログに出力すると問題の原因を判断できることがあります。例えば、次の ClassCastException がログに記録されているとします。
    java.lang.ClassCastException: com.example1.CustomClass1 cannot be cast to com.example2.CustomClass2
    Copy to Clipboard Toggle word wrap
    1. コードで ClassCastException によって名前付けされたクラスに対するクラスローダーの情報をログに出力します。例は次のとおりです。
      logger.info("Class loader for CustomClass1: " + 
            com.example1.CustomClass1.getClass().getClassLoader().toString());
      logger.info("Class loader for CustomClass2: " + 
            com.example2.CustomClass2.getClass().getClassLoader().toString());
      
      Copy to Clipboard Toggle word wrap
    2. ログの情報にはどのモジュールがクラスをロードするかが記載されています。アプリケーションに基づき、競合する JAR を削除または移動する必要があります。

4.2.6. DuplicateServiceExceptions のデバッグと解決

JAR のサブデプロイメントに対して DuplicateServiceException が発生したり、JBoss EAP 6 に EAR をデプロイする時に WAR アプリケーションがすでにインストールされているというメッセージが表示される場合、JBossWS によるデプロイメント処理の変更が原因である可能性があります。
JBossWS 3.3.0 リリースでは、TCK6 とのシームレスな互換性を実現するため、サーブレットベースのエンドポイントに対して新しいコンテキストルートマッピングアルゴリズムが導入されました。アプリケーション EAR アーカイブに同じ名前の WAR や JAR が含まれている場合、 JBossWS が同じ名前の WAR コンテキストや Web コンテキストを作成することがあります。Web コンテキストが WAR コンテキストと競合し、デプロイメントエラーが発生します。以下の方法の 1 つを用いてデプロイメントの問題を解決します。
  • 生成される Web コンテキストと WAR コンテキストが一意になるよう、JAR ファイルの名前を WAR とは異なる名前に変更します。
  • <context-root> 要素を jboss-web.xml ファイルに提供します。
  • <context-root> 要素を jboss-webservices.xml ファイルに提供します。
  • WAR の <context-root> 要素を application.xml ファイルでカスタマイズします。

4.2.7. JBoss Seam のデバッグページエラーのデバッグと解決

アプリケーションを移行し、正常にデプロイした後、JBoss Seam デバッグページへリダイレクトされるランタイムエラーが発生することがあります。このページの URL は http://localhost:8080/APPLICATION_CONTEXT/debug.seam です。このページでは、現在のログインセッションに関連する Seam コンテキストで Seam コンポーネントを確認したり調査することができます。

図4.1 JBoss Seam デバッグページ

このページへリダイレクトされる原因は、アプリケーションコードで処理されなかった例外を Seam がキャッチしたためであることがほとんどです。通常、「JBoss Seam デバッグページ」上のリンクで例外の根本的な原因を見つけることができます。

手順4.11

  1. このページの Component セクションを展開し、org.jboss.seam.caughtException コンポーネントを探します。
  2. 原因とスタックトレースが欠落している依存関係を示しているはずです。

    図4.2 コンポーネント org.jboss.seam.caughtException の情報

  3. 「ClassNotFoundExceptions および NoClassDefFoundErrors のデバッグと解決」で説明されている手法を使用してモジュール依存関係を解決します。
    上記の例では、org.slf4jMANIFEST.MF に追加するのが最も簡単な解決方法になります。
    Manifest-Version: 1.0
    Dependencies: org.slf4j
    
    Copy to Clipboard Toggle word wrap
    モジュールの依存関係を jboss-deployment-structure.xml ファイルに追加して解決する方法もあります。
    <jboss-deployment-structure>
       <deployment>
            <dependencies>
              <module name="org.slf4j" />
            </dependencies>
        </deployment>
    </jboss-deployment-structure>
    
    Copy to Clipboard Toggle word wrap

4.3. アプリケーション例の移行の確認

4.3.1. サンプルアプリケーションの移行の確認

概要

以下は、JBoss EAP 6 へ移行された JBoss EAP 5.x サンプルアプリケーションの一覧になります。リンクをクリックすると、特定アプリケーションの変更内容の詳細を確認できます。

4.3.2. Seam 2.2 JPA サンプルの JBoss EAP 6 への移行

概要

下記のタスクリストには、Seam 2.2 JPA のサンプルアプリケーションを JBoss EAP 6 へ正常に移行するために必要な変更の概要が記載されています。このサンプルアプリケーションは、JBoss EAP 5.1 ディストリビューションの EAP5.1_HOME/jboss-eap-5.1/seam/examples/jpa/ 下にあります。

重要

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

手順4.12 Seam 2.2 JPA サンプルを移行する

  1. jboss-web.xml ファイルを削除する

    jboss-seam-jpa.war/WEB-INF/ ディレクトリーより jboss-web.xml ファイルを削除します。jboss-web.xml に定義されるクラスローディングがデフォルトの挙動になります。
  2. 以下のように jboss-seam-jpa.jar/META-INF/persistence.xml ファイルを変更する

    1. jboss-seam-jpa.war/WEB-INF/classes/META-INF/persistence.xml ファイルの hibernate.cache.provider_class プロパティーを削除またはコメントアウトします。
      <!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
      
      Copy to Clipboard Toggle word wrap
    2. プロバイダーモジュールプロパティーを jboss-seam-booking.jar/META-INF/persistence.xml ファイルに追加します。
      <property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" />
      
      Copy to Clipboard Toggle word wrap
    3. jta-data-source プロパティーを変更し、デフォルトの JDBC データソース JNDI 名を使用するようにします。
      <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
      
      Copy to Clipboard Toggle word wrap
  3. Seam 2.2 依存関係を追加する

    下記の JAR を Seam 2.2 ディストリビューションのライブラリーである SEAM_HOME/lib/ から jboss-seam-jpa.war/WEB-INF/lib/ ディレクトリーへコピーします。

    • antlr.jar
    • slf4j-api.jar
    • slf4j-log4j12.jar
    • hibernate-entitymanager.jar
    • hibernate-core.jar
    • hibernate-annotations.jar
    • hibernate-commons-annotations.jar
    • hibernate-validator.jar
  4. 残りの依存関係を追加するため jboss-deployment-structure ファイルを作成する

    以下のデータを含む jboss-deployment-structure.xml ファイルを jboss-seam-jpa.war/WEB-INF/ フォルダーで作成します。
    <jboss-deployment-structure>
       <deployment>
            <exclusions>
              <module name="javax.faces.api" slot="main"/>
              <module name="com.sun.jsf-impl" slot="main"/>
              <module name="org.hibernate" slot="main"/>
            </exclusions>
            <dependencies>
              <module name="org.apache.log4j" />
              <module name="org.dom4j" />
              <module name="org.apache.commons.logging" />
              <module name="org.apache.commons.collections" />
              <module name="javax.faces.api" slot="1.2"/>
              <module name="com.sun.jsf-impl" slot="1.2"/>
            </dependencies>
        </deployment>
    </jboss-deployment-structure>
    
    Copy to Clipboard Toggle word wrap
結果

Seam 2.2 JAP のサンプルアプリケーションが JBoss EAP 6 上にデプロイされ、正常に実行されます。

4.3.3. Seam 2.2 Booking サンプルの JBoss EAP 6 への移行

概要

Seam 2.2 Booking EAR の移行は Seam 2.2 JPA WAR サンプルの移行よりも複雑です。Seam 2.2 JPA WAR サンプルの移行に関するドキュメントについては、「Seam 2.2 JPA サンプルの JBoss EAP 6 への移行」を参照してください。アプリケーションを移行するには、以下を実行する必要があります。

  1. デフォルトの JSF 2 の代わりに JSF 1.2 を初期化します。
  2. JBoss EAP 6 に同梱された Hibernate JAR を使用せずに、古いバージョンの Hibernate JAR をバンドルします。
  3. 新しい Java EE 6 JNDI の移植可能な構文を使用するよう JNDI バインディングを変更します。
上記の最初の 2 つは、Seam 2.2 JPA WAR サンプルの移行で行われました。3 番目の手順は新しい手順であり、EAR には EJB が含まれるため、必要です。

重要

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

手順4.13 Seam 2.2 Booking サンプルの移行

  1. jboss-deployment-structure.xml ファイルを作成する

    jboss-deployment-structure.xml という名前の新しいファイルを jboss-seam-booking.ear/META-INF/ で作成し、以下の内容を追加します。
    <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"/>
              <module name="org.apache.log4j" export="true"/>
              <module name="org.dom4j" export="true"/>
              <module name="org.apache.commons.logging" export="true"/>
              <module name="org.apache.commons.collections" export="true"/>
            </dependencies>
            <exclusions>
              <module name="org.hibernate" slot="main"/>
           </exclusions>
            
      </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>
    
    Copy to Clipboard Toggle word wrap
  2. 以下のように jboss-seam-booking.jar/META-INF/persistence.xml ファイルを変更する

    1. キャッシュプロバイダークラスの hibernate プロパティーを削除またはコメントアウトします。
      <!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
      
      Copy to Clipboard Toggle word wrap
    2. プロバイダーモジュールプロパティーを jboss-seam-booking.jar/META-INF/persistence.xml ファイルに追加します。
      <property name="jboss.as.jpa.providerModule" value="hibernate3-bundled" />
      
      Copy to Clipboard Toggle word wrap
    3. jta-data-source プロパティーを変更し、デフォルトの JDBC データソース JNDI 名を使用するようにします。
      <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
      
      Copy to Clipboard Toggle word wrap
  3. Seam 2.2 ディストリビューションより JAR をコピーする

    以下の JAR を Seam 2.2 ディストリビューションの EAP5.x_HOME/jboss-eap5.x/seam/lib/ から jboss-seam-booking.ear/lib ディレクトリーにコピーします。
    antlr.jar
    slf4j-api.jar 
    slf4j-log4j12.jar 
    hibernate-core.jar 
    hibernate-entitymanager.jar 
    hibernate-validator.jar 
    hibernate-annotations.jar 
    hibernate-commons-annotations.jar
    
    Copy to Clipboard Toggle word wrap
  4. JNDI ルックアップ名を変更する

    jboss-seam-booking.war/WEB-INF/components.xml ファイルの JNDI ルックアップ文字列を変更します。新しい移植可能な JNDI のルールが導入されたため、JBoss EAP 6 は 移植可能な JNDI の構文ルールを使用して EJB をバインドします。JBoss EAP 5 で使用された単一の jndiPattern を使用することはできません。JBoss EAP 6 では、アプリケーションの EJB JNDI ルックアップ文字列を次のように変更する必要があります。
    java:global/jboss-seam-booking/jboss-seam-booking/HotelSearchingAction!org.jboss.seam.example.booking.HotelSearching
    java:app/jboss-seam-booking/HotelSearchingAction!org.jboss.seam.example.booking.HotelSearching
    java:module/HotelSearchingAction!org.jboss.seam.example.booking.HotelSearching
    java:global/jboss-seam-booking/jboss-seam-booking/HotelSearchingAction
    java:app/jboss-seam-booking/HotelSearchingAction
    java:module/HotelSearchingAction
    
    Copy to Clipboard Toggle word wrap
    Seam 2.2 フレームワーク EJB に対する JNDI ルックアップ文字列は、以下のように変更する必要があります。
    java:global/jboss-seam-booking/jboss-seam/EjbSynchronizations!org.jboss.seam.transaction.LocalEjbSynchronizations
    java:app/jboss-seam/EjbSynchronizations!org.jboss.seam.transaction.LocalEjbSynchronizations
    java:module/EjbSynchronizations!org.jboss.seam.transaction.LocalEjbSynchronizations
    java:global/jboss-seam-booking/jboss-seam/EjbSynchronizations
    java:app/jboss-seam/EjbSynchronizations
    java:module/EjbSynchronizations
    
    Copy to Clipboard Toggle word wrap
    以下のどちらかの方法を使用できます。
    1. コンポーネント要素を追加する

      各 EJB に対する jndi-nameWEB-INF/components.xml に追加できます。
          <component class="org.jboss.seam.transaction.EjbSynchronizations" jndi-name="java:app/jboss-seam/EjbSynchronizations"/>
          <component class="org.jboss.seam.async.TimerServiceDispatcher" jndi-name="java:app/jboss-seam/TimerServiceDispatcher"/>
          <component class="org.jboss.seam.example.booking.AuthenticatorAction" jndi-name="java:app/jboss-seam-booking/AuthenticatorAction" />
          <component class="org.jboss.seam.example.booking.BookingListAction"  jndi-name="java:app/jboss-seam-booking/BookingListAction" />
          <component class="org.jboss.seam.example.booking.RegisterAction" jndi-name="java:app/jboss-seam-booking/RegisterAction" />
          <component class="org.jboss.seam.example.booking.HotelSearchingAction" jndi-name="java:app/jboss-seam-booking/HotelSearchingAction" />
          <component class="org.jboss.seam.example.booking.HotelBookingAction" jndi-name="java:app/jboss-seam-booking/HotelBookingAction" />
          <component class="org.jboss.seam.example.booking.ChangePasswordAction" jndi-name="java:app/jboss-seam-booking/ChangePasswordAction" />
      
      
      Copy to Clipboard Toggle word wrap
    2. JNDI パスを指定する @JNDIName(value="") アノテーションを追加してコードを変更することができます。変更されたステートレスセッション Bean のコード例は次のとおりです。この処理の詳細については、Seam 2.2 のリファレンスドキュメントを参照してください。
      @Stateless
      @Name("authenticator")
      @JndiName(value="java:app/jboss-seam-booking/AuthenticatorAction")
      public class AuthenticatorAction 
          implements Authenticator
      {
      ...
      }
      
      Copy to Clipboard Toggle word wrap
結果

Seam 2.2 JAP の Booking アプリケーションが JBoss EAP 6 上にデプロイされ、正常に実行されます。

4.3.4. Seam 2.2 Booking アーカイブの JBoss EAP 6 への移行: 手順説明

ここでは、Seam 2.2 Booking アプリケーションアーカイブを JBoss EAP 5.1 から JBoss EAP 6 へ移植する方法をステップごとに説明します。アプリケーションの移行により適した方法が存在しますが、アプリケーションアーカイブをそのまま JBoss EAP 6 のサーバーへデプロイし、結果を見たい開発者も多くいるはずです。アプリケーションアーカイブをそのままデプロイすると発生する可能性がある問題や、そのデバッグ方法および解決方法について解説することを目的としています。
この例ではアプリケーション EAR は EAP6_HOME/standalone/deployments ディレクトリーにデプロイされ、変更はアーカイブの変更のみとなります。これにより、問題の発生や解決時にアーカイブ内にある XML ファイルの変更が容易になります。

重要

Seam 2.2 で Hibernate を直接使用するアプリケーションは、アプリケーション内部にパッケージ化された Hibernate 3 のバージョンを使用することがあります。JBoss EAP 6 の org.hibernate モジュールを介して提供される Hibernate 4 は、Seam 2.2 によってサポートされません。この例の目的は、最初の手順として JBoss EAP 6 でアプリケーションを実行させることです。Hibernate 3 を Seam 2.2 アプリケーションでパッケージ化する設定はサポートされないことに注意してください。
この時点で URL http://localhost:8080/seam-booking/ をブラウザーで指定してアプリケーションにアクセスすることができます。demo/demo でログインすると Booking のウェルカムページが表示されます。

4.3.5. JBoss EAP 5.1 バージョンの Seam 2.2 Booking アプリケーションのビルドおよびデプロイ

このアプリケーションを移行する前に、JBoss EAP 5.1 の Seam 2.2 Booking アプリケーションをビルドし、アーカイブを抽出してから JBoss EAP 6 のデプロイメントフォルダーへコピーします。

手順4.15 EAR のビルドとデプロイ

  1. EAR をビルドします。
    $ cd /EAP5_HOME/jboss-eap5.1/seam/examples/booking
    $ ANT_HOME/ant explode
    
    Copy to Clipboard Toggle word wrap
  2. EAR を EAP6_HOME デプロイメントディレクトリーへコピーします。
    $ cp -r EAP5_HOME/seam/examples/booking/exploded-archives/jboss-seam-booking.ear EAP6_HOME/standalone/deployments/
    $ cp -r EAP5_HOME/seam/examples/booking/exploded-archives/jboss-seam-booking.war EAP6_HOME/standalone/deployments/jboss-seam.ear
    $ cp -r EAP5_HOME/seam/examples/booking/exploded-archives/jboss-seam-booking.jar EAP6_HOME/standalone/deployments/jboss-seam.ear
    
    Copy to Clipboard Toggle word wrap
  3. JBoss EAP 6 サーバーを起動し、ログをチェックします。ログには以下が記録されているはずです。
    INFO [org.jboss.as.deployment] (DeploymentScanner-threads - 1) Found jboss-seam-booking.ear in deployment directory. 
        To trigger deployment create a file called jboss-seam-booking.ear.dodeploy
    
    Copy to Clipboard Toggle word wrap
  4. jboss-seam-booking.ear.dodeploy という名前の空のファイルを作成し、EAP6_HOME/standalone/deployments ディレクトリーへコピーします。本アプリケーションの移行中に、このファイルを複数回デプロイメントディレクトリーへコピーする必要があるため、簡単に見つかる場所へ保存するようにしてください。デプロイ中であることを示す次のメッセージがログに記録されるはずです。
    INFO [org.jboss.as.server.deployment] (MSC service thread 1-1) Starting deployment of "jboss-seam-booking.ear"
    INFO [org.jboss.as.server.deployment] (MSC service thread 1-3) Starting deployment of "jboss-seam-booking.jar"
    INFO [org.jboss.as.server.deployment] (MSC service thread 1-6) Starting deployment of "jboss-seam.jar"
    INFO [org.jboss.as.server.deployment] (MSC service thread 1-2) Starting deployment of "jboss-seam-booking.war"
    
    Copy to Clipboard Toggle word wrap
    この時点で最初のデプロイメントエラーが発生します。次の手順で各問題を確認し、デバッグおよび解決方法について説明します。
    デプロイメントの問題のデバッグおよび解決方法については、「Seam 2.2 Booking アーカイブのデプロイメントエラーや例外のデバッグおよび解決」をクリックしてください。
    以前のトピックに戻るには、「Seam 2.2 Booking アーカイブの JBoss EAP 6 への移行: 手順説明」をクリックしてください。

4.3.6. Seam 2.2 Booking アーカイブのデプロイメントエラーや例外のデバッグおよび解決

前述の手順、「JBoss EAP 5.1 バージョンの Seam 2.2 Booking アプリケーションのビルドおよびデプロイ」 では JBoss EAP 5.1 の Seam 2.2 Booking アプリケーションを構築し、JBoss EAP 6 のデプロイメントフォルダーにデプロイしました。この手順では発生したデプロイメントエラーをデバッグし解決します。

重要

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

手順4.16 デプロイメントエラーや例外のデバッグおよび解決

  1. 問題 - java.lang.ClassNotFoundException: javax.faces.FacesException
    アプリケーションをデプロイする場合に、ログに以下のエラーが含まれます。
    ERROR \[org.jboss.msc.service.fail\] (MSC service thread 1-1) MSC00001: Failed to start service jboss.deployment.subunit."jboss-seam-booking.ear"."jboss-seam-booking.war".POST_MODULE:
    org.jboss.msc.service.StartException in service jboss.deployment.subunit."jboss-seam-booking.ear"."jboss-seam-booking.war".POST_MODULE:
    Failed to process phase POST_MODULE of subdeployment "jboss-seam-booking.war" of deployment "jboss-seam-booking.ear"
        (.. additional logs removed ...)
    Caused by: java.lang.ClassNotFoundException: javax.faces.FacesException from \[Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader\]
        at org.jboss.modules.ModuleClassLoader.findClass(ModuleClassLoader.java:191)
    
    Copy to Clipboard Toggle word wrap
    ログの解説

    ClassNotFoundException は見つからない依存関係があることを示しています。この例では、クラス javax.faces.FacesException が見つからないため、依存関係を明示的に追加する必要があります。

    解決方法

    見つからないクラスと一致するパスを探し、EAP6_HOME/modules/system/layers/base/ ディレクトリー内でそのクラスのモジュール名を見つけます。この例では、以下の 2 つのモジュールが見つかります。

    javax/faces/api/main
    javax/faces/api/1.2
    
    Copy to Clipboard Toggle word wrap
    両モジュールのモジュール名は同じ javax.faces.api ですが、メインディレクトリーにあるモジュールは JSF 2.0 向けで、1.2 ディレクトリーにあるものは JSF 1.2 向けです。一致するモジュールが 1 つのみの場合、MANIFEST.MF ファイルを作成し、モジュールの依存関係を追加します。この例では、メインディレクトリーにある 2.0 バージョンではなく JSF 1.2 バージョンを使用したいため、使用したい方を指定し、使用したくない方を除外します。これを行うには、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"/>
          </dependencies>
      </deployment>
      <sub-deployment name="jboss-seam-booking.war">
        <exclusions>
            <module name="javax.faces.api" slot="main"/>
          </exclusions>
          <dependencies>
            <module name="javax.faces.api" slot="1.2"/>
          </dependencies>
      </sub-deployment>
    </jboss-deployment-structure>
    
    
    Copy to Clipboard Toggle word wrap
    deployment セクションで、JSF 1.2 モジュール用 javax.faces.api に対する依存関係を追加します。また、WAR のサブデプロイメントセクションで JSF 1.2 モジュール用依存関係を追加し、JSF 2.0 用モジュールを除外します。

    EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed ファイルを削除して同じディレクトリーに空の jboss-seam-booking.ear.dodeploy ファイルを作成し、アプリケーションを再デプロイします。
  2. 問題 - java.lang.ClassNotFoundException: org.apache.commons.logging.Log
    アプリケーションをデプロイする場合に、ログに以下のエラーが含まれます。
    ERROR [org.jboss.msc.service.fail] (MSC service thread 1-8) MSC00001: Failed to start service jboss.deployment.unit."jboss-seam-booking.ear".INSTALL:
    org.jboss.msc.service.StartException in service jboss.deployment.unit."jboss-seam-booking.ear".INSTALL:
    Failed to process phase INSTALL of deployment "jboss-seam-booking.ear"
        (.. additional logs removed ...)
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.Log from [Module "deployment.jboss-seam-booking.ear.jboss-seam-booking.war:main" from Service Module Loader]
    
    Copy to Clipboard Toggle word wrap
    ログの解説

    ClassNotFoundException は見つからない依存関係があることを示しています。この例では、クラスorg.apache.commons.logging.Log が見つからないため、依存関係を明示的に追加する必要があります。

    解決方法

    見つからないクラスと一致するパスを探し、EAP6_HOME/modules/system/layers/base/ ディレクトリー内でそのクラスのモジュール名を見つけます。この例では、パス org/apache/commons/logging/ と一致するモジュールが 1 つあります。モジュール名は "org.apache.commons.logging"です。

    モジュール依存関係をファイルのデプロイメントセクションに追加するよう jboss-deployment-structure.xml ファイルを変更します。
    <module name="org.apache.commons.logging" export="true"/>
    
    
    Copy to Clipboard Toggle word wrap
    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="org.apache.commons.logging" export="true"/>
          </dependencies>
      </deployment>
      <sub-deployment name="jboss-seam-booking.war">
        <exclusions>
            <module name="javax.faces.api" slot="main"/>
          </exclusions>
          <dependencies>
            <module name="javax.faces.api" slot="1.2"/>
          </dependencies>
      </sub-deployment>
    </jboss-deployment-structure>
    
    
    Copy to Clipboard Toggle word wrap
    EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed ファイルを削除して同じディレクトリーに空の jboss-seam-booking.ear.dodeploy ファイルを作成し、アプリケーションを再デプロイします。
  3. 問題 - java.lang.ClassNotFoundException: org.dom4j.DocumentException
    アプリケーションをデプロイする場合に、ログに以下のエラーが含まれます。
    ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-3) Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener: java.lang.NoClassDefFoundError: org/dom4j/DocumentException
        (... additional logs removed ...)
    Caused by: java.lang.ClassNotFoundException: org.dom4j.DocumentException from [Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader]
    
    Copy to Clipboard Toggle word wrap
    ログの解説

    ClassNotFoundException は見つからない依存関係があることを示しています。この例では、クラス org.dom4j.DocumentException が見つかりません。

    解決方法

    org/dom4j/DocumentException を探して、EAP6_HOME/modules/system/layers/base/ディレクトリーを見つけます。モジュール名は、“org.dom4j” です。モジュール依存関係をファイルのデプロイメントセクションに追加するよう jboss-deployment-structure.xml ファイルを変更します。

    <module name="org.dom4j" export="true"/>
    
    
    Copy to Clipboard Toggle word wrap
    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="org.apache.commons.logging" export="true"/>
                <module name="org.dom4j" export="true"/>
              </dependencies>
      </deployment>
      <sub-deployment name="jboss-seam-booking.war">
        <exclusions>
            <module name="javax.faces.api" slot="main"/>
          </exclusions>
          <dependencies>
            <module name="javax.faces.api" slot="1.2"/>
          </dependencies>
      </sub-deployment>
    </jboss-deployment-structure>
    
    
    Copy to Clipboard Toggle word wrap

    EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed ファイルを削除して同じディレクトリーに空の jboss-seam-booking.ear.dodeploy ファイルを作成し、アプリケーションを再デプロイします。
  4. 問題 - java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValue
    アプリケーションをデプロイする場合に、ログに以下のエラーが含まれます。
    ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-6) Exception sending context initialized event to listener instance of class org.jboss.seam.servlet.SeamListener: java.lang.RuntimeException: Could not create Component: org.jboss.seam.international.statusMessages
        (... additional logs removed ...)
    Caused by: java.lang.ClassNotFoundException: org.hibernate.validator.InvalidValue from [Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader]
    
    Copy to Clipboard Toggle word wrap
    ログの解説

    ClassNotFoundException は見つからない依存関係があることを示しています。この例では、クラス org.hibernate.validator.InvalidValue が見つかりません。

    解決方法

    モジュール「org.hibernate.validator」は存在しますが JAR に org.hibernate.validator.InvalidValue クラスが含まれていないため、モジュールの依存関係を追加してもこの問題は解決しません。この例では、クラスが含まれる JAR は JBoss EAP 5.1 デプロイメントの一部になります。EAP5_HOME/seam/lib/ ディレクトリーに不明なクラスが含まれている JAR を探します。これを実行するには、コンソールを開いて以下の内容を入力します。

    $ cd EAP5_HOME/seam/lib
    $ grep 'org.hibernate.validator.InvalidValue' `find . -name '*.jar'`
    
    Copy to Clipboard Toggle word wrap
    結果は以下のようになります。
    $ Binary file ./hibernate-validator.jar matches
    $ Binary file ./test/hibernate-all.jar matches
    
    Copy to Clipboard Toggle word wrap
    この場合は、hibernate-validator.jarjboss-seam-booking.ear/lib/ ディレクトリーにコピーします。
    $ cp EAP5_HOME/seam/lib/hibernate-validator.jar jboss-seam-booking.ear/lib
    
    Copy to Clipboard Toggle word wrap

    EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed ファイルを削除して同じディレクトリーに空の jboss-seam-booking.ear.dodeploy ファイルを作成し、アプリケーションを再デプロイします。
  5. 問題 - java.lang.InstantiationException: org.jboss.seam.jsf.SeamApplicationFactory
    アプリケーションをデプロイする場合に、ログに以下のエラーが含まれます。
    INFO  [javax.enterprise.resource.webcontainer.jsf.config] (MSC service thread 1-7) Unsanitized stacktrace from failed start...: com.sun.faces.config.ConfigurationException: Factory 'javax.faces.application.ApplicationFactory' was not configured properly.
      at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:296) [jsf-impl-2.0.4-b09-jbossorg-4.jar:2.0.4-b09-jbossorg-4]
      (... additional logs removed ...)
    Caused by: javax.faces.FacesException: org.jboss.seam.jsf.SeamApplicationFactory
      at javax.faces.FactoryFinder.getImplGivenPreviousImpl(FactoryFinder.java:606) [jsf-api-1.2_13.jar:1.2_13-b01-FCS]
      (... additional logs removed ...)
      at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:294) [jsf-impl-2.0.4-b09-jbossorg-4.jar:2.0.4-b09-jbossorg-4]
      ... 11 more
    Caused by: java.lang.InstantiationException: org.jboss.seam.jsf.SeamApplicationFactory
      at java.lang.Class.newInstance0(Class.java:340) [:1.6.0_25]
      at java.lang.Class.newInstance(Class.java:308) [:1.6.0_25]
      at javax.faces.FactoryFinder.getImplGivenPreviousImpl(FactoryFinder.java:604) [jsf-api-1.2_13.jar:1.2_13-b01-FCS]
      ... 16 more
    
    Copy to Clipboard Toggle word wrap
    ログの解説

    com.sun.faces.config.ConfigurationExceptionjava.lang.InstantiationException は依存関係の問題があることを示しています。この例では、原因は明らかではありません。

    解決方法

    com.sun.faces クラスが含まれるモジュールを探す必要があります。com.sun.faces モジュールは存在しませんが、com.sun.jsf-impl モジュールが 2 つあります。1.2 ディレクトリーの jsf-impl-1.2_13.jar を確認すると、com.sun.faces クラスが含まれていることがすぐに分かります。javax.faces.FacesExceptionClassNotFoundException の場合と同様、メインディレクトリーの JSF 2.0 バージョンではなく JFS 1.2 バージョンを使用したいため、使用したい方を指定し、使用したくない方を除外します。ファイルのデプロイメントセクションにモジュールの依存関係を追加するよう jboss-deployment-structure.xml を変更する必要があります。また、WAR のサブデプロイメントに追加し、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"/>
            <module name="org.apache.commons.logging" export="true"/>
            <module name="org.dom4j" 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>
    
    Copy to Clipboard Toggle word wrap

    EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed ファイルを削除して同じディレクトリーに空の jboss-seam-booking.ear.dodeploy ファイルを作成し、アプリケーションを再デプロイします。
  6. 問題 - java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStack
    アプリケーションをデプロイする場合に、ログに以下のエラーが含まれます。
    ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/seam-booking]] (MSC service thread 1-1) Exception sending context initialized event to listener instance of class com.sun.faces.config.ConfigureListener: java.lang.RuntimeException: com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! org.apache.commons.collections.ArrayStack from [Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader]
        (... additional logs removed ...)
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.collections.ArrayStack from [Module "deployment.jboss-seam-booking.ear:main" from Service Module Loader]
    
    Copy to Clipboard Toggle word wrap
    ログの解説

    ClassNotFoundException は見つからない依存関係があることを示しています。この例では、クラス org.apache.commons.collections.ArrayStack が見つかりません。

    解決方法

    org/apache/commons/collections パスを探して、EAP6_HOME/modules/system/layers/base/ ディレクトリーを見つけます。モジュール名は、"org.apache.commons.collections" です。モジュール依存関係をファイルのデプロイメントセクションに追加するよう jboss-deployment-structure.xml を変更します。

    <module name="org.apache.commons.collections" export="true"/>
    
    Copy to Clipboard Toggle word wrap
    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"/>
            <module name="org.apache.commons.logging" export="true"/>
            <module name="org.dom4j" export="true"/>
            <module name="org.apache.commons.collections" 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>
    
    Copy to Clipboard Toggle word wrap

    EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed ファイルを削除して同じディレクトリーに空の jboss-seam-booking.ear.dodeploy ファイルを作成し、アプリケーションを再デプロイします。
  7. 問題 - Services with missing/unavailable dependencies
    アプリケーションをデプロイする場合に、ログに以下のエラーが含まれます。
    ERROR [org.jboss.as.deployment] (DeploymentScanner-threads - 2) {"Composite operation failed and was rolled back. Steps that failed:" => {"Operation step-2" => {"Services with missing/unavailable dependencies" => ["jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.AuthenticatorAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]","jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.HotelSearchingAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".HotelSearchingAction.\"env/org.jboss.seam.example.booking.HotelSearchingAction/em\" ]","
      (... additional logs removed ...)
    "jboss.deployment.subunit.\"jboss-seam-booking.ear\".\"jboss-seam-booking.jar\".component.BookingListAction.START missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".BookingListAction.\"env/org.jboss.seam.example.booking.BookingListAction/em\" ]","jboss.persistenceunit.\"jboss-seam-booking.ear/jboss-seam-booking.jar#bookingDatabase\" missing [ jboss.naming.context.java.bookingDatasource ]"]}}}
    
    Copy to Clipboard Toggle word wrap
    ログの解説

    「Services with missing/unavailable dependencies」(見つからない/使用できない依存関係を持つサービス) のエラーが発生したら、「missing」の後の括弧内にある文字を確認してください。この場合は、次のようになります。

    missing [ jboss.naming.context.java.comp.jboss-seam-booking.\"jboss-seam-booking.jar\".AuthenticatorAction.\"env/org.jboss.seam.example.booking.AuthenticatorAction/em\" ]
    
    Copy to Clipboard Toggle word wrap
    「/em」は、Entity Manager とデータソースの問題を示します。

    解決方法

    JBoss EAP 6 ではデータソースの設定が変更になったため、EAP6_HOME/standalone/configuration/standalone.xml ファイルに定義する必要があります。JBoss EAP 6 には、すでに standalone.xml ファイルに定義されているデータベースの例が含まれているため、 このアプリケーションでサンプルデータベースを使用するよう persistence.xml ファイルを変更します。standalone.xml ファイルを見るとサンプルデータベースの jndi-namejava:jboss/datasources/ExampleDS であることが分かります。jboss-seam-booking.jar/META-INF/persistence.xml ファイルを変更して既存の jta-data-source 要素をコメントアウトし、以下のように置き換えます。

    <!-- <jta-data-source>java:/bookingDatasource</jta-data-source> -->
    <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
    
    Copy to Clipboard Toggle word wrap

    EAP6_HOME/standalone/deployments/jboss-seam-booking.ear.failed ファイルを削除して同じディレクトリーに空の jboss-seam-booking.ear.dodeploy ファイルを作成し、アプリケーションを再デプロイします。
  8. この時点で、アプリケーションはエラーを引き起こさずにデプロイされますが、ブラウザーで URL http://localhost:8080/seam-booking/ へアクセスし、アカウントへログインしようとするとランタイムエラー 「The page isn't redirecting properly」(ページが正しくリダイレクトしません) が発生します。次の手順でランタイムエラーのデバッグおよび解決方法について学びましょう。
    ランタイム問題のデバッグおよび解決方法については、「Seam 2.2 Booking アーカイブのランタイムエラーや例外のデバッグおよび解決」を参照してください。
    以前のトピックに戻るには、「Seam 2.2 Booking アーカイブの JBoss EAP 6 への移行: 手順説明」をクリックしてください。

4.3.7. Seam 2.2 Booking アーカイブのランタイムエラーや例外のデバッグおよび解決

前述の手順、「Seam 2.2 Booking アーカイブのデプロイメントエラーや例外のデバッグおよび解決」 ではデプロイメントエラーのデバッグ方法について説明しました。この手順では発生したランタイムエラーをデバッグし解決します。

重要

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

手順4.17 ランタイムエラーや例外のデバッグおよび解決

この時点では、アプリケーションをデプロイしてもログにエラーは記録されていませんが、アプリケーション の URL にアクセスするとエラーがログに記録されます。
  1. 問題 - javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''
    ブラウザーで URL http://localhost:8080/seam-booking/ にアクセスすると、"The page isn't redirecting properly (ページが正常にリダイレクトされていません)" というメッセージが示され、ログに以下のエラーが含まれます。
    SEVERE [org.jboss.seam.jsf.SeamPhaseListener] (http--127.0.0.1-8080-1) swallowing exception: java.lang.IllegalStateException: Could not start transaction
      at org.jboss.seam.jsf.SeamPhaseListener.begin(SeamPhaseListener.java:598) [jboss-seam.jar:]
      (... log messages removed ...)
    Caused by: org.jboss.seam.InstantiationException: Could not instantiate Seam component: org.jboss.seam.transaction.synchronizations
      at org.jboss.seam.Component.newInstance(Component.java:2170) [jboss-seam.jar:]
      (... log messages removed ...)
    Caused by: javax.naming.NameNotFoundException: Name 'jboss-seam-booking' not found in context ''
      at org.jboss.as.naming.util.NamingUtils.nameNotFoundException(NamingUtils.java:109)
      (... log messages removed ...)
    
    Copy to Clipboard Toggle word wrap
    ログの解説

    NameNotFoundException は JNDI の命名の問題であることを示しています。JBoss EAP 6 では JNDI の命名ルールが変更になったため、新しいルールに従ってルックアップ名を変更する必要があります。

    解決方法

    これをデバッグするには、使用された JNDI バインディングに対するサーバーログトレースを確認します。サーバーログを確認すると、内容は以下のようになります。

    15:01:16,138 INFO  [org.jboss.as.ejb3.deployment.processors.EjbJndiBindingsDeploymentUnitProcessor] (MSC service thread 1-1) JNDI bindings for session bean named RegisterAction 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/RegisterAction!org.jboss.seam.example.booking.Register
      java:app/jboss-seam-booking.jar/RegisterAction!org.jboss.seam.example.booking.Register
      java:module/RegisterAction!org.jboss.seam.example.booking.Register
      java:global/jboss-seam-booking/jboss-seam-booking.jar/RegisterAction
      java:app/jboss-seam-booking.jar/RegisterAction
      java:module/RegisterAction
      [JNDI bindings continue ...]
    
    Copy to Clipboard Toggle word wrap
    ログには、各セッション Bean に対して 1 つずつ合計で 8 つの INFO JNDI バインディング (RegisterAction、BookingListAction、HotelBookingAction、AuthenticatorAction、ChangePasswordAction、HotelSearchingAction、EjbSynchronizations、および TimerServiceDispatcher) がリストされます。新しい JNDI バインディングを使用するよう WAR の lib/components.xml ファイルを変更します。ログで、EJB JNDI バインディングがすべて "java:app/jboss-seam-booking.jar" で始まっていることに注意してください。以下のように core:init 要素を置き換えます。
    <!--     <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/> -->
    <core:init jndi-pattern="java:app/jboss-seam-booking.jar/#{ejbName}" debug="true" distributable="false"/>
    
    
    Copy to Clipboard Toggle word wrap
    次に、EjbSynchronizations バインディングと TimerServiceDispatcher JNDI バインディングを追加する必要があります。ファイルに以下のコンポーネント要素を追加します。
    <component class="org.jboss.seam.transaction.EjbSynchronizations" jndi-name="java:app/jboss-seam/EjbSynchronizations"/>
    <component class="org.jboss.seam.async.TimerServiceDispatcher" jndi-name="java:app/jboss-seam/TimerServiceDispatcher"/>
    
    
    Copy to Clipboard Toggle word wrap
    components.xml ファイルは以下のようになるはずです。
    <?xml version="1.0" encoding="UTF-8"?>
    <components xmlns="http://jboss.com/products/seam/components"
      xmlns:core="http://jboss.com/products/seam/core"
      xmlns:security="http://jboss.com/products/seam/security"
      xmlns:transaction="http://jboss.com/products/seam/transaction"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation=
        "http://jboss.com/products/seam/core http://jboss.com/products/seam/core-2.2.xsd
         http://jboss.com/products/seam/transaction http://jboss.com/products/seam/transaction-2.2.xsd
         http://jboss.com/products/seam/security http://jboss.com/products/seam/security-2.2.xsd
         http://jboss.com/products/seam/components http://jboss.com/products/seam/components-2.2.xsd">
    
        <!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/> -->
        <core:init jndi-pattern="java:app/jboss-seam-booking.jar/#{ejbName}" debug="true" distributable="false"/>
        <core:manager conversation-timeout="120000"
                      concurrent-request-timeout="500"
                      conversation-id-parameter="cid"/>
        <transaction:ejb-transaction/>
        <security:identity authenticate-method="#{authenticator.authenticate}"/>
        <component class="org.jboss.seam.transaction.EjbSynchronizations"
                jndi-name="java:app/jboss-seam/EjbSynchronizations"/>
        <component class="org.jboss.seam.async.TimerServiceDispatcher"
                jndi-name="java:app/jboss-seam/TimerServiceDispatcher"/>
    </components>
    
    
    Copy to Clipboard Toggle word wrap

    standalone/deployments/jboss-seam-booking.ear.failed ファイルを削除して同じディレクトリーに空の jboss-seam-booking.ear.dodeploy ファイルを作成し、アプリケーションを再デプロイします。
  2. 問題 - エラーが発生せずにアプリケーションがデプロイされ、実行されます。ブラウザーで URL http://localhost:8080/seam-booking/ にアクセスし、ログインしようとすると「Login failed. Transaction failed.」 というメッセージが表示され、ログインに失敗します。サーバーログに次のような例外トレースが記録されるはずです。
    13:36:04,631 WARN  [org.jboss.modules] (http-/127.0.0.1:8080-1) Failed to define class org.jboss.seam.persistence.HibernateSessionProxy in Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader: java.lang.LinkageError: Failed to link org/jboss/seam/persistence/HibernateSessionProxy (Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader)
    ....
    Caused by: java.lang.LinkageError: Failed to link org/jboss/seam/persistence/HibernateSessionProxy (Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader)
    ...
    Caused by: java.lang.NoClassDefFoundError: org/hibernate/engine/SessionImplementor
    	at java.lang.ClassLoader.defineClass1(Native Method) [rt.jar:1.7.0_45]
    ...
    Caused by: java.lang.ClassNotFoundException: org.hibernate.engine.SessionImplementor from [Module "deployment.jboss-seam-booking.ear.jboss-seam.jar:main" from Service Module Loader]
    ...
    
    Copy to Clipboard Toggle word wrap
    ログの解説

    ClassNotFoundException は Hibernate ライブラリーがないことを示しています。この場合、hibernate-core.jar が存在しません。

    解決方法

    hibernate-core.jar JAR を EAP5_HOME/seam/lib/ ディレクトリーから jboss-seam-booking.ear/lib ディレクトリーへコピーします。

    standalone/deployments/jboss-seam-booking.ear.failed ファイルを削除して同じディレクトリーに空の jboss-seam-booking.ear.dodeploy ファイルを作成し、アプリケーションを再デプロイします。
  3. 問題 - エラーが発生せずにアプリケーションがデプロイされ、実行されます。ブラウザーで URL http://localhost:8080/seam-booking/ にアクセスすると正常にログインできますが、ホテルを予約しようとすると、例外トレースが記録されます。
    これをデバッグするには、真のエラーを隠している jboss-seam-booking.ear/jboss-seam-booking.war/WEB-INF/lib/jboss-seam-debug.jar を最初に削除します。この時点で、次のエラーが表示されるはずです。
    java.lang.NoClassDefFoundError: org/hibernate/annotations/common/reflection/ReflectionManager
    Copy to Clipboard Toggle word wrap
    ログの解説

    NoClassDefFoundError は Hibernate ライブラリーがないことを示しています。

    解決方法

    hibernate-annotations.jar および hibernate-commons-annotations.jar JAR を EAP5_HOME/seam/lib/ ディレクトリーから jboss-seam-booking.ear/lib ディレクトリーへコピーします。

    standalone/deployments/jboss-seam-booking.ear.failed ファイルを削除して同じディレクトリーに空の jboss-seam-booking.ear.dodeploy ファイルを作成し、アプリケーションを再デプロイします。
  4. ランタイムおよびアプリケーションエラーが解決されるはずです。
    この時点で、エラーが発生せずにアプリケーションがデプロイおよび実行されます。
    以前のトピックに戻るには、「Seam 2.2 Booking アーカイブの JBoss EAP 6 への移行: 手順説明」をクリックしてください。

4.3.8. Seam 2.2 Booking アプリケーションの移行時に加えられる変更概要の確認

事前に依存関係を判断し、暗黙的な依存関係を一度に追加した方が効率的ですが、この例では問題がどのようにログに表示されるかを説明し、デバッグや解決方法に関する情報を提供します。JBoss EAP 6 へ移行する時にアプリケーションに加えられる変更の概要は次のとおりです。

重要

Seam 2.2 で Hibernate を直接使用するアプリケーションは、アプリケーション内部にパッケージ化された Hibernate 3 のバージョンを使用することがあります。JBoss EAP 6 の org.hibernate モジュールを介して提供される Hibernate 4 は、Seam 2.2 によってサポートされません。この例の目的は、最初の手順として JBoss EAP 6 でアプリケーションを実行させることです。Hibernate 3 を Seam 2.2 アプリケーションでパッケージ化する設定はサポートされないことに注意してください。
  1. jboss-deployment-structure.xml ファイルを、EAR の META-INF/ ディレクトリーに作成しました。ClassNotFoundExceptions を解決するために、<dependencies><exclusions> を追加しました。このファイルには、以下のデータが含まれます。
    <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"/>
    	      <module name="org.apache.commons.logging" export="true"/>
        	      <module name="org.dom4j" export="true"/>
    	      <module name="org.apache.commons.collections" 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>
    
    
    Copy to Clipboard Toggle word wrap
  2. ClassNotFoundExceptions を解決するため、次の JAR を EAP5_HOME/jboss-eap-5.1/seam/lib/ ディレクトリーから jboss-seam-booking.ear/lib/ ディレクトリーへコピーしました。

    • hibernate-core.jar
    • hibernate-validator.jar
  3. 次のように jboss-seam-booking.jar/META-INF/persistence.xml ファイルを変更しました。
    1. JBoss EAP 6 に同梱されるサンプルデータベースを使用するよう jta-data-source 要素を変更しました。
      <!-- <jta-data-source>java:/bookingDatasource</jta-data-source> -->
      <jta-data-source>java:jboss/datasources/ExampleDS</jta-data-source>
      
      
      Copy to Clipboard Toggle word wrap
    2. hibernate.cache.provider_class プロパティーをコメントアウトしました。
      <!-- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/> -->
      
      
      Copy to Clipboard Toggle word wrap
  4. 新しい JNDI バインディングを使用するよう、WAR の lib/components.xml ファイルを変更しました。
    1. 以下のように既存の core:init 要素を置き換えました。
      <!-- <core:init jndi-pattern="jboss-seam-booking/#{ejbName}/local" debug="true" distributable="false"/> -->
      <core:init jndi-pattern="java:app/jboss-seam-booking.jar/#{ejbName}" debug="true" distributable="false"/>
      
      
      Copy to Clipboard Toggle word wrap
    2. "EjbSynchronizations" バインディングおよび "TimerServiceDispatcher" JNDI バインディングのコンポーネント要素を追加しました。
      <component class="org.jboss.seam.transaction.EjbSynchronizations" jndi-name="java:app/jboss-seam/EjbSynchronizations"/>
       <component class="org.jboss.seam.async.TimerServiceDispatcher" jndi-name="java:app/jboss-seam/TimerServiceDispatcher"/>
      
      
      Copy to Clipboard Toggle word wrap

付録A Revision History

改訂履歴
改訂 2.0-20 Wed Dec 4 2013 Russell Dickenson
Red Hat JBoss Enterprise Application Platform 6.2.0 GA

法律上の通知

Copyright © 2013 Red Hat, Inc..
This document is licensed by Red Hat under the Creative Commons Attribution-ShareAlike 3.0 Unported License. If you distribute this document, or a modified version of it, you must provide attribution to Red Hat, Inc. and provide a link to the original. If the document is modified, all Red Hat trademarks must be removed.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
トップに戻る
Red Hat logoGithubredditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

Theme

© 2025 Red Hat