この章では、アプリケーション・クライアント開発の基本的な要件、およびOracleアプリケーション・クライアント・コンテナの使用方法を説明します。この章には、次の項目が含まれます。
アプリケーション・クライアントを開発する場合、およびアプリケーション・クライアント・コンテナを使用する場合、ユーザーはJNDIおよびRMIを理解している必要があります。これらの項目は、このマニュアルのそれぞれに関連する章で説明されています。
アプリケーション・クライアント・コンテナのタスク
この章では、次のタスクを説明します。
追加ドキュメント
OC4JのサイトにあるHow-Toドキュメントでは、OC4Jの機能に関する追加情報(EJBの例など)を提供しています。例には、アプリケーション・クライアント・コンテナの機能を示すアプリケーション・クライアントが含まれています。
http://www.oracle.com/technology/tech/java/oc4j/index.html
WebコンテナやEJBコンテナとは違い、アプリケーション・クライアント・コンテナは軽量のJ2EEコンテナで、クライアント・コンピュータで稼働します。アプリケーション・クライアント・コンテナは、アプリケーション・クライアントと呼ばれるアプリケーション・コンポーネントのホスティングに使用されます。リモートのJ2EEサーバーにあるリソースおよび機能へのアクセスを提供する際にアプリケーション・クライアント・コンテナに依存すること以外、アプリケーション・クライアントは、スタンドアロンのJava2 SEアプリケーションに似ています。実際的な面から見ると、アプリケーション・クライアント・コンテナを使用することにより、開発者は、データソースまたはEJBなどのJ2EEリソースに対するアクセス権も持つ、堅牢なスタンドアロンのJavaアプリケーションを作成できます。図9-1に、アプリケーション・クライアント・コンテナ、アプリケーション・クライアントおよびリモートのJ2EEリソースの概念図を示します。
Oracleアプリケーション・クライアント・コンテナには、JNDIおよびRMIの実装が含まれます。実行時、コンテナはJNDIを使用して初期コンテキスト・ファクトリおよびRMIを作成し、クライアントに必要なリモート・リソースを取得します。
JNDIのサポート
アプリケーション・クライアント・コンテナでは、JNDIを使用してリモートのOracle Application Serverでホスティングされているリソースをルックアップできます。アプリケーション・クライアントのメイン・クラスにリソースが自動的に挿入されるようにするための注釈や、JNDIルックアップを作成するためのJNDI APIも使用できます。JNDIを使用したことがない場合、JNDIの使用方法の詳細は第2章を参照してください。
RMIのサポート
リモート・リソースに対するすべてのリクエストは、RMIを介して実行されます。アプリケーション・クライアント・コンテナでは、ORMI、RMI/IIOPおよびORMIトンネリングを使用できます。また、OPMNを介したORMI接続もサポートされています。RMIを使用したことがない場合、RMIの使用方法の詳細は第6章を参照してください。
セキュリティのサポート
アプリケーション・クライアント・コンテナでは、カスタムのセキュリティ・コールバック・ハンドラを使用できます。カスタムのセキュリティ・コールバック・ハンドラを使用すると、カスタマイズした方法でユーザー資格証明を取得できます。
アプリケーション・コンテナには、次のランタイム要件があります。
JRE 1.4.Xまたは1.5.X。
リソース・インジェクション用の注釈の使用は、JRE 1.5を使用している場合にのみサポートされます。JRE 1.4を使用している場合、注釈の解釈はスキップされます。リソース・インジェクション(J2EE 1.5の機能)は、リソース・インジェクション用のデプロイメント・ディスクリプタ・タグを使用している場合にのみJRE 1.4でサポートされます。
OC4Jクライアント・サイドのディストリビューション
OC4Jクライアント・サイドのディストリビューションには、アプリケーション・クライアント・コンテナの実行に必要なすべてのライブラリが含まれています。ディストリビューションは、OC4Jのダウンロード・ページから入手できます。
http://www.oracle.com/technology/software/products/ias/htdocs/utilsoft.html
コンピュータの任意の場所にライブラリを解凍します。このマニュアルでは、この場所をJ2EE_HOME
と呼びます。開発およびテスト中は、J2EE_HOME
をOracle Application Serverの/j2ee/home
ディレクトリに設定した方が便利です。この場所には、必要なライブラリも格納されています。
この項では、アプリケーション・クライアント・コンテナ用のアプリケーション・クライアントの開発に関する基本的な内容を説明します。一般的に、アプリケーション・クライアントは、J2SEアプリケーションの標準構造に準拠しています。ただし、アプリケーション・クライアントでは、コンテナによって提供されるJ2EE機能も使用されます。
アプリケーション・クライアントには、メイン・クラスとみなされるクラスがあります。メイン・クラスは、アプリケーション・クライアントの起動時のエントリ・ポイントです。このクラスには、static main
メソッドが含まれている必要があります。main
メソッドは、コンテナの初期化後に最初に起動されるメソッドです。単純なアプリケーション・クライアントでは、次のようなものを使用します。
public class Foo { public static void main(String[] args) { ... } }
アプリケーション・クライアント・コンテナでは、起動時にアプリケーション・クライアントJARのManifest.mf
ファイルを使用して、アプリケーション・クライアントのメイン・クラスを検索します。クラスは、Manifest.mf
ファイルにMain-Class
属性を定義することでメイン・クラスとして指定されます。例:
Main-Class: com.mycompany.MyMainClass
アプリケーション・クライアントJARの作成方法の詳細は、「クライアントのパッケージ化」を参照してください。
アプリケーション・クライアント・コンテナには、リモート・リソースにアクセスするためのJNDIサービスへのアクセス権のあるアプリケーション・クライアントが用意されています。そのため、アプリケーション・クライアントからのリソース(EJBやデータソースなど)の取得は、その他のJ2EEコンポーネントで使用されるのと同じJNDIプログラミング・モデルに従います。後続の各項では、JNDIの使用方法の概要を説明します。JNDIを使用したことがない場合、JNDIの使用方法の詳細は第2章を参照してください。
注意: JNDIを使用してアプリケーション・クライアントからEJBリソースをルックアップする詳細な例は、第2章の「J2EEアプリケーション・クライアントからのオブジェクトのルックアップ」を参照してください。また、JNDIネーミング・コンテキストで使用可能なデータソースを使用してデータベースに接続する方法の詳細は、第5章の「データソースからの接続の取得」を参照してください。 |
アプリケーション・クライアントのメイン・クラスでは、ネーミング・コンテキストからのリソース・インジェクションのリクエストや、ネーミング・コンテキストで必要なエントリの宣言をJava言語の注釈を使用して実行できます。注釈は、コンテナの初期化手順の一部として処理されます。コンテナを開始してアプリケーション・クライアントが起動されると、注釈は処理されません。
注釈付きのメイン・クラスのメソッドおよびフィールドは、static
である必要があります。この規則は、インジェクションをリクエストしているメソッドやフィールドをstatic
にできない、典型的なJ2EEリソースとは異なります。この違いの理由は、コンテナではアプリケーション・クライアントのインスタンスが作成されないことにあります。アプリケーション・クライアント・コンテナでは、アプリケーション・クライアントJARのマニフェストに指定されているメイン・クラスをロードし、そのクラスのstatic main
メソッドを起動します。この後、アプリケーション・クライアントはJ2SEアプリケーションと同じように稼働します。
次の例では、@EJB
という注釈を使用して、HelloWorld
というリモートのEJBリソースへの参照を取得する方法を示します。
import javax.ejb.EJB; public class HelloWorldClient { @EJB private static HelloWorld helloWorld; public static void main(String[] args) { // Use the HellOWorld bean. ...
注意: アプリケーション・コンポーネントごとに、サポートされる注釈タグも異なります。それぞれのコンポーネントでの注釈の使用方法の詳細は、個々のアプリケーション・コンポーネントのマニュアル(『Oracle Containers for J2EE Enterprise JavaBeans開発者ガイド』など)を参照してください。 |
アプリケーション・クライアント・クラスでは、JNDI APIを使用してネーミング・コンテキストのリソースをルックアップできます。注釈とは異なり、コンテナの初期化後もJNDIルックアップを処理できます。次に、JNDI APIを使用して、前の例と同じHelloWorld
EJBリソースを取得する例を示します。
import javax.naming.Context; import javax.naming.InitialContext; public class HelloWorldClient { public static void main(String[] args) { try { HelloWorld helloWorld = (HelloWorld) new InitialContext() .lookup("java:comp/env/ejb/HelloWorld"); // Use the HelloWorld bean. ...
アプリケーション・クライアントでは、アプリケーション・クライアントのデプロイメント・ディスクリプタを使用して、ネーミング・コンテキストでのエントリの宣言およびエントリのインジェクションのリクエストを実行できます。次の例では、リソース・インジェクションをリクエストする方法、およびクライアントのデプロイメント・ディスクリプタにHelloWorld
EJBを宣言する方法を示します。
<application-client> <ejb-ref> <ejb-ref-name>com.myCompany.HelloWorldClient/helloWorld</ejb-ref-name> <remote>com.myCompany.HelloWorld</remote> <injection-target> <injection-target-class> com.myCompany.HelloWorldClient </injection-target-class> <injection-target-name>helloWorld</injection-target-name> </injection-target> </ejb-ref></application-client>
例では、HelloWorld
Beanが、HelloWorldClient
クラスのhelloWorld
インスタンスに挿入されています。
アプリケーション・クライアントのデプロイメント・ディスクリプタの使用方法の詳細は、「デプロイメント・ディスクリプタの使用方法」を参照してください。
JNDIプロパティはjndi.properties
ファイルに設定されます。このファイルは、実行時のコンテナに必要です。コンテナは、このファイルを使用して初期JNDIコンテキストを作成し、リモート・リソースにアクセスするためのRMI接続設定を定義します。このファイルは、アプリケーション・クライアントJARのルートに配置する必要があります。
次の例では、スタンドアロンOC4JサーバーでホスティングされているEJBにアクセスする際に必要なプロパティを示します。
java.naming.factory.initial=oracle.j2ee.naming. ApplicationClientInitialContextFactory
java.naming.provider.url=ormi://<host>:23791/my_ejb>
java.naming.security.principal=scott
java.naming.security.credentials=tiger
初期ファクトリは常にApplicationClientInitialContextFactory
です。また、リソースがOPMNを使用するOracle Application Serverに配置されている場合は、ネーミング・プロバイダURLの一部としてopmn:ormi
プロトコルを使用します。例:
java.naming.provider.url=opmn:ormi://<host>:6003:home/my_ejb
ORMIを使用してリモート・リソースに接続する方法の詳細は、「RMI/ORMIを使用したリモート・オブジェクトのルックアップ」を参照してください。JNDIの使用方法の詳細は、第2章「JNDIの使用」を参照してください。
application-client.xml
ファイルは、アプリケーション・クライアント用の標準のJ2EEデプロイメント・ディスクリプタで、アプリケーション・クライアントJARのMETA-INF/
ディレクトリに配置する必要があります。このファイルは、環境エントリやアプリケーション・クライアントに必要なリソースへの参照の定義に使用されます。ただし、リソース・インジェクションを実行するために、クライアント・コードで注釈のみが使用されている場合には、このファイルは不要です。
注意: リソース参照は、注釈を使用して定義するだけでなく、application-client.xml ファイルにも定義できます。その場合、デプロイメント・ディスクリプタは注釈よりも優先されます。 |
application-client.xml
ファイルでは、標準のJ2EE参照要素(env-entry
、ejb-ref
、resource-ref
など)が使用されます。デプロイメント・ディスクリプタの詳細は、J2EE仕様のアプリケーション・クライアント・コンテナに関する章を参照してください。この章には、application-client.xml
ファイルの詳細な例および使用可能な要素のリストがあります。
アプリケーション・クライアントは、JARファイルとしてパッケージ化されます。アーカイブは、Javaのjar
ユーティリティを使用するか、類似の圧縮形式(zipなど)を使用して拡張子を.jar
に変更することで作成できます。
アーカイブ・ファイルのコンテンツは、次のような標準の構造で編成されています。
/ /jndi.properties /META-INF /META-INF/Manifest.mf /META-INF/application-client.xml
アプリケーション・クライアント・コンテナは、初期JNDIコンテキストの作成時やリモート・メソッドの起動時にはリモート・サーバーに認証する必要があります。コンテナでは、JNDIプロパティ・ファイルに定義されているユーザー名、パスワードおよびプロバイダURLを使用するデフォルトのコールバック・ハンドラが使用されます。これらのプロパティの設定方法の詳細は、「JNDIプロパティの設定」を参照してください。
アプリケーション・クライアントでJAASコールバック・ハンドラを実装すると、必要な資格証明を取得するためにログイン画面を表示するなどのカスタム機能を提供できます。そのような場合、コンテナにより起動時にコールバック・ハンドラがインスタンス化され、JNDIプロパティ・ファイルに定義されている設定は無視されます。コールバック・ハンドラが失敗すると、コンテナはJNDIプロパティ・ファイルのデフォルトの設定に戻ります。
カスタム・セキュリティ・ハンドラを実装するには、次のようにします。
javax.security.auth.callback.CallbackHandler
インタフェースを実装する、引数コンストラクタのないハンドラ・クラスを作成します。
アプリケーション・クライアントJARファイルにコールバック・ハンドラを追加するか、実行時にCLASSPATH
でハンドラが検出されることを確認します。
ハンドラ・クラスへの参照をapplication-client.xml
ファイルに追加します。例:
<application-client> <callback-handler> com.myCompany.MyCallbackHandler </callback-handler> </application-client>
アプリケーション・クライアント・コンテナは、起動時にクライアントを起動します。起動中、コンテナはまずJNDIコンテキストを作成し、定義されている任意のリモート・サーバーに接続して、クライアントがリクエストしたJ2EEリソースを取得します。クライアントは、コンテナによる初期化が完了した後にのみ起動されます。
注意: クライアントを起動する前には、リクエストされたリソースがリモート・サーバーにデプロイされていることと、サーバーが起動されていることを確認してください。コンテナがリモート・サーバーのリソースを検出できない場合、コンテナは初期化に失敗し、クライアントも起動されません。 |
アプリケーション・クライアント・コンテナの起動クラス(oracle.oc4j.appclient.AppClientContainer
)は、oc4jclient.jar
のメイン・クラスとして設定されます。JARを使用してアプリケーション・クライアントを起動するには、コマンドラインから次のコマンドを入力します。
java -jar J2EE_HOME\oc4jclient.jar <aplication_client_jar> <arguments>
アプリケーション・クライアントJARファイルへのフルパスを指定する必要があります。また、コマンドラインで指定されたクライアント引数は、起動時にクライアントのmain()
メソッドに渡され、コンテナでは処理されません。
oc4jclient.jar
ファイルのデフォルトの動作では、Manifest.mf
ファイルに定義されているCLASSPATH
を使用してコンテナが起動されます。ただし、起動時にその他のライブラリまたはディレクトリが必要な場合には、アプリケーション・クライアント・コンテナの起動クラスおよびJavaの-cp
オプションを使用します。例:
java -cp J2EE_HOME\oc4jclient.jar;foo.jar oracle.oc4j.appclient.AppClientContainer <aplication_client_jar> <arguments>
注意: Javaライブラリと同様に、アプリケーション・クライアント・ライブラリでは、マニフェストにClass-Path エントリを含めることができます。これにより、アプリケーション・クライアントのクラスパスに外部JARを追加し、詳細なクラスパス構成を提供できます。ただし、JARを使用できるのはアプリケーション・クライアントのみで、アプリケーション・クライアント・コンテナでは使用できません。 |