www.bea.com code library downloads support.bea.com BEA logo

WebLogic エンタープライズ JavaBeans プログラマーズ ガイド

 Previous Next Contents Index View as PDF

WebLogic Server EJB コンテナ用の EJB のパッケージ化

次の節では、エンタープライズ JavaBean (EJB) 固有のパッケージ化 (「アセンブル」とも言う) に関する問題と手順について説明します。この節を読む前に、EJB を含む WebLogic Server のアプリケーションおよびモジュールの一般的なパッケージ化手順について、『WebLogic Server アプリケーションの開発』の「WebLogici Server アプリケーションのアセンブルとパッケージ化」を参照してください。この節の各トピックでは、EJB に固有のパッケージ化の問題および手順のみを説明します。

 


EJB デプロイメント記述子の詳細

EJB の作成およびパッケージ化の過程では、いくつかのデプロイメント記述子ファイルを生成して、適切な場所に配置します。デプロイメント ファイルは、Bean がコンパイルされると、EJB デプロイメントの一部となります。

XML デプロイメント記述子ファイルには、EJB に対するデプロイメント記述子の最低限の設定を含める必要があります。いったんファイルを作成すると、「デプロイメント記述子の編集」の手順に従って後で編集できます。デプロイメント記述子ファイルは、使用する各ファイルの文書型定義 (DTD) のバージョンに準拠する必要があります。

ファイルの文書型定義 (DTD) には、EJB XML デプロイメント記述子ファイルのすべての要素および下位要素 (属性) の名前を記述します。各ファイルの説明については、以下の節を参照してください。

3 つの EJB デプロイメント記述子ファイル

エンタープライズ JavaBean は、3 つのデプロイメント記述子を使用して、動作属性を定義します。

デプロイメント記述子間の関係

weblogic-ejb-jar.xml 内の記述子は、ejb-jar.xml 内の EJB 名、動作中の WebLogic Server のリソース名、および weblogic-cmp-rdbms-jar.xml (コンテナ管理による永続性を使用するエンティティ EJB の場合) 内に定義されている永続性タイプ データにリンクされています。次の図は、デプロイメント ファイルと WebLogic Server 間の関係を示しています。

図7-1 デプロイメント ファイルのコンポーネント間の関係


 

文書型定義および DOCTYPE ヘッダ情報

XML ファイルの内容および要素の配置は、使用する各ファイルの文書型定義 (DTD) に従っている必要があります。WebLogic Server では、XML デプロイメント ファイルの DOCTYPE ヘッダ内部に埋めこまれた DTD は無視され、代わりにサーバと一緒にインストールされた DTD の場所が使用されます。ただし、DOCTYPE ヘッダ情報には、パーサ エラーを避けるために、有効な URL 構文を指定する必要があります。

XML デプロイメント ファイルの編集、作成時に、各デプロイメント ファイルに対して正しい DOCTYPE ヘッダを指定することが重要です。特に、DOCTYPE ヘッダ内部に不正な PUBLIC 要素を使用すると、原因究明が困難なパーサ エラーになることがあります。

このヘッダは、デプロイメント記述子の文書型定義 (DTD) ファイルの場所およびバージョンを表します。このヘッダは外部 URL の java.sun.com を参照していますが、WebLogic Server には独自の DTD ファイルが用意されているので、ホスト サーバがインターネットにアクセスする必要はありません。ただし、この要素の DTD のバージョンはデプロイメント記述子のバージョンの識別に使用されるので、<!DOCTYPE...> 要素を weblogic-ejb-jar.xml ファイルおよび weblogic-cmp-rdbms-jar.xml ファイルに含めて、外部 URL を参照させる必要があります。

XML の解析ツール (appc など) でヘッダ情報が不正な XML ファイルを解析すると、次のようなエラー メッセージが表示されることがあります。

SAXException: This document may not have the identifier 'identifier_name'

identifier_name には通常、PUBLIC 要素内の不正な文字列が表示されます。

WebLogic Server 固有の weblogic-ejb-jar.xml ファイルの PUBLIC 要素には、次のようにテキストを指定する必要があります。

XML ファイル

PUBLIC 要素の文字列

weblogic-ejb-jar.xml

'-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN' 'http://www.bea.com/servers/wls810/dtd/weblogic-ejb-jar.dtd'

weblogic-ejb-jar.xml

'-//BEA Systems, Inc.//DTD WebLogic 7.0.0 EJB//EN' 'http://www.bea.com/servers/wls700/dtd/weblogic-ejb-jar.dtd'

weblogic-ejb-jar.xml

