ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server デプロイメント プログラマーズ ガイド
11g リリース 1 (10.3.1)
B55512-01
 

目次
目次

戻る
戻る
 
次へ
次へ
 

3 デプロイメントのためのアプリケーションのコンフィグレーション

このドキュメントの文脈で使用するコンフィグレーションという用語は、WebLogic Server インスタンスへのデプロイメントのためにアプリケーションまたはデプロイ可能なリソースを準備するプロセスのことを指します。アプリケーションのほとんどのコンフィグレーション情報は、アプリケーションのデプロイメント記述子に指定されます。これらの記述子の一部の要素では外部オブジェクトが参照され、サーバ ベンダに応じて特定の処理が必要なものもあります。WebLogic Server では、記述子を拡張した WebLogic Server 固有のデプロイメント記述子を使用します。標準の記述子と WebLogic Server 記述子とのマッピングは DDBeanDConfigBean を介して管理されます。

次の節では、デプロイメントのために WebLogic デプロイメント API を使用してアプリケーションをコンフィグレーションする方法について説明します。

コンフィグレーション プロセスの概要

この節では、デプロイするアプリケーションのコンフィグレーションを行うために、デプロイメント ツールで行う必要がある基本的な手順について説明します。

  1. アプリケーション評価 - アプリケーション ファイルを検査および評価して、アプリケーションの構造と組み込まれている標準の記述子の内容を判断します。

    • WebLogicDeploymentManager を取得することでデプロイメント セッションを初期化する。「アプリケーション評価」を参照してください。

    • WebLogicJ2eeApplicationObject または WebLogicDeployableObject を作成して、エンタープライズ アプリケーション (Enterprise Application : EAR) またはスタンドアロン モジュール (WAR、EAR、RAR、CAR) の J2EE コンフィグレーションを表現する。オブジェクトが EAR の場合、子オブジェクトが作成されます。http://java.sun.com/j2ee/tools/deployment/index.jsp の J2EE Deployment API 標準 (JSR-88) および「デプロイ可能なオブジェクトの作成」を参照してください。

  2. フロントエンド コンフィグレーション - アプリケーションに組み込まれている情報に基づいてコンフィグレーション情報を作成します。この情報には、WebLogic Server 記述子、デフォルト、ユーザ定義によるデプロイメント プランの形式があります。

    • WebLogicDeploymentConfiguration オブジェクトを作成して、アプリケーションの WebLogic Server コンフィグレーションを表現する。これは、このオブジェクトのデプロイメント プランを作成するための最初のステップです。「デプロイメント コンフィグレーション」を参照してください。

    • 既存のデプロイメント プランを利用できる場合は、そのデプロイメント プランから既存の WebLogic Server コンフィグレーションの値を復元する。「フロントエンド コンフィグレーションの実行」を参照してください。

  3. デプロイメント コンフィグレーション - ユーザ入力および選択する WebLogic Server 対象に基づいて、個々の WebLogic Server コンフィグレーションの値を変更します。

    デプロイメント ツールには、ユーザ入力および選択する WebLogic Server 対象に基づいて、個々の WebLogic Server コンフィグレーションの値を変更する機能が必要です。「デプロイメント コンフィグレーションのカスタマイズ」を参照してください。

  4. デプロイメント準備 - 最終的なデプロイメント プランを生成し、クライアントサイドでアプリケーションをある程度検証します。

    デプロイメント ツールには、変更した WebLogic Server コンフィグレーション情報を、新しいデプロイメント プランまたは既存のデプロイメント プランの変数定義に保存する機能が必要です。

コンフィグレーション情報の種類

以下の節では、コンフィグレーション情報の種類、表現方法、および J2EE 記述子と WebLogic Server 記述子の関係に関する基本情報について説明します。

J2EE コンフィグレーション

アプリケーションの J2EE コンフィグレーションでは、アプリケーションの基本的なセマンティクスと実行時の動作、またアプリケーションの機能に必要な外部リソースを定義します。このコンフィグレーション情報は、アプリケーションに関連付けられた複数の標準 J2EE デプロイメント記述子ファイルに格納されます。表 3-2 に、この記述子ファイル群の一覧を示します。

表 3-1 標準 J2EE デプロイメント記述子

アプリケーションまたはスタンドアロン モジュール J2EE 記述子

エンタープライズ アプリケーション

META-INF/application.xml

Web アプリケーション

WEB-INF/web.xml

エンタープライズ JavaBean

META-INF/ejb.xml

リソース アダプタ

META-INF/ra.xml

クライアント アプリケーション アーカイブ

META-INF/application-client.xml


あらゆるアプリケーション コンフィグレーション セッションには、完全で有効な J2EE デプロイメント記述子の入力が必須です。

J2EE コンフィグレーションでアプリケーションの基本的な動作が決まるため、J2EE 記述子は通常アプリケーションのデプロイメント フェーズ中にのみ定義され、アプリケーションが後に別の環境にデプロイされる際にも変更されません。たとえば、テスト用ドメインまたはプロダクション用ドメインにアプリケーションをデプロイする場合、アプリケーションの動作は (したがってその J2EE コンフィグレーションも) そのアプリケーションをデプロイメント ドメインにデプロイしたときと同じ状態のままです。詳細については、「フロントエンド コンフィグレーションの実行」を参照してください。

WebLogic Server コンフィグレーション

