Oracle® Fusion Middleware WebLogic Deployment APIによるアプリケーションのデプロイ 12c (12.2.1) E69987-01 |
|
![]() 前 |
![]() 次 |
この章では、デプロイメント記述子を使用してWebLogic Serverインスタンスへのデプロイメント用のアプリケーションまたはデプロイ可能なリソースを構成する方法について説明します。これらの記述子の一部の要素は外部オブジェクトを参照し、サーバー・ベンダーに応じて特別な処理が必要なものもあります。WebLogic Serverでは、記述子を拡張したWebLogic Server固有のデプロイメント記述子を使用します。標準の記述子とWebLogic Server記述子とのマッピングはDDBeans
およびDConfigBeans
を介して管理されます。
この章の内容は以下のとおりです。
この項では、デプロイするアプリケーションの構成を行うために、デプロイメント・ツールで行う必要がある基本的な手順について説明します。
アプリケーション評価 - アプリケーション・ファイルを検査および評価して、アプリケーションの構造と埋込み記述子の内容を決定します。
WebLogicDeploymentManager
を取得することでデプロイメント・セッションを初期化します。「アプリケーション評価」を参照してください。
WebLogicJ2eeApplicationObject
またはWebLogicDeployableObject
を作成して、エンタープライズ・アプリケーション(Enterprise Application: EAR)またはスタンドアロン・モジュール(WAR、EAR、RARまたはCAR)のJava EE構成を表します。オブジェクトはEARの場合、子オブジェクトが生成されます。http://jcp.org/en/jsr/detail?id=88
のJava EEデプロイメントAPI標準(JSR-88)および「デプロイ可能なオブジェクトの作成」を参照してください。
フロントエンド構成 - アプリケーションに埋め込まれている情報に基づいて構成情報を作成します。この情報には、WebLogic Server記述子、デフォルト、ユーザー定義によるデプロイメント・プランなどがあります。
WebLogicDeploymentConfiguration
オブジェクトを作成して、アプリケーションのWebLogic Server構成を表現します。これは、このオブジェクトのデプロイメント・プランを作成するための最初のステップです。「デプロイメント構成」を参照してください。
既存のデプロイメント・プランを利用できる場合は、そのデプロイメント・プランから既存のWebLogic Server構成の値を復元します。「フロントエンド構成の実行」を参照してください。
デプロイメント構成 - ユーザー入力および選択されたWebLogic Serverターゲットに基づいて、個別のWebLogic Server構成の値を変更します。
デプロイメント・ツールには、ユーザー入力および選択するWebLogic Serverターゲットに基づいて、個々のWebLogic Server構成の値を変更する機能が必要です。「デプロイメント構成のカスタマイズ」を参照してください。
デプロイメントの準備 - 最終的なデプロイメント・プランを生成し、クライアント側でアプリケーションを事前に検証します。
デプロイメント・ツールには、変更したWebLogic Server構成情報を、新しいデプロイメント・プランまたは既存のデプロイメント・プランの変数定義に保存する機能が必要です。
次の項では、構成情報の種類、表現方法、およびJava EE記述子とWebLogic Server記述子の関係に関する基本情報について説明します。
アプリケーションのJava EE構成では、アプリケーションの基本的なセマンティクスと実行時の動作、またアプリケーションの機能に必要な外部リソースを定義します。この構成情報は、アプリケーションに関連付けられた標準Java EEデプロイメント記述子ファイルに格納されます。表3-1は、この記述子ファイルの一覧です。
表3-1 標準Java EEデプロイメント記述子
アプリケーションまたはスタンドアロン・モジュール | Java EE記述子 |
---|---|
エンタープライズ・アプリケーション |
|
Webアプリケーション |
|
Enterprise JavaBeans |
|
リソース・アダプタ |
|
クライアント・アプリケーション・アーカイブ |
|
あらゆるアプリケーション構成セッションには、完全で有効なJava EEデプロイメント記述子の入力が必須です。
Java EE構成でアプリケーションの基本的な動作が判断するため、Java EE記述子は通常アプリケーションのデプロイメント・フェーズ中にのみ定義され、アプリケーションが後に別の環境にデプロイされる際にも変更されません。たとえば、テスト用ドメインまたは本番用ドメインにアプリケーションをデプロイする場合、アプリケーションの動作は(したがってそのJava EE構成も)そのアプリケーションをデプロイメント・ドメインにデプロイしたときと同じ状態のままです。詳細は、「フロントエンド構成の実行」を参照してください。
WebLogic Server記述子では、拡張機能、外部リソースの解決、およびアプリケーション・セマンティクスに関連するチューニングが規定されます。この記述子はアプリケーションに埋め込まれていても埋め込まれていなくてもかまいません。アプリケーションのWebLogic Server構成では、以下のことができます。
外部リソース名をJava EEデプロイメント記述子のリソースの定義にバインドして、特定のWebLogic Serverドメインでアプリケーションが機能できるようにする
アプリケーション・コンテナのチューニング・パラメータを定義する
Java EEアプリケーションおよびスタンドアロン・モジュールに拡張機能を提供する
WebLogic Server構成の属性および値は、WebLogic Serverデプロイメント記述子ファイルに格納されます。これについて、表3-2に示します。
表3-2 WebLogic Serverデプロイメント記述子
アプリケーションまたはスタンドアロン・モジュール | WebLogic Server記述子 |
---|---|
エンタープライズ・アプリケーション |
|
Webアプリケーション |
|
Enterprise JavaBeans |
|
リソース・アダプタ |
|
クライアントのアーカイブ |
|
様々なWebLogic Serverドメインでアプリケーションに対して色々な種類の外部リソースや多様なレベルのサービスが提供されるため、アプリケーションのWebLogic Server構成は、通常そのアプリケーションが新しい環境にデプロイされる際に変更されます。たとえば、本番ステージング・ドメインにはデプロイメント・ドメインとは異なるデータベース・ベンダーが採用されていたり、より使用に適したメモリーが用意されていたりする場合があります。そのため、アプリケーションをデプロイメントからステージング・ドメインに移動する際には、新しいデータベース接続や利用可能なメモリーを使用できるようにするために、アプリケーションのWebLogic Server記述子の値を更新する必要があります。
デプロイメント構成ツールの主な仕事は、アプリケーションのWebLogic Server構成を、選択したWebLogicターゲットに対して確実に有効なものにすることです。
Java EEデプロイメント記述子と利用可能なすべてのWebLogic Server記述子の両方が、アプリケーションの構成プロセスへの入力として使用されます。デプロイメントAPIを使用して、Java EE構成およびWebLogic Server構成の両方をJavaオブジェクトとして表現します。
アプリケーションのJava EE構成は、EARの場合WebLogicJ2eeApplicationObject
を、スタンドアロン・モジュールの場合WeblogicDeployableObject
を作成することにより取得されます。(WebLogicJ2eeApplicationObject
には、EARにある個々のモジュールを表現する複数のDeployableObject
インスタンスが含まれています)。
各WebLogicJ2eeApplicationObject
またはWeblogicDeployableObject
にはDDBeanRoot
があり、これが対応するJava EEデプロイメント記述子ファイルを表しています。EARおよびモジュールのJava EE記述子のプロパティは、DDBeanRoot
の下にある1つ以上のDDBean
オブジェクトで表されます。DDBean
コンポーネントには、デプロイメント記述子の個々のプロパティ、値、およびネストされた記述子要素のそれぞれにアクセスする標準のゲッター・メソッドが備わっています。
DDBeans
はjavax.enterprise.deploy.model
パッケージに記述されています。このオブジェクトでは標準デプロイメント記述子の要素に対する一般的なインタフェースが提供されますが、標準記述子の基本的な形式に従う任意のXMLファイルへのアクセス用にXPathベースのメカニズムとしても使用できます。そのようなファイルの例には、WebLogic Server記述子やWebサービス記述子があります。
記述子のDDBean
表現はDDBeans
のツリー構造で、専用のDDBean
が使用され、ツリーのルートには、DDBeanRoot
があります。DDBeans
には、それらが表現する記述子要素の要素名、ID属性、ルートおよびテキストに対するアクセサが用意されています。
アプリケーションのDDBean
はモデル・プラグインによって導入されます。モデル・プラグインはjavax.enterprise.deploy.model
のツール・プロバイダ実装です。アプリケーションは、DeployableObject
インタフェースで表現されます。このインタフェースのWebLogic Server実装はpublicクラスweblogic.deploy.api.model.WebLogicDeployableObject
です。WebLogic Serverベースのデプロイメント・ツールで、アプリケーションのWebLogicDeployableObject
オブジェクトのインスタンスをcreateDeployableObject
ファクトリ・メソッドを介して取得します。その結果、アプリケーションのDDBean
ツリーが作成されて、アプリケーションに埋め込まれたJava EE記述子の要素により内容が設定されます。アプリケーションがEARの場合、複数のWebLogicDeployableObject
オブジェクトが作成されます。ルートのWebLogicDeployableObject
はWebLogicJ2eeApplicationObject
として拡張され、これがEARモジュールを表します。その子WebLogicDeployableObject
インスタンス群がアプリケーションに含まれるモジュール群(WAR、EJB、RAR、CARなど)を表します。
Java EE記述子とWebLogic Server記述子は外部リソースの構成において直接的に関連しています。Java EE記述子にはアプリケーションが機能するために必要なリソースの種類を定義しますが、実際に使用するリソース名は特定しません。WebLogic Server記述子の方で、そのJava EE記述子内のリソース定義名をターゲット・ドメインの実際のリソース名にバインドします。
外部リソースのバインドは、構成プロセスに必須のプロセスです。リソースをターゲット・ドメインにバインドすることで、確実にアプリケーションでリソースを見つけ、正しくデプロイできるようになります。
Java EE記述子とWebLogic Server記述子は、WebLogic Serverのチューニング・パラメータの構成においても間接的に関連しています。標準Java EE記述子の要素に対してWebLogic Serverでチューニング・パラメータを設定する必要はありませんが、個々の記述子ファイルの存在によって、どのチューニング・パラメータがアプリケーションの構成時に重要なのかが分かります。たとえば、ejb.xml
記述子にWebLogic Server EJBコンテナのチューニングに関連する要素が含まれていなくても、ejb.xml
がJava EE構成にあることで、デプロイメントの前にチューニング・プロパティを構成できることが分かります。
DConfigBean
(構成Bean)は、サーバーの構成要件をデプロイメント・ツールに伝達するために使われるオブジェクトです。また、デプロイメント・プランの作成には主にここからの情報が使用されます。構成BeanはJava Beanであり、このBeanのプロパティは参照できます。また、それらには基本的なプロパティ編集機能もあります。
DConfigBean
は、埋め込まれたWebLogic Server記述子とデプロイメント・プランの情報、およびIDEデプロイメント・ツールからの入力によって作成されます。
DConfigBean
は、アプリケーションの依存関係に関連付けられるすべてのWebLogic記述子要素に対して作成できます。記述子はアプリケーションで利用可能なリソースが記述されるエンティティで、サーバーで指定されるJNDI名で表されます。
記述子は、構成セッションの設定時に型付きのBeanツリーとしてメモリーに解析されます。DConfigBean
実装クラスはWebLogic Server記述子Beanに委任します。依存関係にあるプロパティ(リソース参照など)を持つBeanのみがDConfigBean
を持ちます。記述子のルートには常にDConfigBeanRoot
があります。
Beanのプロパティへのアクセサでは、構成が必要な要素については子DConfigBean
が、構成不要の要素については記述子Beanが返されます。プロパティへのアクセサでは記述子Beanからのデータが返されます。
Beanのプロパティを変更すると、プランがオーバーライドされます。既存の記述子に対するプランのオーバーライドは、変数の割当によって処理されます。関連するWebLogic Server記述子がアプリケーションにない場合、記述子が自動的に作成されて外部プラン・ディレクトリに配置されます。外部デプロイメント記述子の場合、記述子が直接変更されます。埋込み記述子はディスク上では変更されません。
アプリケーション評価では、アプリケーション用のデプロイメント・マネージャおよびデプロイ可能なオブジェクト・コンテナを取得します。次の手順に従います。
デプロイメント・ファクトリ・クラスを名前にweblogic.deployer.spi.factories.internal.DeploymentFactoryImpl
を指定して取得します。
ファクトリ・クラスをjavax.enterprise.deploy.spi.DeploymentFactoryManager
インスタンスに登録します。
次に例を示します。
Class WlsFactoryClass = Class.forname("weblogic.deployer.spi.factories.internal.DeploymentFactoryImpl"); DeploymentFactory myDeploymentFactory = (DeploymentFactory) WlsFactoryClass.newInstance(); DeploymentFactoryManager.getInstance().registerDeploymentFactory(myDeploymentFactory);
次の項では、デプロイメント・マネージャを取得する方法について説明します。
WebLogic Serverにはjavax.enterprise.deploy.spi.DeploymentManager
の実装が1つ用意されていますが、この実装はファクトリから取得したクラスの初期化時に指定するURI
によって動作が異なります。そのためWebLogic Serverには、基本的なデプロイメント・マネージャが2種類あります。
切断されたデプロイメント・マネージャには、WebLogic Serverインスタンスへの接続がありません。リモート・クライアント・マシン上のアプリケーションを構成するために、切断されたデプロイメント・マネージャを使用します。それをデプロイメント操作を実行するために使用することはできません。(たとえば、デプロイメント・ツールは切断されたデプロイメント・マネージャを使用してアプリケーションを配布することはできません。)
接続されたデプロイメント・マネージャには、WebLogic Serverドメイン用の管理サーバーへの接続があり、デプロイメント・ツールにより、アプリケーションの構成およびデプロイの両方に使用できます。
接続されたデプロイメント・マネージャは、管理サーバーのローカルに存在するか、あるいは管理サーバーに接続されたリモート・マシンで動作しているかによってさらに分類されます。ローカルまたはリモートの分類によって、ファイル参照が管理サーバーに対してローカルとして扱われるかリモートとして扱われるかが決まります。
表3-3に、デプロイメント・マネージャのタイプをまとめます。
WebLogicDeploymentFactory
から取得した各DeploymentManager
では、WebLogic Server拡張がサポートされます。デプロイメント・ツールを作成する場合、デプロイメント・ファクトリのインスタンスにある適切なメソッドを呼び出し、必要な種類のデプロイメント・マネージャについて記述されているweblogic.deployer.spi.factories.WebLogicDeploymentFactory
に定義された文字列定数を指定して、特定の種類のデプロイメント・マネージャを取得します。接続されたデプロイメント・マネージャで管理サーバーへの接続を取得するためには、有効なサーバーのURI
と資格証明をメソッドに渡す必要があります。
表3-4に、各種のデプロイメント・マネージャを取得する際に使用するメソッド・シグネチャと定数についてまとめます。
表3-4 WebLogic Serverデプロイメント・マネージャを取得するための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
ヘルパー・クラスでは、例 3-1にあるように手動でデプロイメント・ファクトリを作成および登録せずに、簡単にデプロイメント・マネージャを取得できるようにするための便利なメソッドが複数提供されています。切断されたデプロイメント・マネージャを取得するために必要なSessionHelper
のコードは以下の1行のみです。
DeploymentManager myDisconnectedManager = SessionHelper.getDisconnectedDeploymentManager();
SessionHelper
を使用して接続されたデプロイメント・マネージャを取得することもできます。以下に例を示します。
DeploymentManager myConnectedManager = SessionHelper.getDeploymentManager("adminhost", "7001", "weblogic", "weblogic"));
このメソッドでは、管理サーバー(adminhost
)へのリモート接続を前提にしています。SessionHelpeの詳細は、「Javadocs」
を参照してください。
以下の節では、デプロイ可能なオブジェクトを作成する方法について説明します。このオブジェクトは、デプロイメント・ツールでアプリケーションをデプロイするのに使用されるコンテナになります。デプロイメント・マネージャの取得によって構成セッションを初期化したら、デプロイメント・ツールで使用するデプロイ可能なオブジェクトを次のいずれかの方法で作成します。
直接的なアプローチでは、modelパッケージのWebLogicDeployableObject
クラスを次のように使用します。
WebLogicDeployableObject myDeployableObject = WebLogicDeployableObject.createWebLogicDeployableObject("myAppFileName");
デプロイ可能なオブジェクトが作成されたら、アプリケーションのデプロイメント構成を作成できます。
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
はデプロイメント・プランのオブジェクト表現を提供します。DeploymentConfiguration
はDeploymentManager.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(); . . . // Assumes app is a Web app. public void initializeConfig(File app) throws Throwable { /** * Init the wrapper for the DDBeans for this module. This example assumes * it is using the WLS implementation of the model api. */ dObject= WebLogicDeployableObject.createDeployableObject(app); //Get basic configuration for the module dConfig = dm.createConfiguration(dObject); /** * At this point the DeployableObject is populated. Populate the * DeploymentConfigurationbased on its content. * We first ask the DeployableObject for its root. */ DDBeanRoot root = dObject.getDDBeanRoot(); /** * The root DDBean is used to start the process of identifying the * necessary DConfigBeans for configuring this module. */ System.out.println("Looking up DCB for "+root.getXpath()); DConfigBeanRoot rootConfig = dConfig.getDConfigBeanRoot(root); collectConfigBeans(root, rootConfig); /** * The DeploymentConfiguration is now initialized, although not necessarily * completely setup. */ FileOutputStream fos = new FileOutputStream("test.xml"); dConfig.save(fos); } // bean and dcb are a related DDBean and DConfigBean. private void collectConfigBeans(DDBean bean, DConfigBean dcb) throws Throwable{ DConfigBean configBean; DDBean[] beans; if (dcb == null) return; /** * Maintain some sort of mapping between DDBeans and DConfigBeans * for later processing. */ beanMap.put(bean,dcb); /** * The config bean advertises xpaths into the web.xml descriptor it * needs to know about. */ String[] xpaths = dcb.getXpaths(); if (xpaths == null) return; /** * For each xpath get the associated DDBean and collect its associated * DConfigBeans. Continue this recursively until we have all DDBeans and * DConfigBeans collected. */ for (int i=0; i<xpaths.length; i++) { beans = bean.getChildBean(xpaths[i]); for (int j=0; j<beans.length; j++) { /** * Init the DConfigBean associated with each DDBean */ System.out.println("Looking up DCB for "+beans[j].getXpath()); configBean = dcb.getDConfigBean(beans[j]); collectConfigBeans(beans[j], configBean); } }
このサンプルでは単にDDBean
ツリーを反復処理して、インスタンス化される各DDBean
のDConfigBean
をリクエストしています。
DeploymentConfiguration
オブジェクトはDeploymentConfiguration.save()
を使用するとデプロイメント・プランとして永続化できます。デプロイメント・ツールを使用すると、デプロイメント・プランをゼロから作成する代わりに、保存されているデプロイメント・プランをDeploymentConfiguration
オブジェクトにインポートすることもできます。DeploymentConfiguration.restore()
を使用するとこの機能を実現できます。これにより、アプリケーションのデプロイメント・プランのリポジトリを保持して、そこに様々な環境に適用できる様々なデプロイメント・プランを格納するという手法がサポートされます。
同様に、以前の構成セッションからリポジトリに保存された部分的なプランをつなぎ合わせてDeploymentConfiguration
を構成することもできます。部分的なプランは、DConfigBean
ツリーのmodule-rootにマップされます。DeploymentConfiguration.saveDConfigBean()
およびDeploymentConfiguration.restoreDConfigBean()
を使用すると、この機能を実現できます。
アプリケーションのWebLogic Server記述子の解析は、DeploymentConfiguration
が作成されるときに自動的に行われます。記述子は最新のスキーマに準拠しているのが理想的です。WebLogic Server 8.1以前のDTDに基づく記述子が含まれる古いアプリケーションの場合、変換が実行されます。古い記述子はサポートされてはいますが、デプロイメント・プランを使用して変更することはできません。そのため、あらゆるDOCTYPE宣言をネーム・スペースの参照に変換する必要があります。また、要素に固有の変換も必ず実施します。
SessionHelper.initializeConfiguration
では、アプリケーション内のすべての標準記述子およびWebLogic Server記述子が処理されます。
initializeConfiguration
を呼び出す前に、SessionHelper.setPlan()
メソッドを使用して既存のデプロイメント・プランをアプリケーションに関連付けるように指定できます。プランが設定されている場合、DeploymentConfiguration.restore()
メソッドでデプロイメント・プランを読み取ることもできます。さらに、プランを設定するとDeploymentConfiguration.initializeConfiguration()
メソッドで自動的に構成情報を復元することも可能です。
SessionHelper
クラスで構成セッションを開始する場合、以下に例示するようにデプロイメント・プランの情報をdeploymentConfiguration
に入力して簡単に開始できます。
DeploymentManager dm = SessionHelper.getDisconnectedDeploymentManager(); SessionHelper helper = SessionHelper.getInstance(dm); // specify location of archive helper.setApplication(app); // specify location of existing deployment plan helper.setPlan(plan); // initialize the configuration session helper.initializeConfiguration(); DeploymentConfiguration dc = helper.getConfiguration();
上記のコードでは、デプロイメント構成およびそれに関連付けられるWebLogicDDBeanTree
が生成されます。
構成の検証は、ほとんどの場合、アプリケーションの記述子が処理される際に行われる記述子の解析中に発生します。検証では、記述子が有効なXMLドキュメントかどうか、また記述子が各自のスキーマに準拠しているかどうかが確認されます。
デプロイメント構成のカスタマイズ・フェーズでは、ユーザー入力と選択したWebLogic Serverターゲットに基づいて、個々のWebLogic Server構成の値を変更します。
この段階の構成は、記述子またはアプリケーションに関連付けられた既存のプランとほとんど同様です。DConfigBean
はJava Beanとして設計されていて内部を参照できるため、ツールでその内容を意味のある形式で提示できます。DConfigBean
のプロパティは、そのほとんどが構成可能です。また、主要なプロパティ(一意なもの)も公開されます。セッターについては、安全に変更できるプロパティに関するもののみが公開されます。一般的に、アプリケーションの動作が記述されるプロパティは変更できません。すべてのプロパティには記述子スキーマで定義されている型が指定されています。
プロパティのゲッターからは下位要素のDConfigBean
、DConfigBean
の配列、記述子Bean、記述子Beanの配列、単純な値(プリミティブおよびjava.lang
オブジェクト)、または単純な値の配列が返されます。記述子Beanでは、変更可能だがDConfigBean
の機能を必要としない記述子要素が表現されます。たとえば、記述子Beanに直接関連している標準記述子要素はありません。構成の編集は、プロパティのセッターを呼び出すことにより行われます。
Java JSR-88のDConfigBean
クラスを使用すると、ツールからgetDConfigBean(DDBean)
メソッドまたは内部参照を利用してBeanにアクセスできます。アプリケーションのDeployableObject
内のDDBean
に基づいて標準記述子を提示し、各DDBean
の構成(そのDConfigBean
)に直接アクセスするツールでは、前者のアプローチが便利です。このアプローチでは、アプリケーションに指定されている可能性のある必須リソース要件の構成が提供されます。内部参照でのアプローチでは、ツールでアプリケーション全体の構成を提示できますが、必須のリソース要件が強調されるとは限りません。
内部参照は両方のアプローチにおいて記述子のプロパティを提示または変更するために必要になります。異なるのはツールでの情報の提示方法です。
標準記述子の内容
WebLogic Server記述子の内容
構成情報を変更するシステムには、変更を要求するためのユーザー・インタフェースを含める必要があります。例 3-3を参照してください。
例 3-3 構成情報を変更するためのサンプル・コード
. . . // Introspect the DConfigBean tree and ask for input on properties with setters private void processBean(DConfigBean dcb) throws Exception { if (dcb instanceof DConfigBeanRoot) { System.out.println("Processing configuration for descriptor: "+dcb.getDDBean().getRoot().getFilename()); } // get property descriptor for the 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]; // only allow primitives to be updated Method getter = prop.getReadMethod(); if (isPrimitive(getter.getReturnType())) // see isPrimitive method below { writeProperty(dcb,prop,bean); //see writeProperty method below } // recurse on child properties Object child = getter.invoke(dcb,new Object[]{}); if (child == null) continue; // traversable if child is a 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); } } } } // if the property has a setter then invoke it with user input 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(); // see StringArrayEditor class below if (pe != null) { Object oldValue = getter.invoke(dcb,new Object[0]); pe.setValue(oldValue); String val = getUserInput(bean,prop.getDisplayName(),pe.getAsText()); // see getUserInput method below 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 means a java primitive or String object here private boolean isPrimitive(Class cc) { boolean prim = false; if (cc.isPrimitive() || String.class.isAssignableFrom(cc)) prim = true; if (!prim) { // array of primitives? if (cc.isArray()) { Class ccc = cc.getComponentType(); if (ccc.isPrimitive() || String.class.isAssignableFrom(ccc)) prim = true; } } return prim; } /** * Custom editor for string arrays. Input text is converted into tokens using * commas as delimiters */ private class StringArrayEditor extends PropertyEditorSupport { String[] curr = null; public StringArrayEditor() {super();} // comma separated string 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; // let caller handle class cast issues curr = new String[v.length]; for (int i=0;i<v.length;i++) curr[i] = new String(v[i]); } } } . . .
管理者またはユーザーが構成を変更できるあらゆるインタフェースでは、基礎的なユーザー・インタフェースの仕組みを超えてプロパティのセッターが使用されます。例 3-3を参照してください。
TargetはWebLogic Server、クラスタ、Webサーバー、仮想ホスト、およびJMSサーバーに関連付けられています。詳細は、「weblogic.deploy.api.spi.WebLogicTarget」
および「WebLogicターゲット・タイプの問合せサポート」を参照してください。
WebLogic Serverでは、アプリケーションの名前をデプロイメント・ツールで指定します。アプリケーションに格納されているモジュールの名前は、関連付けられているアーカイブ名またはモジュールのルート・ディレクトリ名に基づきます。これらの名前は、アプリケーション用に構築された構成MBeans
に保持されます。
Java EEデプロイメントでは、アプリケーションやその構成要素のモジュールに構成される名前について、TargetModuleID
オブジェクト以外には特に規定されていません。しかし、TargetModuleID
は、WebLogic Serverドメインに配布済みのアプリケーションにのみ存在するものです。そのため、配布する前にデプロイメント・ツールでアプリケーションおよびモジュールの名前を表現する必要があります。この表現は、最終的にアプリケーションが配布されるときにサーバーによって割り当てられる名前と一致している必要があります。
デプロイメント・ツール・プラグインでは、DeployableObject
クラスおよびJ2eeApplicationObject
クラスを通じて、アプリケーションの一覧を構築する必要があります。これらのクラスはそれぞれスタンドアロン・モジュールとEARを表します。各々のクラスがDDBeanRoot
オブジェクトと直接関係しています。名前が構成されていない配布を提示する場合、デプロイメント・ツールで配布の名前を作成する必要があります。配布されるのがFile
オブジェクトである場合、その配布のファイル名を使用します。アーカイブが入力ストリームとして提供された場合、ルート・モジュールにはランダムな名前が使用されます。
デプロイメント準備フェーズでは、構成セッションから生成されたプランを保存します。これは、DeploymentConfiguration.save()
メソッド(標準Java EEデプロイメントAPIのメソッド)によって行われます。この作業にSessionHelper.savePlan()
メソッドを使用できます。この場合デプロイメント・プランの新しいコピーが、プラン・ディレクトリにあるすべての外部ドキュメントと共に保存されます。
DeploymentConfiguration.save
メソッドでは、デプロイメント・プランのスキーマに基づいてXMLファイルが作成されます。このファイルは、現在のDConfigBean
の集合のシリアライゼーション、およびすべての変数割当てと定義で構成されます。DConfigBean
ツリーは常に外部の記述子として保存されます。この記述子は、アプリケーションのアーカイブまたは外部構成領域にまだ存在していない場合にのみ保存されます。すなわち、保存操作では既存の記述子は上書きされません。一方、DeploymentConfiguration.saveDConfigBean
メソッドではファイルが上書きされます。これは、構成に行ったすべての変更が失われるということではありません。変更は変数割当てを使用して処理されます。
前述したように、DeploymentConfiguration.restore
メソッドは前もって保存されたデプロイメント・プランに基づく構成Beanを作成するために使用されます(「フロントエンド構成の実行」を参照)。構成Beanはその全集合を復元することも、一部のみを復元することもできます。また、アプリケーション内の特定モジュールの構成Beanを保存したり復元したりすることも可能です。
構成セッション中には一時ファイルが作成されます。アーカイブは一時領域に展開され、セッション構成の完了後にのみ削除できます。セッションをクローズするために定義された標準のAPIはありません。WebLogicDeployableObject
とWebLogicDeploymentConfiguration
に対してはclose()
を使用します。SessionHelper.close()
を使用するとセッションの完了後にクリーン・アップできます。セッションのクローズ後にクリーン・アップしないと、時間が経過すると一時ディレクトリのディスクがいっぱいになる可能性があります。