目次


IBM Lotus Domino 8.5.2 における OSGi バンドルの開発します

IBM Lotus Domino 8.5.2 上で動作する OSGi バンドルの開発手法について解説

Comments

はじめに

OSGi は Java における高度なモジュール化を実現するための仕様であり、その実装としては Apache FelixEclipse EquinoxKnopflerfish などが広く知られています。OSGi フレームワークが提供する、モジュールのライフサイクル管理、モジュール同士の連携機能、モジュール間の依存関係を解決するための仕組みなどといった様々な機能により、独立性や再利用性の高いモジュールの開発が可能になります。OSGi を用いることで得られる利点の詳細については Benefits of Using OSGi を参照してください。OSGi は、元々は Open Services Gateway Initiative の略であったことからもわかるように、「ホームゲートウェイ」 と呼ばれる家庭内ネットワークと外部ネットワークをつなぐための組み込み機器上で動作する Java アプリケーションのための仕様としてスタートしましたが、その優れた技術が認められ、徐々に適用範囲を広げてきました。現在では、Java Enterprise Edition(Java EE)の分野においてもモジュール化技術のデファクトスタンダードとなりつつあり、IBM WebSphere Application ServerOracle WebLogic ServerJBoss Enterprise Application PlatformGlassFish といった主要な Java EE サーバーが既に OSGi の実装を取り入れています。さらに、2010 年 3 月に OSGi Service Platform R4.2 の拡張仕様として OSGi Service Platform Enterprise Specification が公開されたことにより、Java EE 分野における OSGi の活用がより一層本格化してきています。このような動向を踏まえ、IBM Lotus Domino(以下 Domino)も、バージョン 8.5.2 で OSGi の実装を取り入れるという大きな機能拡張を行いました。これにより、Domino 上で動作するアプリケーションを 「OSGi バンドル」 と呼ばれる Java モジュールとして実装することが可能になります。OSGi バンドルとして実装されるアプリケーションは、設計や開発、運用が容易であるため、保守性や拡張性を高めることができるようになります。また、Eclipse RCP ベースとなった IBM Lotus Notes(以下 Notes)8.0 以降でも OSGi バンドルを実行することが可能なため、サーバーとクライアントの両方で同一のモジュールを利用することができるといった利点も得られます。実際に、Notes/Domino のバージョン 8.5.2 では、OSGi バンドルとしてパッケージされた XPages のランタイムがサーバーとクライアントの両方にインストールされており(図1)、これにより、XPages で開発された Notes/Domino アプリケーションを Notes 上でも実行することが可能になっています。このように、Notes/Domino のアプリケーションを OSGi バンドルとして実装することによって様々な利点を得ることができます。本稿では、Domino 上で動作する OSGi バンドルを開発する手順について、具体的な例を示しながら解説していきます。

図 1. Notes 8.5.2 と Domino 8.5.2 にインストールされている OSGi バンドル化された XPages ランタイム
Notes 8.5.2 と Domino 8.5.2 にインストールされている OSGi バンドル化された XPages ランタイム
Notes 8.5.2 と Domino 8.5.2 にインストールされている OSGi バンドル化された XPages ランタイム

開発環境の構築

Domino 上で動作する OSGi バンドルを開発するためには、Domino 8.5.2 以上 および Eclipse 3.4 以上が必要です。また、Eclipse がインストールされている PC 上から Domino のプログラムディレクトリおよびデータディレクトリに対してファイルシステム経由でアクセスできなければなりません。この時、データディレクトリに対しては書き込み権限を持っている必要もあります。本稿では Domino 8.5.2 FP2 および Eclipse 3.7 を1台の Red Hat Enterprise Linux 6.1 上にインストールして開発を行っています。