WebLogic Server 記述子では、拡張機能、外部リソースの解決、およびアプリケーション セマンティクスに関連するチューニングが規定されます。この記述子はアプリケーションに組み込まれていても、組み込まれていなくても構いません。アプリケーションの WebLogic Server コンフィグレーションでは、以下のことができます。

  • 外部リソース名を J2EE デプロイメント記述子のリソースの定義にバインドして、特定の WebLogic Server ドメインでアプリケーションが機能できるようにする

  • アプリケーション コンテナのチューニング パラメータを定義する

  • J2EE アプリケーションおよびスタンドアロン モジュールに拡張機能を提供する

WebLogic Server コンフィグレーションの属性および値は、WebLogic Server デプロイメント記述子ファイルに格納されます。これについて、表 3-2 に示します。

表 3-2 WebLogic Server デプロイメント記述子

アプリケーションまたはスタンドアロン モジュール WebLogic Server 記述子

エンタープライズ アプリケーション

META-INF/weblogic-application.xml

Web アプリケーション

WEB-INF/weblogic.xml

エンタープライズ JavaBean

META-INF/weblogic-ejb-jar.xml

リソース アダプタ

META-INF/weblogic-ra.xml

クライアントのアーカイブ

META-INF/weblogic-appclient.xml


さまざまな WebLogic Server ドメインでアプリケーションに対して色々な種類の外部リソースや多様なレベルのサービスが提供されるため、アプリケーションの WebLogic Server コンフィグレーションは、通常そのアプリケーションが新しい環境にデプロイされる際に変更されます。たとえば、プロダクション ステージング ドメインにはデプロイメント ドメインとは異なるデータベース ベンダが採用されていたり、より使用に適したメモリが用意されていたりする場合があります。そのため、アプリケーションをデプロイメントからステージング ドメインに移動する際には、新しいデータベース接続や利用可能なメモリを使用できるようにするために、アプリケーションの WebLogic Server 記述子の値を更新する必要があります。

デプロイメント コンフィグレーション ツールの主要な役割は、アプリケーションの WebLogic Server コンフィグレーションを、選択した WebLogic 対象に対して確実に有効なものにすることです。

J2EE コンフィグレーション情報、WebLogic Server コンフィグレーション情報の表現

J2EE デプロイメント記述子と利用可能なすべての WebLogic Server 記述子の両方が、アプリケーションのコンフィグレーション プロセスへの入力として使用されます。デプロイメント API を使用して、J2EE コンフィグレーションおよび WebLogic Server コンフィグレーションの両方を Java オブジェクトとして表現します。

アプリケーションの J2EE コンフィグレーションは、EAR の場合 WebLogicJ2eeApplicationObject を、スタンドアロン モジュールの場合 WeblogicDeployableObject を作成することにより取得されます(WebLogicJ2eeApplicationObject には、EAR にある個々のモジュールを表現する複数の DeployableObject インスタンスが含まれています)。

WebLogicJ2eeApplicationObject または WeblogicDeployableObject には DDBeanRoot があり、これが対応する J2EE デプロイメント記述子ファイルを表しています。EAR およびモジュールの J2EE 記述子のプロパティは、DDBeanRoot の下にある 1 つまたは複数の DDBean オブジェクトで表されます。DDBean コンポーネントには、デプロイメント記述子の個々のプロパティ、値、およびネストされた記述子要素のそれぞれにアクセスする標準のゲッター メソッドが備わっています。

DDBean

DDBeanjavax.enterprise.deploy.model パッケージに記述されています。このオブジェクトでは標準デプロイメント記述子の要素に対する一般的なインタフェースが提供されますが、標準記述子の基本的な形式に従う任意の XML ファイルへのアクセス用に XPath ベースのメカニズムとしても使用できます。そのような XML ファイルの例には、WebLogic Server 記述子や Web サービス記述子があります。

記述子の DDBean 表現は DDBean のツリー構造で、専用の DDBean が使用され、ツリーのルートには DDBeanRoot があります。DDBean には、それが表現する記述子要素の要素名、ID 属性、ルート、およびテキストに対する、アクセサが用意されています。

アプリケーションの DDBean はモデル プラグインによって導入されます。モデル プラグインは javax.enterprise.deploy.model のツール プロバイダ実装です。アプリケーションは、DeployableObject インタフェースで表現されます。このインタフェースの WebLogic Server 実装は public クラス weblogic.deploy.api.model.WebLogicDeployableObject です。WebLogic Server ベースのデプロイメント ツールで、アプリケーションの WebLogicDeployableObject オブジェクトのインスタンスを createDeployableObject ファクトリ メソッドを介して取得します。その結果、アプリケーションの DDBean ツリーが作成されて、アプリケーションに組み込まれた J2EE 記述子の要素により内容が設定されます。アプリケーションが EAR の場合、複数の WebLogicDeployableObject オブジェクトが作成されます。ルートの WebLogicDeployableObjectWebLogicJ2eeApplicationObject として拡張され、これが EAR モジュールを表します。その子 WebLogicDeployableObject インスタンス群がアプリケーションに含まれるモジュール群 (WAR、EJB、RAR、CAR など) を表します。

J2EE 記述子と WebLogic Server 記述子の関係