'-//BEA Systems, Inc.//DTD WebLogic 6.0.0 EJB//EN' 'http://www.bea.com/servers/wls600/dtd/weblogic-ejb-jar.dtd'

weblogic-ejb-jar.xml

'-//BEA Systems, Inc.//DTD WebLogic 5.1.0 EJB//EN'

'http://www.bea.com/servers/wls510/dtd/weblogic-ejb-jar.dtd'


 

WebLogic Server 固有の weblogic-cmp-rdbms-jar.xml ファイルの PUBLIC 要素には、次のようにテキストを指定する必要があります。


 

XML ファイル

PUBLIC 要素の文字列

weblogic-cmp-rdbms
-jar.xml

'-// BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB RDBMS Persistence//EN' 'http://www.bea.com/servers/wls810/dtd/weblogic-rdbms20-persistence-810.dtd'

weblogic-cmp-rdbms
-jar.xml

'-// BEA Systems, Inc.//DTD WebLogic 7.0.0 EJB RDBMS Persistence//EN' 'http://www.bea.com/servers/wls700/dtd/weblogic-rdbms20-persistence-700.dtd'

weblogic-cmp-rdbms
-jar.xml

'-// BEA Systems, Inc.//DTD WebLogic 6.0.0 EJB RDBMS Persistence//EN' 'http://www.bea.com/servers/wls600/dtd/weblogic-rdbms20-persistence-600.dtd'


 

Sun Microsystems 固有の ejb-jar.xml ファイルの PUBLIC 要素には、次のようにテキストを指定する必要があります。

XML ファイル

PUBLIC 要素の文字列

ejb-jar.xml

'-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN'

'http://java.sun.com/dtd/ejb-jar_2_0.dtd'

ejb-jar.xml

'-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN'

'http://www.java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd'


 

たとえば、weblogic-ejb-jar.xml ファイルの DOCTYPE ヘッダは次のようになります。

<!DOCTYPE weblogic-ejb-jar PUBLIC 
'-//BEA Systems, Inc.//DTD WebLogic 8.1.0 EJB//EN' 'http://www.bea.com/servers/wls810/dtd/weblogic-ejb-jar.dtd'>

デプロイメント記述子の編集

以下のツールを使用して、デプロイメント記述子を編集できます。

WebLogic Builder を使用したデプロイメント記述の編集

WebLogic Builder は、アプリケーションのデプロイメント記述子 XML ファイルを編集するためのビジュアルな環境を提供します。これらの XML ファイルは WebLogic Builder で視覚的に編集しながら表示できますが、XML ファイルをテキスト編集する必要はありません。

WebLogic Builder は以下の開発作業に使用します。

WebLogic Builder の使い方については、WebLogic Builder のマニュアルを参照してください。

XML デプロイメント ファイルの手動による編集

XML デプロイメント記述子要素を手動で編集するには、次の手順に従います。

  1. XML の形式の変更や、ファイルを無効にする可能性のある文字の挿入を行わない ASCII テキスト エディタを使用します。
  2. 編集する XML デプロイメント記述子ファイルを開きます。
  3. 変更を入力します。使用しているオペレーティング システムで大文字小文字が区別されない場合であっても、ファイル名やディレクトリ名の大文字小文字は正確に指定します。
  4. 省略可能な要素に対してデフォルト値を使用する場合は、要素の定義全体を省略するか、または次のように空白値を指定します。

<max-beans-in-cache></max-beans-in-cache>

各デプロイメント記述子について、必ず正しい DOCTYPE ヘッダを含めるようにしてください。「文書型定義および DOCTYPE ヘッダ情報」を参照してください。

記述子の動的な更新

このリリースの WebLogic Server では、Administration Console デプロイメント記述子エディタが非推奨になりました。代わりに、新しく Administration Console の [記述子] タブが提供されています。[記述子] タブは、管理用としてのみ意図されています。

[記述子] タブを使用すると、EJB 内の記述子ファイルの表示、修正、およびデプロイメント記述子要素の保持を行うことができます。記述子は、EJB の管理サーバ コピー、ならびに EJB のすべてのデプロイされたコピー (デプロイ後) において、修正されます。WebLogic Builder または手動の編集ツールを使用して記述子を修正した場合、変更はユーザの EJB のオリジナル コピー (デプロイ前) に対して行われます。

ただし、これらの記述子要素の更新は、EJB を再デプロイする必要なしに、実行時に動的に行われます。[記述子] タブに含まれる記述子要素属性は、次の表に示す、実行時に動的に変更できるものに限定されます。

表7-1 [記述子] タブで編集可能なデプロイメント記述子要素

EJB タイプ

編集可能な要素

エンティティ

メッセージ駆動型

ステートレス

ステートフル


 

 


