Eclipse WTPとOracle Application Server 10gの連携

日本オラクル株式会社
システム製品統括本部 - Fusion Middleware技術本部 - Java技術部
橋本 亨

オラクル入社前、J2EEアプリケーションの設計、開発を担当していました。
オラクル入社後、J2EEアプリケーションの設計、開発を担当するパートナー企業様向けの技術支援を担当しています。

第2回:Eclipse + WTP + スタンドアロンOC4Jでつくるデータベース接続アプリケーションとOC4Jのデプロイツール利用方法

概要  

第1回目で、Eclipse、WTP、スタンドアロンOC4Jを使用してJ2EE統合開発環境を構築し、簡単なJ2EEアプリケーションの開発・実行をおこなうまでの手順を紹介しました。
今回は、第1回目で構築した環境を利用し、データベース接続アプリケーションを作成するために必要な手順や、OC4Jで提供している各種デプロイツールを利用したアプリケーションのデプロイ方法などを紹介します。
なお、今回作成するサンプル・アプリケーションでは、Oracle Database 10g Release 2 (10.2.0) に付属のSCOTTスキーマを利用しますので事前にSCOTTスキーマを構成する必要があります。

インデックスに戻る

データベース接続アプリケーションの作成手順  

OC4J上でデータベース接続アプリケーションを動作させるためには、あらかじめ接続プールとデータソースを設定しておく必要があります。ここでは「Application Server Control(AS Control)」と呼ばれるOC4J管理用アプリケーションで接続プールとデータソースの設定を行い、データベースにアクセスするサンプル・プログラムで動作確認する手順を示します。

接続プールとデータソースの設定

AS Controlは、OC4Jインストール時にhomeインスタンス上にデプロイされるJ2EEアプリケーションで、ファイルの実体は下記です。

「%ORACLE_HOME%\j2ee\home\applications\ascontrol.ear」