J2EE 記述子と WebLogic Server 記述子は外部リソースのコンフィグレーションにおいて直接的に関連しています。J2EE 記述子にはアプリケーションが機能するために必要なリソースの種類を定義しますが、実際に使用するリソース名は特定しません。WebLogic Server 記述子の方で、その J2EE 記述子内のリソース定義名を対象ドメインの実際のリソース名にバインドします。

外部リソースのバインドは、コンフィグレーション プロセスに必須のプロセスです。リソースを対象ドメインにバインドすることで、確実にアプリケーションでリソースを見つけ、正しくデプロイできるようになります。

J2EE 記述子と WebLogic Server 記述子は、WebLogic Server のチューニング パラメータのコンフィグレーションにおいても間接的に関連しています。標準 J2EE 記述子の要素に対して WebLogic Server でチューニング パラメータを設定する必要はありませんが、個々の記述子ファイルの存在によって、どのチューニング パラメータがアプリケーションのコンフィグレーション時に重要なのかが分かります。たとえば、ejb.xml 記述子に WebLogic Server EJB コンテナのチューニングに関連する要素が含まれていなくても、ejb.xml が J2EE コンフィグレーションにあることで、デプロイメントの前にチューニング プロパティをコンフィグレーションできることが分かります。

DConfigBean

DConfigBean (コンフィグレーション Bean) は、サーバのコンフィグレーション要件をデプロイメント ツールに伝達するために使われるオブジェクトです。また、デプロイメント プランの作成には主にここからの情報が使用されます。コンフィグレーション Bean は Java Bean であり、この Bean のプロパティは参照できます。また、この Bean には基本的なプロパティ編集機能もあります。

DConfigBean は、組み込まれた WebLogic Server 記述子とデプロイメント プランの情報、および IDE デプロイメント ツールからの入力によって作成されます。

DConfigBean は、アプリケーションの依存関係に関連付けられるすべての WebLogic 記述子要素に対して作成できます。記述子はアプリケーションで利用可能なリソースが記述されるエンティティで、サーバで指定される JNDI 名で表されます。

記述子は、コンフィグレーション セッションの設定時に型付きの Bean ツリーとしてメモリに解析されます。DConfigBean 実装クラスは WebLogic Server 記述子 Bean に委託します。依存関係にあるプロパティ (リソース参照など) を持つ Bean のみが DConfigBean を持ちます。記述子のルートには常に DConfigBeanRoot があります。

Bean のプロパティへのアクセサでは、コンフィグレーションが必要な要素については子 DConfigBean が、コンフィグレーション不要の要素については記述子 Bean が返されます。プロパティへのアクセサでは記述子 Bean からのデータが返されます。

Bean のプロパティを変更すると、プランがオーバーライドされます。既存の記述子に対するプランのオーバーライドは、変数の割り当てによって処理されます。関連する WebLogic Server 記述子がアプリケーションにない場合、記述子が自動的に作成されて外部プラン ディレクトリに配置されます。外部デプロイメント記述子の場合、記述子が直接変更されます。組み込まれた記述子はディスク上では変更されません。

アプリケーション評価

アプリケーション評価では、アプリケーション用のデプロイメント マネージャおよびデプロイ可能なオブジェクトを取得します。以下の手順に従います。

  1. デプロイメント ファクトリ クラスを名前に weblogic.deployer.spi.factories.internal.DeploymentFactoryImpl を指定して取得する。

  2. ファクトリ クラスを javax.enterprise.deploy.spi.DeploymentFactoryManager インスタンスに登録する。

    次に例を示します。

    Class WlsFactoryClass =   Class.forname("weblogic.deployer.spi.factories.internal.DeploymentFactoryImpl");
    DeploymentFactory myDeploymentFactory =
       (DeploymentFactory) WlsFactoryClass.newInstance();
    DeploymentFactoryManager.getInstance().registerDeploymentFactory(myDeploymentFactory);
    
  3. デプロイメント マネージャの取得

  4. デプロイ可能なオブジェクトの作成

デプロイメント マネージャの取得

以下の節では、デプロイメント マネージャを取得する方法について説明します。

デプロイメント マネージャの種類

WebLogic Server には javax.enterprise.deploy.spi.DeploymentManager の実装が 1 つ用意されていますが、この実装はファクトリから取得したクラスの初期化時に指定する URI によって動作が異なります。そのため WebLogic Server には、基本的なデプロイメント マネージャが 2 種類あります。

  • 非接続デプロイメント マネージャ。WebLogic Server インスタンスへの接続機能がないデプロイメント マネージャです。非接続デプロイメント マネージャを使用すると、リモートのクライアント マシンにあるアプリケーションをコンフィグレーションできます。しかし、このデプロイメント マネージャではデプロイメント工程を実行できません(たとえば、デプロイメント ツールでは非接続デプロイメント マネージャを使用してアプリケーションを配布することはできません)。

  • 接続デプロイメント マネージャ。WebLogic Server ドメインの管理サーバへの接続機能があるデプロイメント マネージャです。デプロイメント ツールを使用することでアプリケーションのコンフィグレーションおよびデプロイの両方に使用できます。

接続デプロイメント マネージャは、管理サーバのローカルに存在するか、あるいは管理サーバに接続されたリモート マシンで動作しているかによってさらに分類されます。ローカルまたはリモートの分類によって、ファイル参照が管理サーバに対してローカルとして扱われるかリモートとして扱われるかが決まります。

表 3-2 に、デプロイメント マネージャの種類をまとめます。