なお、本文中に登場する <DOMINO_BIN> は Domino のプログラムディレクトリ(例: 「C:\Lotus\Domino」 「/opt/ibm/lotus/notes/85020/linux」)を、<DOMINO_DATA> は Domino のデータディレクトリ(例: 「C:\Lotus\Domino\Data」 「/local/notesdata」)をそれぞれ表しています。

Domino の設定

Domino の OSGi ランタイムは Domino Web Engine に統合されているため(図2)、OSGi ランタイムを利用するためには HTTP タスクが起動している必要があります。HTTP タスクは Domino のサーバーコンソールに 「load http」 と入力することで起動することができます(図3)。また、NOTES.INI の 「ServerTask」 キーの値に 「HTTP」 を追加することにより、Domino の起動時に HTTP タスクが自動的に立ち上がるように設定することもできます(図4)。詳細については InfoCenter の Starting and stopping the Domino web server を参照してください。

図 2. Domino 8.5.2 における OSGi ランタイムのアーキテクチャ
Domino 8.5.2 における OSGi ランタイムのアーキテクチャ
Domino 8.5.2 における OSGi ランタイムのアーキテクチャ
図 3. HTTP タスクの起動
HTTP タスクの起動
HTTP タスクの起動
図 4. NOTES.INI の ServerTasks の設定
NOTES.INI の ServerTasks の設定
NOTES.INI の ServerTasks の設定

HTTP タスクの起動後に Domino のサーバーコンソールで OSGi コマンドを実行することで OSGi ランタイムが利用可能な状態になっているかを確認することができます。OSGi コマンドは 「tell http osgi <COMMAND>」 という形式で実行することができ、例えば 「tell http osgi ss」 と入力した場合には Domino にインストールされている OSGi バンドルの一覧が表示されます(図5)。その他の利用可能な OSGi コマンドについては 「tell http osgi help」 と入力することで詳細を確認することができます。

図 5. Domino にインストールされている OSGi バンドル一覧の表示
Domino にインストールされている OSGi バンドル一覧の表示
Domino にインストールされている OSGi バンドル一覧の表示

IBM Lotus Domino Debug Plugin のインストール

IBM Lotus Domino Debug Plugin は OSGi バンドルの実行やデバッグを容易にするための Eclipse プラグインで、Notes/Domino 向けアプリケーションのオープンソースコミュニティである OpenNTF.org からダウンロードすることができます。IBM Lotus Domino Debug Plugin プロジェクトページ内の 「Download the release from here」 をクリックし(図6)、ダウンロードしたファイルを任意のディレクトリに展開します(図7)。

図 6. IBM Lotus Domino Debug Plugin のプロジェクトページ
IBM Lotus Domino Debug Plugin のプロジェクトページ
IBM Lotus Domino Debug Plugin のプロジェクトページ
図 7. 展開した IBM Lotus Domino Debug Plugin
展開した IBM Lotus Domino Debug Plugin
展開した IBM Lotus Domino Debug Plugin

Eclipse のメニューから 「Help」 -> 「Install New Software...」 を選択してプラグインをインストールします。「Install」 ダイアログ上で 「Add...」 をクリックし、リポジトリとして先ほど展開したファイルに含まれているアップデートサイトのアーカイブファイル(「com.ibm.domino.debug.osgi.zip」)を追加します(図8)。

図 8. IBM Lotus Domino Debug Plugin のリポジトリを追加
IBM Lotus Domino Debug Plugin のリポジトリを追加
IBM Lotus Domino Debug Plugin のリポジトリを追加

リポジトリに含まれているソフトウェア一覧が表示されるので、「Domino OSGi Debug feature」 にチェックを入れ、「Next」 をクリックしてインストールを開始します(図9)。

図 9. Domino OSGI Debug feature のインストール
Domino OSGI Debug feature のインストール
Domino OSGI Debug feature のインストール

インストール完了後、メニューから 「Help」 -> 「About Eclipse」 を選択し、「Installation Details」 をクリックすることで IBM Lotus Domino Debug Plugin が正しくインストールされているかを確認することができます。問題がなければ、図10のように、「Domino OSGi Debug feature」 の情報が表示されます。