EJB クラスのコンパイルと EJB コンテナ クラスの生成

デプロイメント ユニットの作成手順の一部として、EJB クラスをコンパイルし、デプロイメント記述子をデプロイメント ユニットに追加し、デプロイメント ユニットにアクセスするためのコンテナ クラスを作成する必要があります。

  1. コマンド ラインから javac コンパイラを使用して、EJB クラスをコンパイルします。
  2. コンパイル済みユニットに適切な XML デプロイメント記述子ファイルを追加します。
  3. appc を使用して、Bean にアクセスするためのコンテナ クラスを生成します。

    コンテナ クラスには、WebLogic Server が使用する EJB の内部表現に加えて、クライアントが使用する外部インタフェース (ホーム、ローカル、またはリモート) の実装も格納されます。

appc コンパイラは、WebLogic 固有の XML デプロイメント記述子ファイルで指定した XML デプロイメント記述子ファイルに従ってコンテナ クラスを生成します。たとえば EJB をクラスタで使用するよう指定した場合、ejbc は、そのデプロイメント用の特別なクラスタ対応クラスを作成します。

また、コマンド ラインから ejbc を直接使用して、必要なオプションと引数を指定することもできます。詳細については、「appc」を参照してください。

次の図は、EAR または JAR ファイルの作成時にデプロイメント ユニットに追加されるコンテナ クラスを示しています。

図7-2 EJB コンテナ クラスの生成


 


 

生成クラス名の衝突の可能性

まれなことではありますが、appc でクラス名を生成したとき、生成したクラス名の衝突に遭遇し、これが ClassCastException や他の例外を招くことがあります。これは、生成されるクラス名が、Bean クラス名、Bean クラス パッケージ、その Bean の ejb-name の 3 つのキーをもとにしているためです。この問題が起こるのは、複数の JAR ファイルを含む EAR ファイルを使用し、その 2 つ以上の JAR ファイルのそれぞれに Bean クラス、パッケージ、または、クラス名を同じくする EJB が含まれ、双方の EJB がそれぞれの JAR ファイル内で同じ ejb-name を持っている場合です。この問題が発生した場合は、いずれかの Bean のejb-name をユニークなものに変更してください。

ejb-name はファイル名の基となるキーの 1 つであり、ejb-name は JAR ファイル内でユニークでなければならないので、同じ JAR ファイルにある 2 つの EJB 間ではこの問題は起きません。また、EAR ファイルではファイルごとに個別のクラスローダになるため、別々の EAR ファイルに置かれた 2 つの EJB 間でこの問題は起きません。

 


他の EJB およびリソースへの参照

デプロイメント記述子の EJB 参照を指定することにより、EJB が WebLogic Server にデプロイされている他の EJB をルックアップし使用することができます。EJB 参照を作成する際の要件は、参照される EJB が呼び出し側の EJB にとって外部的か、もしくは、同じアプリケーション EAR ファイルの一部としてデプロイされているかによって異なります。

外部 EJB の参照

外部 EJB を参照するためには、呼び出し側の EJB の weblogic-ejb-jar.xml ファイルに <reference-descriptor> スタンザを追加します。次の XML コードに、外部 EJB を参照するスタンザの例を示します。

図7-3 外部 EJB を参照する XML コード例

<reference-descriptor>
<ejb-reference-description>
<ejb-ref-name>AdminBean</ejb-ref-name>
<jndi-name>payroll.AdminBean</jndi-name>
</ejb-reference-description>
76</reference-descriptor>

このスタンザ内の ejb-ref-name 要素は、呼び出し側 EJB がその外部 EJB をルックアップする際に使用する名前を指定しています。jndi-name要素は、指定された ejb-ref-name をルックアップするときに使用する汎用的な JNDI 名を指定しています。

アプリケーション スコープの EJB の参照

同じ EAR ファイルの一部として複数の EJB をデプロイする場合、アプリケーションのローカル JNDI ツリーに一連のEJB 名を追加します。そのアプリケーション内のEJB およびそれ以外のコンポーネントは、java:comp/env から相対的に、JNDI ツリー内にあるアプリケーション スコープの他のコンポーネントを直接、ルックアップできます。

ある EJB が同じ EAR ファイルの一部としてデプロイされている他の EJB を参照する場合には、weblogic-ejb-jar.xml ファイルで汎用的な JNDI 名を指定する必要はありません。実際には、WebLogic 固有の他の機能のデプロイメント記述子が必要なければ、weblogic-ejb-jar.xml ファイルをまるごと省略できます。

同じ EAR ファイルの一部としてデプロイされた EJB を参照するためには、呼び出し側の EJB の ejb-jar.xml デプロイメント記述子ファイルに <ejb-local-ref> スタンザを追加します。次に例を示します。