表 3-3 WebLogic Server デプロイメント マネージャの使い方

デプロイメント マネージャの接続性 種類 用途 注意

非接続

なし

コンフィグレーション ツールのみ

デプロイメント処理は実行できない

接続

ローカル

管理サーバのローカルのコンフィグレーション ツールおよびデプロイメント ツール

すべてのファイルが管理サーバ マシンのローカルにある


リモート

リモート マシン上 (管理サーバ上以外) にあるコンフィグレーション ツールおよびデプロイメント ツール

配布およびデプロイメントの工程を行うと、ローカル ファイルが管理サーバにアップロードされる


接続および非接続デプロイメント マネージャの URI

WebLogicDeploymentFactory から取得した各 DeploymentManager では、WebLogic Server 拡張がサポートされます。デプロイメント ツールを作成する場合、デプロイメント ファクトリのインスタンスにある適切なメソッドを呼び出し、必要な種類のデプロイメント マネージャについて記述されている weblogic.deployer.spi.factories.WebLogicDeploymentFactory に定義された文字列定数を指定して、特定の種類のデプロイメント マネージャを取得します。接続デプロイメント マネージャで管理サーバへの接続を取得するためには、有効なサーバの URI と資格をメソッドに渡す必要があります。

表 3-2 に、各種のデプロイメント マネージャを取得する際に使用するメソッド シグネチャと定数についてまとめます。

表 3-4 WebLogic Server デプロイメント マネージャを取得するための URI

デプロイメント マネージャの種類 メソッド 引数

非接続

getDisconnectedDeploymentManager()

WebLogicDeploymentFactory.LOCAL_DM_URI の値 (String 型)

接続、ローカル

getDeploymentManager()

以下の要素からなる URI を指定する

  • WebLogicDeploymentFactory.LOCAL_DM_URI

  • 管理サーバのホスト名

  • 管理サーバのポート

  • 管理者のユーザ名

  • 管理者のパスワード

接続、リモート

getDeploymentManager()

以下の要素からなる URI を指定する

  • WebLogicDeploymentFactory.REMOTE_DM_URI

  • 管理サーバのホスト名

  • 管理サーバのポート

  • 管理者のユーザ名

  • 管理者のパスワード


コード リスト 3-1 のサンプル コードに、非接続デプロイメント マネージャを取得する方法について示します。

コード リスト 3-1 非接続デプロイメント マネージャの取得

Class WlsFactoryClass = Class.forname("weblogic.deployer.spi.factories.internal.DeploymentFactoryImpl");
DeploymentFactory myDeploymentFactory = (DeploymentFactory) WlsFactoryClass.newInstance();
DeploymentFactoryManager.getInstance().registerDeploymentFactory(myDeploymentFactory);
WebLogicDeploymentManager myDisconnectedManager = (WebLogicDeploymentManager)myDeploymentFactory.getDisconnectedDeploymentManager(WebLogicDeploymentFactory.LOCAL_DM_URI);

デプロイメント ファクトリには、接続デプロイメント マネージャ作成のための URI 引数の形成に役立つ createUri() というヘルパー メソッドがあります。たとえば、非接続、リモートのデプロイメント マネージャを作成するには、コードの最終行を次のように置き換えます。(WebLogicDeploymentManager)myDeploymentFactory.getDeploymentManager(myDeploymentFactory.createUri(WebLogicDeploymentFactory.REMOTE_DM_URI, "localhost", "7001", "weblogic", "weblogic"));

SessionHelper を使用したデプロイメント マネージャの取得

SessionHelper ヘルパークラスでは、コード リスト 3-1 にあるように手動でデプロイメント ファクトリを作成および登録せずに、簡単にデプロイメント マネージャを取得できるようにするための便利なメソッドが複数提供されています。非接続デプロイメント マネージャを取得するために必要な SessionHelper のコードは以下の 1 行のみです。

   DeploymentManager myDisconnectedManager = SessionHelper.getDisconnectedDeploymentManager();

SessionHelper を使用して接続デプロイメント マネージャを取得することもできます。以下に例を示します。

   DeploymentManager myConnectedManager = SessionHelper.getDeploymentManager("adminhost", "7001", "weblogic", "weblogic"));

このメソッドでは、管理サーバ (adminhost) へのリモート接続を前提にしています。SessionHelpe の詳細については、「Javadocs」を参照してください。

デプロイ可能なオブジェクトの作成

以下の節では、デプロイ可能なオブジェクトを作成する方法について説明します。このオブジェクトは、デプロイメント ツールでアプリケーションをデプロイするのに使用されるコンテナになります。デプロイメント マネージャの取得によってコンフィグレーション セッションを初期化したら、デプロイメント ツールで使用するデプロイ可能なオブジェクトを次のいずれかの方法で作成します。

WebLogicDeployableObject クラスの使用

直接的なアプローチでは、以下のように model パッケージの WebLogicDeployableObject クラスを使用します。

   WebLogicDeployableObject myDeployableObject = WebLogicDeployableObject.createWebLogicDeployableObject("myAppFileName");

デプロイ可能なオブジェクトが作成されたら、アプリケーションのデプロイメント コンフィグレーションを作成できます。

SessionHelper を使用してデプロイ可能なオブジェクトの取得