図 10. IBM Lotus Domino Debug Plugin がインストールされていることを確認
IBM Lotus Domino Debug Plugin がインストールされていることを確認
IBM Lotus Domino Debug Plugin がインストールされていることを確認

JRE の設定

Domino に同梱されている JRE の定義を追加します。この JRE には 「Notes.jar」 が含まれているため、プロジェクトの JRE として指定することで Notes/Domino のバックエンドサービスにアクセスする際に使用する Java/CORBA クラス を利用することができるようになります。まず、メニューから 「Window」 -> 「Preferences」 を選択してプリファレンスを開き、「Java」/「Installed JREs」 を選択して設定画面を開きます(図11)。

図 11. Installed JREs の設定
Installed JREs の設定
Installed JREs の設定

「Add...」 をクリックして 「Add JRE」 ダイアログを開き、タイプとして 「Standard VM」 を選択します(図12)。

図 12. JRE タイプの選択
JRE タイプの選択
JRE タイプの選択

「JRE home」 として 「<DOMINO_BIN>/jvm」 を指定します(図13)。

図 13. JRE の設定
JRE の設定
JRE の設定

追加した JRE にチェックを入れ、デフォルトの JRE として使用するように設定します(図14)。これにより、OSGi バンドルのプロジェクトを作成する際に、「JRE System Library」 としてこの JRE を使用できるようになります。

図 14. デフォルト JRE の選択
デフォルト JRE の選択
デフォルト JRE の選択

Target Platform の設定

Target Platform として Domino の OSGi ランタイムを指定します。まず、メニューから 「Window」 -> 「Preferences」 を選択してプリファレンスを開き、「Plug-in Development」/「Target Platform」 を選択して設定画面を開きます(図15)。

図 15. Target Platform の設定
Target Platform の設定
Target Platform の設定

「Add...」 をクリックして 「New Target Definition」 ダイアログを開き、「Nothing: Start with an empty target definition」 を選択します(図16)。

図 16. Target の定義を新規作成
Target の定義を新規作成
Target の定義を新規作成

「Add...」 をクリックして 「<DOMINO_BIN>/osgi/rcp/eclipse」 と 「<DOMINO_BIN>/osgi/shared/eclipse」 をディレクトリとして追加します(図17)。

図 17. Domino の OSGi ランタイムを追加
Domino の OSGi ランタイムを追加
Domino の OSGi ランタイムを追加

作成した Target の定義を選択します(図18)。これにより、Eclipse ワークスペース上で開発中の OSGi バンドルはライブラリとして Domino の OSGi ランタイムを参照するようになります。

図 18. Target Platform として Domino の OSGi ランタイムを選択
Target Platform として Domino の OSGi ランタイムを選択
Target Platform として Domino の OSGi ランタイムを選択

OSGi バンドルの実行

開発環境の構築が完了したので、実際に OSGi バンドルを作成し Domino 上で実行してみます。IBM Lotus Domino Debug Plugin を利用することで、サーバーへのデプロイを行うことなく OSGi バンドルの動作確認を行うことができます。

サンプルアプリケーションの作成

メニューから 「New」 -> 「Plug-in Project」 を選択し、「New Plug-in Project」 ダイアログを開きます(図19)。任意のプロジェクト名を入力し、「Target Platform」 として 「an OSGi framework」 の 「Equinox」 を選択します。これは、Domino の OSGi ランタイムが Equinox をベースとしているためです。

図 19. 新規 Plug-in Project の作成
新規 Plug-in Project の作成
新規 Plug-in Project の作成

プロジェクト名やバージョン番号などの情報を入力します(図20)。ここで、「Execution Environment」 には 「<No Execution Environment>」 を指定してください。これは、プロジェクトの JRE としてデフォルトの JRE(Domino の JRE)を使用するためです。「Finish」 をクリックすると OSGi バンドルのひな形が作成されます。