AS ControlにアクセスするためにはOC4Jが起動している必要があります。
Eclipse上でスタンドアロンOC4Jを起動し、次のようにサーバーの状況が「始動済み」となっていることを確認し、ブラウザからURL(htt://host:port/em)でアクセスします。

ログイン画面が表示されたら、ユーザー名とパスワードを入力して「ログイン」ボタンを押します。ここで入力するパスワードはスタンドアロンOC4Jの初回起動時に設定したパスワードです。

OC4Jのサーバー設定をおこなうには「管理」リンクをクリックします。

サーバーの管理タスクがツリー表示されたら、「JDBCリソース」の「タスクに移動」アイコンを押します。ここで接続プールやデータソース設定をおこないます。

設定手順は接続プールの作成、データソースの作成の順番となります。
「接続プール」の「作成」ボタンを押します。

(注)OC4Jインストール時にデフォルトで構成されているサンプル接続プールやサンプル・データソースは、画面右部の「削除」アイコンから削除することができます。

「アプリケーション」に「default」を選択し、「接続プール・タイプ」に「新規接続プール」を選択してから画面右部の「続行」ボタンを押します。

(参考)OC4Jの接続プール

OC4Jでは、接続プールを次の2通りの方法で構成することができます。

  1. OC4Jインスタンス単位に構成する方法(開発時の推奨)
    • アプリケーションに「default」を選択
    • 設定された接続プールやデータソースは、OC4Jインスタンスにデプロイされたすべてのアプリケーションから利用可能
  2. アプリケーション単位に構成する方法
    • アプリケーションに「default」を選択
    • 設定された接続プールやデータソースは他のアプリケーションから利用不可能

今回は、開発環境用ということで、接続プールをOC4Jインスタンス単位に構成しています(Eclipseでのアプリケーション開発プロセスは、アプリケーションのデプロイとアンデプロイを繰り返しおこないます。アプリケーション単位に設定した接続プールはアプリケーションのアンデプロイ時に削除されます)。

(参考)「default」アプリケーション

OC4Jのクラスローダは階層構造になっています。OC4Jインスタンスにデプロイするアプリケーションはクラスローダ上の親子関係を構成します。OC4Jインスタンスにデプロイするアプリケーションは、デフォルトで「default」アプリケーションが親アプリケーションとなり、「default」アプリケーションのクラスローダがロードしたクラスを参照することができます。OC4Jで実装されているクラスローダ・アーキテクチャの詳細については下記ドキュメントを参照してください。

(参考ドキュメント) Oracle Containers for J2EE開発者ガイド10g(10.1.3.1.0)

接続プールを設定するために必要な情報を入力したら「終了」ボタンを押します(このページの「属性」リンクではコネクションプールの最大接続数等のパラメータ設定をおこなうことができます)。

*がついている項目は必須入力項目です。
※ コネクション・ファクトリ・クラス「oracle.jdbc.pool.OracleDataSource」のクラスは%ORACLE_HOME%\jdbc\lib\ojdbc14dms.jarにあります。このjarファイルはOC4Jの共有ライブラリ(oracle.jdbc)としてデフォルト登録されています。 旧バージョンOracle JDBCドライバを利用する方法や、その他共有ライブラリの設定方法等の詳細については下記ドキュメントを参照してください。
(参考ドキュメント) Oracle Containers for J2EE開発者ガイド10g(10.1.3.1.0)

作成した接続プールは、AS Control上で接続テストをおこなうことができます。
接続テストをおこなうには画面右部の「接続テスト」ボタンを押します。

接続テスト画面では、テスト用に適当なSQL文を入力して「テスト」ボタンを押します。

接続テストに成功した場合は、次のようなメッセージが表示されます。

接続プールの作成が完了したら、次にデータソースを作成します。
データソースの「作成」ボタンを押します。

OC4Jインスタンス単位にデータソースを設定しますので、アプリケーションは「default」を選択し、データソース・タイプは「マネージド・データソース」を選択して「続行」ボタンを押します。

(参考)OC4Jのデータソース

データベースにOracle RACを利用する場合はOC4Jで実装している「Fast Connection Failover」機能を利用することができます。このFast Connection Failoverを利用することでRACインスタンスのダウンイベントをもとにコネクションプール上の無効コネクションを自動クリーンアップすることが可能となります。設定方法、その他データソースの詳細については下記ドキュメントを参照してください。
(参考ドキュメント) Oracle Containers for J2EE サービス・ガイド10g(10.1.3.1.0)

データソースの名前やJNDIロケーションおよび接続プールを、次のように入力して「終了」ボタンを押します。

接続プール設定時と同様にAS Controlからデータソースの接続テストをおこないます。
ここで設定した接続プールやデータソースの設定情報は下記ファイルに格納されます(実際には「default」アプリケーションの設定ファイル「application.xml」でパスを指定したデータソース設定ファイルに設定されます)。

<%ORACLE_HOME%\j2ee\home\config\application.xml>

<?xml version="1.0" standalone='yes'?>
<orion-application …
   ・・・省略・・・
   <data-sources path="data-sources.xml" />
  ・・・省略・・・
</orion-application>

<%ORACLE_HOME%\j2ee\home\config\data-sources.xml>

<?xml version = '1.0' encoding = 'UTF-8'?>
<data-sources xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://xmlns.oracle.com/oracleas/schema/
data-sources-10_1.xsd" schema-major-version="10" schema-minor-version="1">
    <managed-data-source connection-pool-name="TestPool" jndi-name=" jdbc/scottDS" name="scottDS"/>
    <connection-pool name="TestPool">
       <connection-factory factory-class="oracle.jdbc.pool.OracleDataSource" user="scott" password="tiger" url="jdbc:oracle:thin:@dbhost:1521:orcl"/>
    </connection-pool>
</data-sources>

OC4Jでは、このjndi-name属性の値”jdbc/scottDS” がJNDIネームスペースにJNDI名として登録されます。アプリケーションからDataSourceオブジェクトの参照を取得する方法については後述します。

インデックスに戻る

(参考)OC4JインスタンスのJNDIバインディング確認方法

AS ControlからJNDIのバインディング情報を確認することができます。次のように、AS Controlのトップページで「管理」リンクを押して「JNDIブラウザ」の「タスクに移動」アイコンをクリックします。

以上で、OC4J側の接続プールとデータソース設定は完了しました。

データベース・アクセスプログラムの作成

次にデータベース・アクセスするサンプルサーブレットで動作確認をおこないます。
まず、Eclipse上で動的Webプロジェクト「dbaccess」を作成し、次にエンタープライズ・アプリケーション・プロジェクト「dbaccessEAR」を作成します。
動的Webプロジェクトの作成方法については、第1回を参考にしてください。
エンタープライズ・アプリケーション・プロジェクトを作成するには、Eclipseのメニューで「ファイル」→「新規」→「プロジェクト」で「J2EE」の「エンタープライズ・アプリケーション・プロジェクト」を選択して「次へ」ボタンを押します。

プロジェクト名に「dbaccessEAR」を入力し、「次へ」ボタンを押します。

プロジェクト・ファセットではデフォルト設定のまま「次へ」ボタンを押します。

動的Webモジュールの「dbaccess」にチェックを入れて「終了」ボタンを押します。

次に、dbaccessプロジェクトに下記サーブレットを新規作成します。
EMP表のENAME列を一覧表示するデータベース検索プログラムです。

<TestServlet.java>

package sample;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

public class TestServlet extends javax.servlet.http.HttpServlet  implements
                                                                  javax.servlet.Servlet {
  public TestServlet() {
    super();
  }   protected void  doGet(HttpServletRequest request,
                        HttpServletResponse response) throws ServletException, IOException {
    doPost(request, response);
  }   protected void  doPost(HttpServletRequest request,
                         HttpServletResponse response) throws ServletException, IOException {
    PrintWriter out = response.getWriter();
     out.println("<html><body>");
    Connection con = null;
    Statement stmt = null;
    try {
      InitialContext ic = new  InitialContext();
      DataSource ds =  (DataSource) ic.lookup("jdbc/scottDS");
      con = ds.getConnection();
      stmt =  con.createStatement();
      ResultSet rs = stmt.executeQuery("SELECT ENAME FROM EMP");
      while (rs.next()) {
         out.println(rs.getString("ENAME") + "<br>");
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
      try {
        if (stmt != null) {
          stmt.close();
        }
        if (con != null) {
          con.close();
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
     out.println("</body></html>");
    out.close();
  }
}

このサーブレットを実行すると、次のような実行結果となります。
EMP表のENAME列がすべて表示されたかどうかを確認します。

(補足)JNDI名とリソース参照名

今回作成したサンプル・プログラムではJ2EE標準の「Deployment Descriptor(DD)」でリソース参照名を設定していません。OC4Jはアプリケーション・コード中で指定されたJNDIルックアップのキー情報をもとにJNDIネームスペースを検索することができます。ただし、この方法は開発時には問題ありませんが、アプリケーションのポータビリティが低くなりますので、次のようにweb.xmlにリソース参照名を設定することを推奨します。

<修正版:TestServlet.java>

・・・略・・・
InitialContext ic = new InitialContext();
DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/scottDS");
・・・略・・・

<修正版:web.xml>

<web-app …>
・・・略・・・
   <resource-ref>
          <res-ref-name>jdbc/scottDS</res-ref-name>
          <res-type>javax.sql.DataSource</res-type>
          <res-auth>Container</res-auth>
          <res-sharing-scope>Shareable</res-sharing-scope>
  </resource-ref>

</web-app>

※データソースの設定時に指定したjndi-name属性値(jdbc/scottDS)と同じにする。

(注)後述のように、OC4Jでは、JNDI名とリソース参照名は仮に異なっていてもマッピング設定することができます。ただし、アプリケーション開発時はこのようなマッピング設定が不要となるように開発環境で両方の名前をそろえておくことを推奨します。このマッピング情報はOC4J固有のDDで設定するため、Eclipse + WTPでの開発ライフサイクルのなかでアプリケーションのアンデプロイ時に設定情報が破棄されます。

(参考)JNDI名とリソース参照名のマッピング

J2EE標準では、データソース等のリソース JNDI 名とアプリケーション・コンポーネントのリソース参照名を、かならずずしも同じにする必要はありません(コンポーネントのポータビリティを高くするためにリソースとコンポーネントを分離しています)。
JNDI名とリソース参照名が異なる場合は、OC4J固有のDDでマッピング設定をおこないます。この設定は、アプリケーションのデプロイ時とアプリケーションのデプロイ後におこなうことができます(あらかじめ固有DDを編集しておいてEARファイルにパッケージングしておくこともできます)。
OC4Jは、デプロイプラン(JSR-88)の編集・保存・再利用機能を実装していますので、アプリケーションのデプロイ時にこのデプロイプランの編集機能を使ってマッピング設定をおこなうことができます。
ここでは、AS Controlを使ってデプロイ済みのアプリケーションに対してJNDI名とリソース参照名のマッピング設定をおこなう手順を紹介します。
ここで紹介する手順はスタンドアロンOC4JとOC4Jで同じです。

先ほど作成したコードを次のように修正します。(修正箇所のみを抜粋)

<修正版:TestServlet.java>

・・・略・・・
InitialContext ic = new InitialContext();
DataSource ds = (DataSource) ic.lookup(" java:comp/env/jdbc/projectDS");
・・・略・・・

<修正版:web.xml>

<web-app …>
・・・略・・・
  <resource-ref>
          <res-ref-name>jdbc/projectDS</res-ref-name>
          <res-type>javax.sql.DataSource</res-type>
          <res-auth>Container</res-auth>
          <res-sharing-scope>Shareable</res-sharing-scope>
  </resource-ref>

</web-app>

修正後、ソースを保存してTestServletを実行します。
この段階では、JNDI名(jdbc/scottDS)とリソース参照名(jdbc/projectDS)のマッピング設定をしていませんので、アプリケーションは実行時にエラーとなります(javax.naming.NameNotFoundExceptionがスローされます)。

JNDI名とリソース参照名のマッピング設定をAS Controlでおこなうためには、AS Controlにログインして、「アプリケーション」リンクをクリックします。
次にJNDI名とリソース参照名のマッピング設定をおこなうアプリケーションを選択します。ここでは「dbaccessEAR」リンクを押します。

この画面からアプリケーションのデプロイや起動・停止制御をおこなうことができます。
マッピング設定をおこなうWebモジュール「dbaccess」リンクを押します。

アプリケーションに関するさまざまな設定は、「管理」リンクからおこなうことができます。
「管理」リンクを押します。

JNDI名とリソース参照名のマッピング設定は「リソース参照マッピング」からおこないます。
「タスクに移動」を押します。

「JNDIロケーション」欄に、データソースの設定時に指定したjndi-name属性値(jdbc/scottDS)を入力し、画面右部の「OK」ボタンを押します。

ここで編集した設定内容は、次のファイルに保存されます。
%ORACLE_HOME%\j2ee\home\application-deployments\dbaccessEAR\dbaccess\orion-web.xml

<orion-web.xml>

<orion-web-app …>
・・・略・・・
     <resource-ref-mapping name="jdbc/projectDS" location="jdbc/scottDS" />
・・・略・・・
</web-app>

マッピング設定を反映させるためにはアプリケーションの再起動が必要となります。
アプリケーションの再起動は、AS Controlの「アプリケーション」リンクから、もしくは個々のアプリケーションのトップページから実行することができます。

OC4Jのデプロイツール利用方法  

アプリケーション開発・単体テスト時は、開発者のローカル環境(「Eclipse + WTP + スタンドアロンOC4J」環境)で作業が完結しますが、結合テストや統合テストをおこなうためにはスタンドアロンOC4Jではなく、OC4Jまたはクラスタリング構成されたOC4Jにアプリケーションをデプロイする必要があります。
ここではOC4Jに付属の各種デプロイツールの使い方について紹介します。
OC4Jでは下記のデプロイツールが提供されています。

本章ではEclipseと連携可能なANT、admin_client.jar、オートデプロイについてご紹介します。

ANT

OC4Jではアプリケーションを特定のOC4Jインスタンスにデプロイ、またはグループ内のすべてのOC4Jインスタンスに同時デプロイするために必要なANTタスクを提供しています(グループは同じクラスタ・トポロジに属するOC4Jインスタンスの集合で、グループに属するOC4Jインスタンス間でさまざまなサーバー設定情報が同期処理されます)。
このANTタスクを利用することで、各種アプリケーションのビルドプロセスと統合できるようになります。

(参考)OC4Jで提供しているANTタスク一覧

ANTタスク名 説明
addDataSourceConnectionPool データソース接続プールの追加
addDestination JMS宛先の追加
addJMSConnectionFactory JMSコネクション・ファクトリの追加
addManagedDataSource マネージド・データソースの追加
addNativeDataSource ネイティブ・データソースの追加
bindWebApp 特定のWebサイトへのWebモジュールのバインドとコンテキストURIの設定
bindAllWebApps 1つのWebサイトへのすべてのWebモジュールのバインド
compileJsp JSPのプリコンパイル
deploy J2EEアプリケーション(EAR)のデプロイ
Webモジュール(WAR)のデプロイ
リソース・アダプタ(RAR)のデプロイ
getDataSourcesDescriptor アプリケーションのデータソース記述子の取得
getDestinations JMS宛先に関する情報の取得
getJMSConnectionFactories JMSコネクション・ファクトリに関する情報の取得
publishSharedLibrary 共有ライブラリのインストール
modifySharedLibrary 既存の共有ライブラリの変更
redeploy アーカイブの再デプロイ
removeDataSourceConnectionPool データソース接続プールの削除
removeDestination JMS宛先の削除
removeJMSConnectionFactory JMSコネクション・ファクトリの削除
removeManagedDataSource マネージド・データソースの削除
removeNativeDataSource ネイティブ・データソースの削除
removeSharedLibrary 共有ライブラリの削除
restartServer OC4Jインスタンスの再起動と停止
shutdownServer OC4Jインスタンスの再起動と停止
start アプリケーションの起動、再起動と停止
stop アプリケーションの起動、再起動と停止
testDatabaseConnection データベース接続のテスト
testDataSource データソースのテスト
testDataSourceConnectionPool データソース接続プールのテスト
undeploy アーカイブのアンデプロイ
updateEJBModule デプロイ済EJBモジュールでの変更済クラスの更新

以降、deployタスクを利用して、アプリケーションのEARファイルをクラスタ環境OC4Jに一括デプロイする手順を紹介します。
クラスタ環境構築詳細については下記ドキュメントを参照してください。
(参考ドキュメント) Oracle Containers for J2EE構成および管理ガイド10g(10.1.3.1.0)

OC4J ANTタスクを使用するには環境変数(ORACLE_HOME、JAVA_HOME)を設定する必要があります。
%ORACLE_HOME%\ant\bin\ant.batファイルを次のように編集します。

<サンプルant.bat>

@echo off

set JAVA_HOME=C:\Program Files\Java\jdk1.5.0_11
set ORACLE_HOME=D:\oc4j1013


REM   Copyright 2001,2004-2005 The Apache Software Foundation
・・・以下、省略・・・

次にbuild.xmlにdeployタスクを設定します。

<サンプルbuild.xml>

<project name="test" default="deploy"  basedir="." xmlns:oracle="antlib:oracle">
   <property name="lib.dir"  value="D:\oc4j_extended_101310_otnj\ant\bin"/>
   <property name="app.name"  value="dbaccessEAR"/>
   <property name="deployer.uri"  value="deployer:cluster:opmn:// ホスト/ グループ名"/>
   <property name="oc4j.admin.user"  value="oc4jadmin"/>
   <property name="oc4j.admin.password" value=" パスワード"/>
   <target name="deploy" depends="">
   <oracle:deploy deployerUri="${deployer.uri}"
       userId="${oc4j.admin.user}"
       password="${oc4j.admin.password}"
       file="${lib.dir}/${app.name}.ear"
       deploymentName="dbaccess"
       bindAllWebApps="default-web-site"/>
   </target>
</project>

※deployer.uriに設定する値はターゲットとなるOC4Jの環境(スタンドアロン、クラスタリング環境)によって異なります。詳細は下記ドキュメントを参照してください。
(参考ドキュメント) Oracle Containers for J2EEデプロイメント・ガイド10g(10.1.3.1.0)

ant.batとbuild.xmlの編集が完了したらbuild.xmlは%ORACLE_HOME%\ant\binにコピーします。次に、アプリケーションをビルドしてからANTタスクを実行します(コマンドプロンプト上で%ORACLE_HOME%\ant\binにフォルダを移動してからant.batを実行します)。次のようにメッセージが表示されることを確認します。

Buildfile: build.xml
deploy:
[oracle:deploy] アプリケーションdbaccessをデプロイしています。

・・・途中省略・・・

[Summary] Operation on cluster COMPLETED!
[oracle:deploy] dbaccessのアプリケーション・デプロイヤが完了しました。
BUILD SUCCESSFUL
Total time: XX seconds

(参考)EARファイルデプロイのおもなプロパティ

パラメータ 説明
*deployerUri デプロイ・ターゲットを指定するURI
*userid ターゲットのOC4Jインスタンスまたはインスタンス・グループの管理者のユーザー名
*password ターゲットのOC4Jインスタンスまたはインスタンス・グループの管理者のパスワード
*file デプロイするアーカイブのパスとファイル名
*deploymentName ユーザー定義のアプリケーション・デプロイ名。OC4J内でのアプリケーションの識別に使用
bindAllWebApps すべてのWebモジュールを指定のWebサイトにバインドします。Webサイトを構成するname-web-site.xmlファイルのnameの部分を指定
deploymentPlan アプリケーションに適用するデプロイ・プランのパスとファイル名。デプロイプラン(XMLファイル)はローカルに保存する必要があります
parent このアプリケーションの親アプリケーション。デフォルトは、グローバル・アプリケーション(defaultアプリケーション)
targetPath EARのデプロイ先のディレクトリ。デフォルトでORACLE_HOME/j2ee/instance/applications/ディレクトリにデプロイされます。
deploymentDirectory OC4J固有のデプロイメント・ディスクリプタと生成されるファイル(コンパイル済JSPクラスやEJBラッパー・クラスなど)を含む。デフォルトはORACLE_HOME/j2ee/instance/application-deployments/
logfile デプロイで生成されるログ・ファイルのパスと名前
実行時、-Djava.util.logging.config.fileでロギングプロパティを指定

ANTタスクの詳細については下記ドキュメントを参照してください。
(参考ドキュメント) Oracle Containers for J2EEデプロイメント・ガイド10g(10.1.3.1.0)

admin_client.jar

admin_client.jarは、OC4Jで提供されるコマンドライン・ユーティリティです(じつは、Eclipse WTPも内部的にadmin_client.jarを実行しています)。
このadmin_client.jarは、アプリケーションを特定のOC4Jインスタンスにデプロイ、またはグループ内のすべてのOC4Jインスタンスに同時デプロイするために必要な機能を実装しています。アプリケーションのデプロイ以外の機能についてもANTと同様の機能を実装しています。
以降、-deployオプションを利用して、アプリケーションのEARファイルをクラスタ環境OC4Jに一括デプロイする手順を紹介します。
実行対象となるadmin_client.jarは%ORACLE_HOME%\j2ee\homeにインストールされています。
環境変数ORACLE_HOMEを設定し、java.exeをPATHに通したうえで次のように実行します。

<admin_client.jar実行例>

java -jar %ORACLE_HOME%\j2ee\home\admin_client.jar deployer:cluster:opmn:// ホスト名/ グループ名 oc4jadmin パスワード -deploy -file D:\oc4j_extended_101310_otnj\ant\bin\dbaccessEAR.ear -deploymentName dbaccess -bindAllWebApps

次のようにメッセージが表示されることを確認します。

・・・途中省略・・・
[Summary] There are total n instances in the operation.
[Summary] Operation completed on ASインスタンス名.ホスト名/OC4Jインスタンス名1
・・・途中省略
[Summary] Operation completed on ASインスタンス名.ホスト名/OC4Jインスタンス名n
[Summary] Operation on cluster COMPLETED!

admin_client.jarで実装されている他の機能や利用方法詳細は下記ドキュメントを参照してください。
(参考ドキュメント) Oracle Containers for J2EEデプロイメント・ガイド10g(10.1.3.1.0)

オートデプロイ

アプリケーションのアーカイブファイルを適当なディレクトリにドロップするだけで、アプリケーション・デプロイが完了する仕組みを実装しているAPサーバーがあり、この機能は一般的に「ホットデプロイ」と呼ばれています。OC4Jで実装されているオートデプロイ機能はホットデプロイ機能に似た機能で、アプリケーション内の変更されたファイルのみを自動的にリロードする機能です。この機能により開発者はアプリケーション全体を再デプロイせずに動作確認をおこなうことができるので、ちょっとしたJSPの画面修正をブラウザで確認する際に便利な機能です。
このオートデプロイは、OC4Jで実装されているタスク・マネージャの機能によって実現されています。オートデプロイ用のフォルダは、タスク・マネージャの起動間隔にしたがって定期的にチェックされ、変更の加えられたファイルをOC4Jが自動でリロードします。
(注)オートデプロイ機能は、システム・リソースを消費するポーリングメカニズムが前提となっていますので開発環境のスタンドアロンOC4Jに対してのみ利用することを推奨します。

以降、スタンドアロンOC4Jでオートデプロイを設定し、デプロイ済みのアプリケーションをEclipseで修正し、動作確認するまでの手順を紹介します。

スタンドアロンOC4Jでオートデプロイ機能を利用するためにはオートデプロイ用フォルダを構成し、次のようにserver.xmlを編集する必要があります(ここでは、事前に%ORACLE_HOME%\j2ee\home\auto-deployをオートデプロイ用フォルダとして作成しています)。

<server.xml編集例>

・・・省略・・・
<application-server ...
 application-directory="../applications"
 check-for-updates="all"
 application-auto-deploy-directory="../auto-deploy"

 deployment-directory="../application-deployments"
 connector-directory="../connectors"
 taskmanager-granularity="1000"
・・・省略・・・

server.xmlの設定変更を反映させるためにはスタンドアロンOC4Jを再起動する必要があります。
次のようにEclipseからスタンドアロンOC4Jを停止して起動します。

サーバー停止

サーバー起動

ここで、オートデプロイの動作をコンソールログで確認するためにコンソールのログをクリアしておきます(Eclipseでコンソールを右クリックして「クリア」を選択します)。

コンソールクリア

次に、TestServletを適当に修正してからオートデプロイ用フォルダにEARファイルをドロップします。Eclipse WTPにはEARファイルをファイル・システム上にエクスポートする機能がありますのでこの機能を利用します。
プロジェクト・エクスプローラ上で該当するエンタープライズ・アプリケーション・プロジェクトを右クリックして「エクスポート」→「EARファイル」を選択します。

今回は初めてEARファイルをエクスポートするので「参照」ボタンを押してオートデプロイ用フォルダを選択します。
1度設定してエクスポートを実行すると、選択したフォルダが記憶されるので、2度目以降は「宛先」の一覧から選択するだけのオペレーションとなります。

「宛先」にオートデプロイ用フォルダが選択されているのを確認して「終了」ボタンを押します。Eclipseのコンソールにメッセージが出力されることとブラウザ上でアプリケーション修正が反映されていることを確認します。
このように、オートデプロイ機能を利用することでアプリケーションの修正から動作確認までをアプリケーションの再デプロイを実行せずにできるようになります。
ここで紹介した手順はANTタスクで実装しておくことでさらに自動化することができるようになります。

(参考)ANTでオートデプロイ手順を実装するための設定例

ここでは今回作成したdbaccessアプリケーションをオートデプロイする手順を実装したbuild.xmlを作成します。
次のように%ORACLE_HOME%\ant\bin\build.xmlを作成しておきます。

<build.xml(例)>

<project name="auto-deploy" default="deploy" basedir="." xmlns:oracle="antlib:oracle">
   <property name="eclipse.base" value=" ワークスペースフォルダ"/>
   <property name="web.base" value="${eclipse.base}/dbaccess"/>
   <property name="ear.base" value="${eclipse.base}/dbaccessEAR/EarContent"/>
   <property name="oc4j.base" value=" オラクルホーム"/>
   <property name="src.dir" value="${web.base}/src"/>
   <property name="bld.dir" value="${web.base}/build/classes"/>
   <property name="auto.dir" value="${oc4j.base}/j2ee/home/auto-deploy"/>
   <property name="app.name" value="dbaccess"/>
   <target name="init" depends="">
     <delete file="${ear.base}/${app.name}.war"/>
     <delete file="${auto.dir}/${app.name}EAR.ear"/>
  </target>
   <target name="compile" depends="init">
   </target>
   <target name="package" depends="compile">
     <war destfile="${ear.base}/${app.name}.war"
          webxml="${web.base}/WebContent/WEB-INF/web.xml">
       <fileset dir="${bld.dir}" includes="**/*" />
       <fileset dir="${web.base}/WebContent" includes="**/*" excludes="**/web.xml"/>
     </war>
     <ear basedir="${ear.base}"
        destfile="${auto.dir}/${app.name}EAR.ear"
        appxml="${ear.base}/META-INF/application.xml"
       includes="*.war, META-INF/**/*"
       excludes="META-INF/application.xml"/>
   </target>
   <target name="deploy" depends="package">
   </target>
</project>

※init
必要な初期化処理を定義します。
この例ではwarファイルとearファイルを削除しています。
※compile
Eclipseのビルド機能を利用しますので何も定義していません。
※package
EARファイルを作成しています。作成したEARファイルの格納先をオートデプロイ用フォルダにします。
※deploy
オートデプロイ機能を利用する場合はEARファイルをコピーするだけであり、何も定義していません。

次に、ANTをEclipseから実行できるように設定します。
Eclipseのメニューで「実行」→「外部ツール」→「外部ツール」を選択します。

「外部ツール」ウィンドウで「ANTビルド」を右クリックして「新規」を選択します。

名前に「オートデプロイ」を入力して「ビルド・ファイル」に作成したビルド・ファイルのパスを入力します。

設定後、「適用」ボタンを押してから「実行」ボタンを押して動作確認をおこないます。
EclipseコンソールにANT実行のメッセージとオートデプロイプロセスのログメッセージが適切に出力されることを確認します。

登録済みの外部ツールは、Eclipseメニューの「実行」→「外部ツール」→「オートデプロイ」選択で実行することができるようになります。

外部ツールの直前の実行履歴はEclipse上で保持されますので、オートデプロイを使い続けるには次のようにEclipse画面上部にある実行ボタンを押すのがもっとも簡単な方法です。

(参考)オートデプロイ機能利用時のOC4Jの設定ファイルについて

OC4J上にデプロイするアプリケーションがオートデプロイ機能を一度利用すると、OC4Jの設定ファイル(%ORACLE_HOME%\j2ee\home\config\server.xml)が次のように上書きされ、アプリケーションのファイル群はオートデプロイフォルダ以下のフォルダ階層に展開されます。

<オートデプロイ機能利用前のserver.xml(一部)>

・・・省略・・・
<application name="xxx" path="../applications\xxx.ear" parent="default" start="true" />
・・・省略・・・

<オートデプロイ機能利用後のserver.xml(一部)>

・・・省略・・・
<application name="xxx" path="%ORACLE_HOME%\j2ee\home\auto-deploy\xxx.ear" parent="default" start="true" />
・・・省略・・・

<オートデプロイ機能利用後のフォルダ階層(例)>

(注)オートデプロイ機能を利用するうえでの留意点

Eclipseの再起動時やWTPを使ったアプリケーションの実行時に、WTPによってアプリケーションの再デプロイが自動実行されます。
アプリケーションの再デプロイはアプリケーションのアンデプロイを伴いますので、server.xmlの設定内容とオートデプロイ用フォルダの中身ともに、オートデプロイ機能利用前の状態に戻ります。
このことを考慮し、オートデプロイ用フォルダ階層があることを前提とした設定(例:バージョン管理システム基底フォルダとしてオートデプロイ用フォルダを利用、ビルド・パスをオートデプロイ用フォルダに変更等)はしないことを推奨します。

(参考)ビルド・パスをオートデプロイ用フォルダに変更するメリット

Eclipseのデフォルト設定ではアプリケーションのビルド・パスはプロジェクトのトップフォルダ配下に設定されます。このビルド・パスはEclipseの外部フォルダに変更することが可能で、ビルド・パスをOC4Jのオートデプロイ用フォルダに指定することもできます。こうすることによりEclipseで編集したソース・ファイルはセーブしたと同時にコンパイルされ、クラスファイルが即座にOC4Jにロードされるようになり、もっとも早くアプリケーションの動作確認をおこなうことができるようになります。ただし、「(注)オートデプロイ機能を利用するうえでの留意点」を考慮し、このような設定は一時的な利用(アプリケーション・アンデプロイ実行前に設定解除する)にとどめておく必要があります。

※アプリケーションのアンデプロイ実行前に設定解除しないとEclipse内部でフォルダ階層に関する不整合が発生し、Eclipseの実行時エラーが発生します。

以下、ビルド・パスをオートデプロイ用フォルダに変更する手順を示します。
注: かならずオートデプロイ機能利用後の状態でスタンドアロンOC4J は起動しておきます。
Eclipseで該当するプロジェクトを右クリックして「プロパティ」を選択し、プロパティ画面で「Javaのビルド・パス」を選択します。デフォルト設定では「デフォルト出力フォルダ」はプロジェクトのトップフォルダ配下のフォルダとなっています。

ソースの出力フォルダを変更するには「ソース・フォルダごとに出力フォルダの指定を可能にする」にチェックを入れます。チェックを入れると「出力フォルダ:(デフォルト出力フォルダ)」が表示され、カスタマイズ可能になります。ここで「編集」ボタンを押します。

「ソース・フォルダ出力ロケーション」ウィンドウでは「特定の出力フォルダ…」にチェックを入れ「参照」ボタンを押します。

ビルド出力フォルダに出力フォルダを指定して「OK」ボタンを押します。
ここでは「新規フォルダの作成」ボタンから
「%ORACLE_HOME%\j2ee\home\auto-deploy\dbaccessEAR\dbaccess\WEB-INF\classes」を実体フォルダとするフォルダリンクを「web_classes」という名前で定義します。

フォルダ名に「web_classes」を入力し、「拡張」ボタンを押した後に「ファイル・システム内のフォルダにリンク」にチェックを入れます。参照ボタンを押して選択するか直接入力で
「%ORACLE_HOME%\j2ee\home\auto-deploy\dbaccessEAR\dbaccess\WEB-INF\classes」
を入力して「OK」ボタンを押します。

次のように出力フォルダが新規作成されたことを確認したら、「OK」ボタンを押します。

「特定の出力フォルダ」に「build/web_classes」が設定されていることを確認して「OK」ボタンを押します。

出力フォルダが変更されていることを確認して「OK」ボタンを押します。
この画面で出力フォルダをデフォルトに戻すことができます。デフォルト設定に戻すには「ソース・フォルダごとに出力フォルダの指定を可能にする」チェックボックスを外します。

プロジェクト・エクスプローラからは通常のフォルダアイコンとは異なるアイコンでリンクフォルダを見ることができるようになります。

これでソース・ファイルを編集後にセーブするたびにコンパイルされたクラスファイルがオートデプロイ用フォルダに格納され、自動的にOC4Jがロードし、即座にアプリケーションの動作確認をおこなうことができるようになります。

オートデプロイ機能詳細(オートデプロイ機能の対象外となるファイルや、OC4J構成ファイル変更時の挙動等)については下記ドキュメントを参照してください。
(参考ドキュメント) Oracle Containers for J2EEデプロイメント・ガイド10g(10.1.3.1.0)

インデックスに戻る

まとめ  

今回は、第1回目で構築したEclipse、WTP、スタンドアロンOC4J環境を利用し、データベース接続アプリケーションを作成するために必要な手順や、スタンドアロンOC4Jで提供している各種デプロイツールを利用したアプリケーションのデプロイ方法などを紹介しました。

次回はEclipse、WTP、スタンドアロンOC4Jを利用する際のTIPSを紹介します。

インデックスに戻る