SessionHelper ヘルパー クラスには、デプロイ可能なオブジェクトを取得するための便利なメソッドが用意されています。デプロイ可能なオブジェクトの取得に必要な SessionHelper コードを以下に示します。

   SessionHelper.setApplicationRoot(root);
   WebLogicDeployableObject myDeployableObject = SessionHelper.getDeployableObject();

getDeployableObject() 呼び出しには何もアプリケーションが指定されていません。SessionHelper では、setApplicationRoot() で指定されたルート ディレクトリのアプリケーションが使用されます。アプリケーションのルート ディレクトリを指定すれば、SessionHelper で他の処理 (明示的なディスパッチ ファイルの場所やデプロイメント プランの場所の指定など) を実行できます。

また、以下のように setApplication メソッドを使用してアプリケーションのファイル名を指定することもできます。

SessionHelper.setApplication(AppFileName);

このメソッドを使用すると、ディレクトリ構造に関係なく引き続き SessionHelper を使用できます。getDeployableObject メソッドは、指定されたアプリケーションを返します。

フロントエンド コンフィグレーションの実行

フロントエンド コンフィグレーションでは、WebLogicDeploymentPlan の作成と、WebLogicDeploymentPlan および関連する Bean ツリーへのコンフィグレーション情報の指定を行います。

フロントエンド コンフィグレーション

フロントエンド コンフィグレーション フェーズは、以下の 2 つの論理的処理から構成されます。

  • デプロイメント プランからデプロイメント コンフィグレーションに情報をロードする。デプロイメント コンフィグレーションがまだ存在しない場合は、WebLogicDeploymentConfiguration オブジェクトを作成して、アプリケーションの WebLogic Server コンフィグレーションを表現します。これは、このオブジェクトのデプロイメント プランを作成するプロセスの最初のステップです。

  • 既存のデプロイメント プランから既存の WebLogic Server コンフィグレーションの値を復元する。

デプロイメント ツールには、以下の機能が必要です。

  • デプロイメント コンフィグレーションから情報を抽出する。デプロイメント コンフィグレーションはアクティブな Java オブジェクトで、デプロイメント マネージャでコンフィグレーション情報を取得するために使用されます。デプロイメント プランは、アプリケーションを操作せずに変更できるように、アプリケーションの外部に置かれています。

デプロイメント プランはアプリケーション環境のコンフィグレーションが格納される XML ドキュメントで、アプリケーションのフロントエンド コンフィグレーションと呼ばれることもあります。デプロイメント プランには、以下のような目的があります。

  • アプリケーションのロジックからアプリケーションの環境固有の詳細情報を分離する。

  • すべてのアプリケーションに必須なわけではない。ただし、デプロイメント プランは一般的にアプリケーションのデプロイ先とする各環境に存在します。

  • アプリケーションにどのようなモジュールがあるかなど、アプリケーションの構造を記述する。

  • 開発者や管理者がアプリケーションのアーカイブを変更せずにアプリケーションのコンフィグレーションを更新できるようにする。

  • 環境固有の記述子オーバーライド情報を格納する (チューニング可能)。デプロイメント プランを変更することで、アプリケーションのチューニング可能な変数に環境固有の値を指定することができます。

デプロイメント コンフィグレーション

アプリケーション用のサーバ コンフィグレーションは javax.enterprise.deploy.spi.DeploymentConfiguration インタフェースにカプセル化されます。DeploymentConfiguration はデプロイメント プランのオブジェクト表現を提供します。DeploymentConfigurationDeploymentManager.createConfiguration メソッドを介して DeployableObject に関連付けられます。DeploymentConfiguration オブジェクトを作成すると、すべての WebLogic Server 記述子に記述された、コンフィグレーション可能な要素とチューニング可能な要素を表す DConfigBean のツリーが利用できるようになります。アプリケーションに WebLogic Server 記述子がない場合、DConfigBean ツリーは利用可能なデフォルト値を使用して作成されます。デフォルト値のないバインディングのプロパティは指定されないままになります。

デプロイメント ツールを作成する場合、アプリケーションが配布される前に DConfigBean ツリーを完全に設定する必要があります。

サンプル コード

次のコードは、DConfigBean の設定方法の例です。

コード リスト 3-2 DConfigBean を設定するためのサンプル コード

public class DeploymentSession {
  DeploymentManager dm;
  DeployableObject dObject = null;
  DeploymentConfiguration dConfig = null;
  Map beanMap = new HashMap();
.
.
.
  // app を Web アプリケーションとする
  public void initializeConfig(File app) throws Throwable {
    /**
     * このモジュールの DDBean のラッパーを初期化する。このサンプルでは
    * model api の WLS 実装を使用する
     */
    dObject= WebLogicDeployableObject.createDeployableObject(app);
    //モジュールの基本的なコンフィグレーションを取得
    dConfig = dm.createConfiguration(dObject);
    /**
     * この時点では DeployableObject が指定するDeploymentConfiguration を 
     * その内容に基づいて指定する
     * はじめに Deployableobject にそのルートを要求する
     */
    DDBeanRoot root = dObject.getDDBeanRoot();
    /**
     * ルート DDBean を使用して、このモジュールのコンフィグレーションに
     * 必要な DConfigBean を識別するプロセスを開始する
     */
    System.out.println("Looking up DCB for "+root.getXpath());
    DConfigBeanRoot rootConfig = dConfig.getDConfigBeanRoot(root);
    collectConfigBeans(root, rootConfig);
    /**
     * これで DeploymentConfiguration が初期化されたが、
     * 必ずしも完全に設定する必要はない
     */
    FileOutputStream fos = new FileOutputStream("test.xml");
    dConfig.save(fos);

  }