図 20. OSGi バンドルの情報を入力
OSGi バンドルの情報を入力
OSGi バンドルの情報を入力

サーブレットの実装

図2に示したように、Domino の OSGi ランタイムは Server-Side Equinox の実装も含んでいるため、サーブレットや JSP を実行することもできます。ここではサンプルとしてサーブレットを追加してみます。まず、「MANIFEST.MF」 を開いて 「Dependencies」 ページを選択し、「Imported Packages」 としてサーブレットの実装に必要となるパッケージをインポートします。ここでは 「javax.servlet」 と 「javax.servlet.http」 を追加します(図21)。

図 21. サーブレットの実装に必要なパッケージをインポート
サーブレットの実装に必要なパッケージをインポート
サーブレットの実装に必要なパッケージをインポート

メニューから 「New」 -> 「Class」 を選択し新規サーブレットを作成します(図22)。「Superclass」 には 「javax.servlet.http.HttpServlet」 を指定してください。

図 22. 新規サーブレットの作成
新規サーブレットの作成
新規サーブレットの作成

ここでは、サンプルとして、GET リクエストを受けとった際に Domino のサーバー名を出力するという単純な実装を行います(リスト1)。

リスト 1. サンプルサーブレット
package com.ibm.lotus.domino.osgi.sample;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import lotus.domino.NotesException;
import lotus.domino.NotesFactory;
import lotus.domino.Session;

@SuppressWarnings("serial")
public class SampleServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException {
        PrintWriter out = resp.getWriter();
        try {
            Session session = NotesFactory.createSession();
            out.println(session.getServerName());
        } catch (NotesException e) {
            out.println(e.getMessage());
        } finally {
            out.close();
        }
    }
}

次に、拡張ポイントを用いてサーブレットの定義を記述します。まず、「MANIFEST.MF」 を開いて 「Dependencies」 ページを選択し、「Required Plug-ins」 として 「org.eclipse.equinox.http.registry」 を追加します(図23)。

図 23. Required Plug-ins の追加
Required Plug-ins の追加
Required Plug-ins の追加

拡張ポイントの追加は 「Extensions」 ページで行いますが、デフォルトでは非表示になっています。「Extensions」 ページは 「Overview」 ページで 「Extensions」 リンクをクリックすることで表示させることができます(図24)。

図 24. Extensions ページの表示
Extensions ページの表示
Extensions ページの表示

「Extensions」 ページで 「All Extensions」 に 「org.eclipse.equinox.http.registry.servlets」 を追加し(図25)、「plugin.xml」 ページでソースを直接編集して(図26)、リスト2のようなサーブレットの定義を記述します。ここで、「servlet」 エレメントの 「alias」 にはサーブレットの URL を、「class」 にはサーブレットの実装クラスを指定します。この例の場合、Web ブラウザを使ってサーブレットの URL である http://<HOST_NAME>/sample にアクセスすると(GET リクエストを送信すると)、SampleServlet クラスの doGet メソッドが呼び出されます。

図 25. 拡張ポイントの追加
拡張ポイントの追加
拡張ポイントの追加
図 26. plugin.xml の編集
plugin.xml の編集
plugin.xml の編集
リスト 2. サーブレットの定義
<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>
    <extension point="org.eclipse.equinox.http.registry.servlets">
        <servlet alias="/sample" class="com.ibm.lotus.domino.osgi.sample.SampleServlet" />
    </extension>
</plugin>

OSGi バンドルの実行

OSGi バンドルの基本的な実装が完了したので Domino サーバー上で実行してみます。メニューから 「Run」 -> 「Run Configurations...」 を選択し、「OSGi Framework」 の実行構成を新規に作成します(図27)。

図 27. OSGi Framework の実行構成を新規作成
OSGi Framework の実行構成を新規作成
OSGi Framework の実行構成を新規作成