図7-4 同じ EAR ファイルの EJB を参照する XML コード例

<ejb-local-ref>
<description>Reference to application EJB</description>
<ejb-ref-name>ejb1</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<local-home>mypackage.ejb1.MyHome</home>
<local>mypackage.ejb1.MyRemote</local>
<ejb-link>ejb1.jar#myejb</ejb-link>
</ejb-local-ref>

上記の例で、ejb-ref-name 要素は、呼び出し側の EJB がアプリケーション スコープの EJB をルックアップするのに使用する名前を示します。ejb-link 要素は、指定された <ejb-ref-name> を、その EAR ファイルでデプロイされる別の EJB にマップします。この例で <ejb-link> の名前が 2 番目の EJB を保存するファイル名で修飾されている点に注意してください。この EAR ファイル内の2 つ以上の EJB が同じ名前を持つ場合には、このように EJB 名を修飾することが必要になります。 これにより、ファイル名の修飾子による参照の一意性が保証されます。

EJB リンクの詳細については、「EJB リンクの使用」を参照してください。

アプリケーション スコープの JDBC データソースの参照

 


EJB が、同じ EAR ファイルの一部としてデプロイされている JDBC データソースにアクセスすることもできます。weblogic-application.xml デプロイメント記述子で示されるデータソースに、java:comp/env からローカルにアクセスできます。詳細については、『WebLogic Server Web アプリケーションの開発』の「アプリケーション スコープのリソースのコンフィグレーション」を参照してください。ejb-client.jar の指定

WebLogic Server では、ejb-client.jar ファイルを使用できます。

ejb-client.jar には、エンティティ Bean のホーム インタフェース、リモート インタフェース、および主キー クラスが必ず格納されます。WebLogic Server ではejb-client.jar にこれらのクラスを追加し、これらのファイルとこれらが参照するすべてのファイルをチェックすることにより追加すべきファイルがないか判断します。しかし、ファイルがクラスパスで参照されている場合には、WebLogic Server はそれをejb-client.jar に追加しません。これにより、WebLogic Server では必要なカスタム クラスを ejb-client.jar に追加することができます。 その一方で、java.lang.String などの汎用クラスは制限されます。

また、ejb-client.jar には、 ホーム インタフェース、リモート インタフェース、主キー クラスホーム、リモート インタフェース クラス、および、主キー クラスが参照しているすべてのクラスが ejb-jar からコピーされます。

たとえば、ShoppingCart リモート インタフェースが Item クラスを返すメソッドを持っているとします。このリモート インタフェースはこのクラスを参照し、ejb-jar ファイルに入っているので、EJB client.jar に含まれます。

ejb-client.jar ファイルを作成するには、この機能を Bean の ejb-jar.xml デプロイメント記述子ファイルで指定してから、weblogic.appc を使用して ejb-client.jar ファイルを生成します。ejb-client.jar には、ejb-jar ファイルの EJB を呼び出すためにクライアント プログラムに必要なクラス ファイルが格納されます。これらのファイルは、クライアントをコンパイルするために必要なクラスです。この機能を指定した場合、WebLogic Server は ejb-client.jar を自動的に作成します。

ejb-client.jar を指定するには、次の手順に従います。

  1. コマンド ラインから javac コンパイラを使用して、Bean の Java クラスをディレクトリにコンパイルします。
  2. コンパイル済みユニットに EJB XML デプロイメント記述子ファイルを追加します。
  3. Bean の ejb-jar.xml ファイルの ejb-client-jar デプロイメント記述子を次のように編集して、ejb-client.jar のサポートを指定します。
<ejb-client-jar>ShoppingCartClient.jar</ejb-client-jar>
  1. weblogic.appc を使用して Bean にアクセスするためのコンテナ クラスを作成し、次のコマンドを使用して ejb-client.jar を作成します。
$ java weblogic.appc <ShoppingCart.jar>

ejb-client.jar には、エンティティ Bean のホーム インタフェース、リモート インタフェース、および主キー クラスが必ず格納されます。また、これらのインタフェースが参照する ejb-jar ファイルのすべてのクラスのコピーも格納されます。たとえば、ShoppingCart リモート インタフェースが Item クラスを返すメソッドを持っているとします。このリモート インタフェースはこのクラスを参照し、ejb-jar ファイルに入っているので、EJB client.jar に含まれます。

外部クライアントは、ejb-client.jar をそれぞれのクラスパスに含めます。Web アプリケーションは、ejb-client.jar¥lib ディレクトリに含めます。

 

 Back to Top Previous Next