  // bean は DDBean、dcb は DConfigBean を表す
 private void collectConfigBeans(DDBean bean, DConfigBean dcb) throws Throwable{
    DConfigBean configBean;
    DDBean[] beans;
    if (dcb == null) return;
    /**
     * 以降のプロセスのために、DDBean と DConfigBean 間に
     * 一種のマッピングを維持する
     */
    beanMap.put(bean,dcb);
    /**
     * コンフィグレーション Bean から web.xml 記述子に
     * 記述子で必要とする xpath を公開する
     */
    String[] xpaths = dcb.getXpaths();
    if (xpaths == null) return;
    /**
     * 各 xpath について関連する DDBean 
     * を取得し、すべての DDBean および
     * それに関連する DConfigBean を収集する
     */
    for (int i=0; i<xpaths.length; i++) {
      beans = bean.getChildBean(xpaths[i]);
      for (int j=0; j<beans.length; j++) {
        /** 
         * 各 DDBean に関連付けられている DConfigBean を初期化する
         */
        System.out.println("Looking up DCB for "+beans[j].getXpath());
        configBean = dcb.getDConfigBean(beans[j]);
        collectConfigBeans(beans[j], configBean);
      }
    }

このサンプルでは単に DDBean ツリーを反復処理して、インスタンス化される各 DDBeanDConfigBean を要求しています。

DeploymentConfiguration オブジェクトは DeploymentConfiguration.save() を使用するとデプロイメント プランとして永続化できます。デプロイメント ツールを使用すると、デプロイメント プランをゼロから作成する代わりに、保存されているデプロイメント プランを DeploymentConfiguration オブジェクトにインポートすることもできます。DeploymentConfiguration.restore() を使用するとこの機能を実現できます。これにより、アプリケーションのデプロイメント プランのリポジトリを保持して、そこにさまざまな環境に適用できるさまざまなデプロイメント プランを格納するという手法がサポートされます。

同様に、以前のコンフィグレーション セッションからリポジトリに保存された部分的なプランをつなぎ合わせて DeploymentConfiguration を構成することもできます。部分的なプランは、DConfigBean ツリーの module-root にマップされます。DeploymentConfiguration.saveDConfigBean() および DeploymentConfiguration.restoreDConfigBean() を使用すると、この機能を実現できます。

アプリケーションの WebLogic Server 記述子の解析は、DeploymentConfiguration が作成されるときに自動的に行われます。記述子は最新のスキーマに準拠しているのが理想的です。WebLogic Server 8.1 以前の DTD に基づく記述子が含まれる古いアプリケーションの場合、変換が実行されます。古い記述子はサポートされてはいますが、デプロイメント プランを使用して変更することはできません。そのため、あらゆる DOCTYPE 宣言をネーム スペースの参照に変換する必要があります。また、要素に固有の変換も必ず実施します。

SessionHelper で情報を読み取る

SessionHelper.initializeConfiguration では、アプリケーション内のすべての標準記述子および WebLogic Server 記述子が処理されます。

initializeConfiguration を呼び出す前に、SessionHelper.setPlan() メソッドを使用して既存のデプロイメント プランをアプリケーションに関連付けるように指定できます。プランが設定されている場合、DeploymentConfiguration.restore() メソッドでデプロイメント プランを読み取ることもできます。さらに、プランを設定すると DeploymentConfiguration.initializeConfiguration() メソッドで自動的にコンフィグレーション情報を復元することも可能です。

SessionHelper クラスでコンフィグレーション セッションを開始する場合、以下に例示するようにデプロイメント プランの情報を deploymentConfiguration に入力して簡単に開始できます。

    DeploymentManager dm = SessionHelper.getDisconnectedDeploymentManager();
 SessionHelper helper = SessionHelper.getInstance(dm);
 // アーカイブの場所を指定する
 helper.setApplication(app);
 // 既存のデプロイメント プランの場所を指定する
 helper.setPlan(plan);
 // コンフィグレーション セッションを初期化する
 helper.initializeConfiguration(); 
 DeploymentConfiguration dc = helper.getConfiguration();

上記のコードでは、デプロイメント コンフィグレーションおよびそれに関連付けられる WebLogicDDBeanTree が生成されます。

コンフィグレーションの検証

コンフィグレーションの検証は、ほとんどの場合、アプリケーションの記述子が処理される際に行われる記述子の解析中に発生します。検証では、記述子が有効な XML ドキュメントかどうか、また記述子が各自のスキーマに準拠しているかどうかが確認されます。

デプロイメント コンフィグレーションのカスタマイズ

デプロイメント コンフィグレーションのカスタマイズ フェーズでは、ユーザ入力と選択した WebLogic Server 対象に基づいて、個々の WebLogic Server コンフィグレーションの値を変更します。

コンフィグレーション属性の変更

この段階のコンフィグレーションは、記述子またはアプリケーションに関連付けられた既存のプランとほとんど同様です。DConfigBean は Java Bean として設計されていて内部を参照できるため、ツールでその内容を意味のある形式で提示できます。DConfigBean のプロパティは、そのほとんどがコンフィグレーション可能です。また、主要なプロパティ (ユニークなもの) も公開されます。セッターについては、安全に変更できるプロパティに関するもののみが公開されます。一般的に、アプリケーションの動作が記述されるプロパティは変更できません。すべてのプロパティには記述子スキーマで定義されている型が指定されています。

プロパティのゲッターからは下位要素の DConfigBeanDConfigBean の配列、記述子 Bean、記述子 Bean の配列、単純な値 (プリミティブおよび java.lang オブジェクト)、または単純な値の配列が返されます。記述子 Bean では、変更可能だが DConfigBean の機能を必要としない記述子要素が表現されます。たとえば、記述子 Bean に直接関連している標準記述子要素はありません。コンフィグレーションの編集は、プロパティのセッターを呼び出すことにより行われます。

Java JSR-88 の DConfigBean クラスを使用すると、ツールから getDConfigBean(DDBean) メソッドまたは内部参照を利用して Bean にアクセスできます。アプリケーションの DeployableObject 内の DDBean に基づいて標準記述子を提示した後に、各 DDBean のコンフィグレーション (その DConfigBean) に直接アクセスするツールでは、getDConfigBean(DDBean) によるアプローチが便利です。このアプローチでは、アプリケーションに指定されている可能性のある必須リソース要件のコンフィグレーションが提供されます。内部参照でのアプローチでは、ツールでアプリケーション全体のコンフィグレーションを提示できますが、必須のリソース要件が強調されるとは限りません。

内部参照は両方のアプローチにおいて記述子のプロパティを提示または変更するために必要になります。異なるのはツールでの情報の提示方法です。以下のいずれかで決まるかが異なります。

  • 標準記述子の内容

  • WebLogic Server 記述子の内容

コンフィグレーション情報を変更するシステムには、変更を要求するためのユーザ インタフェースを含める必要があります。コード リスト 3-3 を参照してください。

コード リスト 3-3 コンフィグレーション情報を変更するためのサンプル コード

.
.
.
// DConfigBean ツリーの内部を参照し、セッターでプロパティの入力を要求する
  private  void processBean(DConfigBean dcb) throws Exception {
    if (dcb instanceof DConfigBeanRoot) {
      System.out.println("Processing configuration for descriptor: "+dcb.getDDBean().getRoot().getFilename());
    }
    // bean のプロパティの記述子を取得する
    BeanInfo info =
       Introspector.getBeanInfo(dcb.getClass(),Introspector.USE_ALL_BEANINFO);
    PropertyDescriptor[] props = info.getPropertyDescriptors();
    String bean = info.getBeanDescriptor().getDisplayName();
    PropertyDescriptor prop;
    for (int i=0;i<props.length;i++) {
      prop = props[i];
      // プリミティブのみを更新できるようにする
      Method getter = prop.getReadMethod();
      if (isPrimitive(getter.getReturnType())) // 下記の isPrimitive メソッドを参照
      {
        writeProperty(dcb,prop,bean); // 下記の writeProperty メソッドを参照
      }
      // 子プロパティについて再帰する
      Object child = getter.invoke(dcb,new Object[]{});
      if (child == null) continue;
      // 子が DConfigBean の場合、走査できる
      Class cc = child.getClass();
      if (!isPrimitive(cc)) {
        if (cc.isArray()) {
          Object[] cl = (Object[])child;
          for (int j=0;j<cl.length;j++) {
                   if (cl[j] instanceof DConfigBean) processBean((DConfigBean) cl[j]);
          }
        } else {
          if (child instanceof DConfigBean) processBean((DConfigBean) child);
        }
      }
    }
  }

   // プロパティにセッターがある場合はユーザ入力で呼び出す
     private void writeProperty(DConfigBean dcb, PropertyDescriptor prop, String bean)
    throws Exception {
    Method getter = prop.getReadMethod();
    Method setter = prop.getWriteMethod();
    if (setter != null) {
      PropertyEditor pe =
          PropertyEditorManager.findEditor(prop.getPropertyType());
      if (pe == null &&
String[].class.isAssignableFrom(getter.getReturnType())) pe = 
new StringArrayEditor();  // 下記の StringArrayEditor クラスを参照
      if (pe != null) {
        Object oldValue = getter.invoke(dcb,new Object[0]);
        pe.setValue(oldValue);
        String val =
 getUserInput(bean,prop.getDisplayName(),pe.getAsText());
        // 下記の getUserInput メソッドを参照
        if (val == null || val.length() == 0) return;
        pe.setAsText(val);
        Object newValue = pe.getValue();
        prop.getWriteMethod().invoke(dcb,new Object[]{newValue});
      }
    }
  }

  private String getUserInput(String element, String property, String curr) {
    try {
      System.out.println("Enter value for "+element+"."+property+". Current value is: "+curr);
      return br.readLine();
    } catch (IOException ioe) {
      return null;
    }
  }
  // Primitive とは、ここでは Java プリミティブまたは String 型のオブジェクトを意味する
  private  boolean isPrimitive(Class cc) {
    boolean prim = false;
    if (cc.isPrimitive() || String.class.isAssignableFrom(cc)) prim = true;
    if (!prim) {
      // プリミティブの配列 ?
      if (cc.isArray()) {
        Class ccc = cc.getComponentType();
        if (ccc.isPrimitive() || String.class.isAssignableFrom(ccc)) prim = true;
      }
    }
    return prim;
  }

  /**
   * String 配列用のカスタム エディタ。入力テキストは
   * カンマ区切りを使用してトークンに変換される
   */
  private class StringArrayEditor extends PropertyEditorSupport {
    String[] curr = null;

    public StringArrayEditor() {super();}

    // カンマ区切りの文字列
    public String getAsText() {
      if (curr == null) return null;
      StringBuffer sb = new StringBuffer();
      for (int i=0;i<curr.length;i++) {
        sb.append(curr[i]);
        sb.append(',');
      }
      if (curr.length > 0) sb.deleteCharAt(sb.length()-1);
      return sb.toString();
    }

    public Object getValue() { return curr; }

    public boolean isPaintable() { return false; }

    public void setAsText(String text) {
      if (text == null) curr = null;
      StringTokenizer st = new StringTokenizer(text,",");
      curr = new String[st.countTokens()];
      for (int i=0;i<curr.length;i++) curr[i] = new String(st.nextToken());
    }

    public void setValue(Object value) {
      if (value == null) {
        curr = null;
      } else {
        String[] v = (String[])value; // 呼び出し側にクラス キャストの問題を処理させる
        curr = new String[v.length];
        for (int i=0;i<v.length;i++) curr[i] = new String(v[i]);
      }
    }
  }
.
.
.

管理者またはユーザがコンフィグレーションを変更できるあらゆるインタフェースでは、基礎的なユーザ インタフェースの仕組みを超えてプロパティのセッターが使用されます。コード リスト 3-3 を参照してください。

Target

Target は WebLogic Server、クラスタ、Web サーバ、仮想ホスト、および JMS サーバに関連付けられます。詳細については、「weblogic.deploy.api.spi.WebLogicTarget」および「WebLogic 対象の種類のクエリ サポート」を参照してください。

アプリケーションの命名

WebLogic Server では、アプリケーションの名前をデプロイメント ツールで指定します。アプリケーションに格納されているモジュールの名前は、関連付けられているアーカイブ名またはモジュールのルート ディレクトリ名に基づきます。これらの名前は、アプリケーション用に構築されたコンフィグレーション MBeans に保持されます。

J2EE デプロイメントでは、アプリケーションやその構成要素のモジュールにコンフィグレーションされる名前について、TargetModuleID オブジェクト以外には特に規定されていません。しかし、TargetModuleID は、WebLogic Server ドメインに配布済みのアプリケーションにのみ存在するものです。そのため、配布する前にデプロイメント ツールでアプリケーションおよびモジュールの名前を表現する必要があります。この表現は、最終的にアプリケーションが配布されるときにサーバによって割り当てられる名前と一致している必要があります。

デプロイメント ツール プラグインでは、DeployableObject クラスおよび J2eeApplicationObject クラスを通じて、アプリケーションの一覧を構築する必要があります。これらのクラスはそれぞれスタンドアロン モジュールと EAR を表します。各々のクラスが DDBeanRoot オブジェクトと直接関係しています。名前がコンフィグレーションされていない配布を提示する場合、デプロイメント ツールで配布の名前を作成する必要があります。配布されるのが File オブジェクトである場合、その配布のファイル名を使用します。アーカイブが入力ストリームとして提供された場合、ルート モジュールにはランダムな名前が使用されます。

デプロイメント準備

デプロイメント準備フェーズでは、コンフィグレーション セッションから生成されたプランを保存します。これは、DeploymentConfiguration.save() メソッド (標準 J2EE Deployment API のメソッド) によって行われます。この作業に SessionHelper.savePlan() メソッドを使用できます。この場合デプロイメント プランの新しいコピーが、プラン ディレクトリにあるすべての外部ドキュメントと共に保存されます。

DeploymentConfiguration.save メソッドでは、デプロイメント プランのスキーマに基づいて XML ファイルが作成されます。このファイルは、現在の DConfigBean の集合のシリアライゼーション、およびすべての変数割り当てと定義で構成されます。DConfigBean ツリーは常に外部の記述子として保存されます。この記述子は、アプリケーションのアーカイブまたは外部コンフィグレーション領域にまだ存在していない場合にのみ保存されます。すなわち、保存操作では既存の記述子は上書きされません。一方、DeploymentConfiguration.saveDConfigBean メソッドではファイルが上書きされます。これは、コンフィグレーションに行ったすべての変更が失われるということではありません。変更は変数割り当てを使用して処理されます。

前述したように、DeploymentConfiguration.restore メソッドは前もって保存されたデプロイメント プランに基づくコンフィグレーション Bean を作成するために使用されます (「フロントエンド コンフィグレーションの実行」を参照)。コンフィグレーション Bean はその全集合を復元することも、一部のみを復元することもできます。また、アプリケーション内の特定モジュールのコンフィグレーション Bean を保存したり復元したりすることも可能です。

セッションのクリーンアップ

コンフィグレーション セッション中には一時的なファイルが作成され、一時領域にはアーカイブが展開されます。そうしたファイルはセッションの完了後にのみ削除できます。セッションをクローズするために定義された標準の API はありません。WebLogicDeployableObjectWebLogicDeploymentConfiguration に対しては close() メソッドを使用します。SessionHelper.close() を使用するとセッションの完了後にクリーンアップできます。セッションのクローズ後にクリーンアップしないと、時間が経過すると一時ディレクトリのディスクがいっぱいになる可能性があります。