「Framework」 として 「Domino OSGi Framework」 を選択し、実行したい OSGi バンドル以外のチェックをすべて外します(図28)。

図 28. OSGi Framework の実行構成
OSGi Framework の実行構成
OSGi Framework の実行構成

「Run」 をクリックすると図29のようなダイアログが表示されるので、Domino のプログラムディレクトリとデータディレクトリを指定します。

図 29. Domino OSGi PDE Configuration の作成
Domino OSGi PDE Configuration の作成
Domino OSGi PDE Configuration の作成

「OK」 をクリックすると図30のようなダイアログが表示され、「<DOMINO_DATA>/domino/workspace」 に 「pde.launch.ini」 というファイルが作成されます。これにより、Domino の OSGi ランタイムが起動する際に、図28の設定画面でチェックを入れた OSGi バンドルもロードされるようになります。すでに Domino を起動している場合には、Domino のサーバーコンソールで 「restart task http」 と入力して HTTP タスクを再起動することで OSGi ランタイムも再起動させることができます。その際には、サーバーコンソール上に図31のようなメッセージが表示されます。

図 30. pde.launch.ini の作成通知ダイアログ
pde.launch.ini の作成通知ダイアログ
pde.launch.ini の作成通知ダイアログ
図 31. <DOMINO_DATA>/domino/workspace/pde.launch.ini の設定が使用されていることを通知するメッセージ
<DOMINO_DATA>/domino/workspace/pde.launch.ini の設定が使用されていることを通知するメッセージ
<DOMINO_DATA>/domino/workspace/pde.launch.ini の設定が使用されていることを通知するメッセージ

ここで、Domino のサーバーコンソールに 「tell http osgi bundle <BUNDLE_ID>」 と入力することにより、Eclipse ワークスペース上の OSGi バンドルが Domino の OSGi ランタイムにロードされているかを確認することができます(図32)。

図 32. Eclipse ワークスペース上の OSGi バンドルがロードされていることを確認
Eclipse ワークスペース上の OSGi バンドルがロードされていることを確認
Eclipse ワークスペース上の OSGi バンドルがロードされていることを確認

この時、Web ブラウザを用いてサーブレットの URL である http://<HOST_NAME>/sample にアクセスすると、Domino のサーバー名がフルネーム形式でブラウザ上に表示され、OSGi バンドルが実行されていることを確認することができます(図33)。このように、IBM Lotus Domino Debug Plugin を用いることで、開発中の OSGi バンドルを Domino に実際にデプロイすることなく実行することができるため、開発時における動作確認の負担を大幅に軽減させることができます。

図 33. サーブレットが実行されたことを確認
サーブレットが実行されたことを確認
サーブレットが実行されたことを確認

デバッグ

Java アプリケーションのリモートデバッグ機能を利用して OSGi バンドルのデバッグを行うことができます。リモートデバッグとは、Java アプリケーションが実行されているリモートの JVM に TCP/IP 経由で接続してデバッグを行う手法のことです。リモートデバッグの詳細については Remote Debugging を参照してください。リモートデバッグを利用するためには、まず、Domino の NOTES.INI にリスト3の設定を追加し、JVM のデバッグモードを有効にして Eclipse からの接続を受け付けることができるようにします。ここで 「address」 の値として指定するのは接続を受け付けるポートの番号です。ポート 8000 が既に使用されている場合には別の値をセットしてください。NOTES.INI の設定を変更し Domino を再起動すると図34のようなメッセージが表示されます。

リスト 3. JVM のデバッグモードを有効にする NOTES.INI の設定
JavaEnableDebug=1
JavaDebugOptions=transport=dt_socket,server=y,suspend=n,address=8000
図 34. デバッグパラメータがセットされていることを通知するメッセージ
デバッグパラメータがセットされていることを通知するメッセージ
デバッグパラメータがセットされていることを通知するメッセージ

次に、Domino の JVM と Eclipse 間の接続を確立します。メニューから 「Run」 -> 「Debug Configurations...」 を選択し、「Remote Java Application」 のデバッグ構成を新規に作成します(図35)。

図 35. Remote Java Application のデバッグ構成を新規作成
Remote Java Application のデバッグ構成を新規作成
Remote Java Application のデバッグ構成を新規作成

「Connection Properties」 の 「Host」 に Domino のホスト名を、「Port」 に NOTES.INI にセットしたポート番号をそれぞれ指定します(図36)。

図 36. Remote Java Application のデバッグ構成
Remote Java Application のデバッグ構成
Remote Java Application のデバッグ構成

「Debug」 をクリックすると接続が確立されます。「Debug」 パースペクティブに切り替えると、指定した JVM に接続されていることが確認できます(図37)。

図 37. Debug パースペクティブで Domino の JVM への接続が確立されていることを確認
Debug パースペクティブで Domino の JVM への接続が確立されていることを確認
Debug パースペクティブで Domino の JVM への接続が確立されていることを確認

この状態の時、Java コード内にブレークポイントを設定すると、OSGi バンドルの実行がその位置で停止します(図38)。これにより、通常の Java アプリケーションのデバッグ時と同様に、ステップ実行や変数の値の確認といったデバッグ機能を利用することができるようになります。

図 38. OSGi バンドルのリモートデバッグ
OSGi バンドルのリモートデバッグ
OSGi バンドルのリモートデバッグ

デプロイ

OSGi バンドルの実装と動作確認が完了し、Domino にデプロイする際には、Eclipse のエクスポート機能を利用することができます。メニューから 「File」 -> 「Export...」 を選択してダイアログを開き、「Plug-in Development」/「Deployable plug-ins and fragments」 を選択します(図39)。

図 39. エクスポートダイアログ
エクスポートダイアログ
エクスポートダイアログ

デプロイしたい OSGi バンドルを選択し、エクスポート先として 「<DOMINO_DATA>/domino/workspace/applications/eclipse」 を指定します(図40)。

図 40. エクスポートの設定
エクスポートの設定
エクスポートの設定

「Finish」 をクリックすると処理が開始され、指定したディレクトリに OSGi バンドルのビルドが生成されます(図41)。デプロイに必要となる作業はこれだけです。Domino の OSGi ランタイムは起動時に 「<DOMINO_DATA>/domino/workspace/applications/eclipse」 ディレクトリに配置されている OSGi バンドルをロードするようになっているため、HTTP タスク再起動することにより、エクスポートした OSGi バンドルを使用することができるようになります(図42)。

図 41. エクスポートされた OSGi バンドル
エクスポートされた OSGi バンドル
エクスポートされた OSGi バンドル
図 42. デプロイした OSGi バンドルがロードされていることを確認
デプロイした OSGi バンドルがロードされていることを確認
デプロイした OSGi バンドルがロードされていることを確認

まとめ

本稿では、Domino 8.5.2 上で動作する OSGi バンドルの開発手順について、具体的な例を示しながら解説してきました。Domino 上で動作するアプリケーションの実装に OSGi によるモジュール化を用いることにより、アプリケーションの設計や開発、運用が容易になり、保守性や拡張性を高めることができるようになります。また、Notes も OSGi ランタイムを提供しているため、同一のモジュールをクライアントとサーバーの両方で利用することができるようになるといった利点も得られます。OSGi は Notes/Domino にとって非常に重要な技術として位置づけられており、今後も段階的に機能拡張が行われていく予定です。Domino 上で動作する OSGi バンドルの開発に興味を持たれた方はぜひチャレンジしてみてください。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Lotus
ArticleID=699893
ArticleTitle=IBM Lotus Domino 8.5.2 における OSGi バンドルの開発します
publish-date=07152011