OSGi Alliance は多種多様な貢献者で構成されたグループであり、これらの貢献者によって OSGi 仕様が管理、維持されています。OSGi 技術を使えば、モジュールで構成されたサービス・ベースのアーキテクチャーを Java™ 技術によって実現することができるため、OSGi 技術は多くの主要な製品やフレームワークで使用されています。
OSGi 技術を使った一般的な製品の一例が Eclipse IDE です。OSGi 技術には、モジュール型のアプリケーションを作成できるというメリットがあるため、Eclipse のプラグインには OSGi 技術が使われています。Eclipse には便利な OSGi コンソールがあり、この OSGi コンソールを使って OSGi モジュールをインストールして実行することで、OSGi モジュールをテストすることができます。(この記事の例では、これらの OSGi ツールを使って OSGi の機能をいくつか説明します。) Spring などの一般的なフレームワークでは、プラガブル・モジュールを作成して使用するために OSGi 技術を使用しています。
OSGi 技術は、多くのアプリケーション・サーバー (IBM WebSphere® Application Server、Apache Geronimo、JBoss、Glassfish、Oracle®/BEA WebLogic など) にも使われています。
OSGi 技術を使用したサービス指向のモジュール型コンポーネントや機能は、2 つの手段によって実現されます。1 つ目の手段では、OSGi 仕様によって OSGi バンドルのクラスをロードする方法が決められていることを利用します。この方法のおかげで、モジュールはさまざまなライブラリーを共存させた状態で機能させることができるため、この方法は重要です。また、各バンドルはサンドボックス化されているため、あるバンドルの中にある各種ロギング・ライブラリーのバージョンと、別のバンドルの中にある同じロギング・ライブラリーのさまざまなバージョンとが競合することはありません。
2 つ目の手段では、モジュールの実装には、適切に定義されたインターフェースとモジュールの内容に関する詳細情報を含むよう、OSGi 仕様によって要求されていることを利用します。適切なインターフェースと、マニフェストのメタデータを使用することから、モジュールは必然的に、疎結合でありながら非常に焦点の絞られたものになります。そうしたモジュールを実装した Java インターフェースや Java クラスを作成するためのベスト・プラクティスは、インターフェースと実装を別々のバンドルに入れることです。
OSGi に関して学ぶべきことはたくさんあります。詳しい情報へのリンクは「参考文献」セクションにありますが、Apache Aries の使い方と目標を理解する上では、OSGi フレームワークの目標のいくつかを以下のように簡単に要約しておくことが重要です。
- 複雑さの軽減。OSGi はバンドルで構成されています。バンドルは完全にモジュール構造になっており、モジュール同士の通信はサービス・インターフェースのみによって行われます。
- 再利用。OSGi バンドルは完全にモジュール構造であるため、容易に再利用することができます。一部のオープンソース・プロジェクトでは、そのプロジェクトの Java クラスを OSGi バンドル準拠の JAR にパッケージ化しています。
- 容易なデプロイメント。OSGi フレームワークには標準化された API があるため、OSGi 実装には OSGi バンドルをインストール、起動、停止するためのツールを含めることができます。
- 動的な更新。OSGi バンドルはモジュール構造でデプロイが容易なため、アプリケーションを再起動せずに更新を行うことができます。
- バージョン管理。バンドルは動的に更新することができ、またサンドボックス化されていることから、さまざまなバージョンのバンドルをデプロイして容易に使用することができますが、それによって JAR 間の競合が起こることはありません。クラスのロードは各バンドルに対してサンドボックス化されており、そのためロギング・フレームワークなどの依存関係がバンドル間で異なっていても問題は起こりません。
Apache Aries の目標は、アプリケーションを構成するさまざまな部品を結合する際のベースとなる技術として OSGi を使用し、エンタープライズ・アプリケーションを作成できるようにすることです。Aries を使用することで、JTA (Java Transaction API) や JPA (Java Persistence API) などの技術を利用してアプリケーションのさまざまな部品を作成することができ、それらの部品を OSGi のサービスやモジュールとして公開することができます。Aries の OSGi モジュールのスコープは特定のアプリケーションに限定されているため、Aries を使って作成されるアプリケーションの外からこの OSGi モジュールは見えません。Apache Aries インキュベーター・プロジェクトに関する詳細な情報は「参考文献」のリンクを参照してください。
Aries をソース・コード形式でダウンロードし、ローカルでビルドします。その方法については、Aries のソースをビルドするための方法として Aries のサイトに説明されています (「参考文献」を参照)。この記事の例では、Maven を使って Aries プロジェクトをビルドし、そのコードを Eclipse にインポートします。
Aries をダウンロードしてインストールするためには、以下の手順を実行します。
- 下記のようにコマンドラインで Subversion を使用し、Aries のコードをチェックアウトします。
svn export https://svn.apache.org/repos/asf/incubator/aries/trunk
- コードをチェックアウトしたら、Maven でコードをダウンロードできるように、下記のコマンドを使って準備します。
mvn clean
- Eclipse のワークスペースにコードをインポートできるように、下記の Maven コマンドを使ってコードを準備します。
mvn eclipse:eclipse
- 「File (ファイル)」 > 「Import (インポート)」の順にクリックし、続いて 「General (一般)」 > 「Existing projects into Workspace (既存プロジェクトをワークスペースへ)」の順にクリックすることで、Aries プロジェクトを Eclipse にインポートします。
これで Aries のコードをダウンロードしてビルドし、Eclipse にインポートすることができたので、HelloWorld の例をベースに独自のサービス・プロジェクトを作成する準備が整ったことになります。このサンプル・サービスでは、このサービスに送信されたメッセージをエコー出力しますが、メッセージに含まれる文字を逆の順序でエコー出力します。この例はクライアントからサービスにメッセージを送信する方法を示しています。
まず、このサービスのインターフェースを作成します。理想的には、OSGi アプリケーションのインターフェースは、実装クラスとは別のバンドル (プロジェクト) の中にある必要があります。このプラクティスによって Eclipse でのプロジェクトの構造が少し複雑になりますが、はるかに容易に実装バンドルを交換できるようになるというメリットがあります。OSGi のようにモジュール構造を強制する技術を使用する理由の 1 つは、サービスの実装を素早く変更できるからです。
EchoService インターフェースをリスト 1 に示します。このインターフェースには 1 つのメソッドが含まれており、このメソッドは、このインターフェースの実装の中でメッセージを処理するための引数を受け付けます。またこのインターフェースには initialize メソッドも含まれています。initialize メソッドの目的は、OSGi フレームワークがサービスを起動したときに、そのサービスのメソッドをどのようにして呼び出すかを示すことです。
リスト 1. EchoService Java インターフェース
package com.example.echo.api;
public interface EchoService {
void echoMessage(String message);
void initialize();
}
|
このインターフェースが作成できると、このインターフェースによって公開されるメソッドを呼び出すクライアント・クラスを作成することができます。このクライアント・クラスをリスト 2 に示します。
リスト 2. EchoServiceClient クラス
package com.example.echo.client;
import com.example.echo.api.EchoService;
public class EchoServiceClient {
private EchoService service;
public void initialize()
{
String message = "My Message";
service.echoMessage(message);
}
public EchoService getService() {
return service;
}
public void setService(final EchoService service) {
this.service = service;
}
}
|
今度は、EchoService の実装のためのクラスを追加します。com.example.echo.service というサービス実装バンドルのために別のプロジェクトを作成し、com.example.echo.api プロジェクトに対する参照を追加します。
一般的な命名規則として、EchoServiceImpl のような名前をクラスに付ける方法があります。私は DefaultEchoService を使うことにします。つまりサービスの実装のタイプを表すようにサービスの名前を付けるのです。この実装クラスは EchoService インターフェースのデフォルト実装になります (リスト 3)。
リスト 3. DefaultEchoService の実装
package com.example.echo.service;
import com.example.echo.api.EchoService;
public class DefaultEchoService implements EchoService {
public void echoMessage(final String message) {
StringBuilder sb = new StringBuilder(message);
sb.reverse();
System.out.println(sb.toString());
}
public void initialize() {
System.out.println(this.getClass().getName() + " is initialized.");
}
}
|
次に行う作業は、Aries に対してサービスの検出方法とデプロイ方法を指示するファイルの編集です。
この時点で、クライアント・クラス、インターフェース、そのインターフェースを実装したクラスがあるはずです。この 3 つのクラスは 3 つの別々のプロジェクトの中にある必要があります (各プロジェクトの中に 1 つのファイル)。これでクラスを定義できたので、これらのクラスを使って何をするのかを Aries に指示する XML ファイルを作成します。
クライアントの構成ファイルをリスト 4 に示します。
リスト 4. クライアントの構成ファイル
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
<reference id="echoService" interface="com.example.echo.api.EchoService" />
<bean id="echoClient" class="com.example.echo.client.EchoServiceClient"
init-method="initialize">
<property name="service" ref="echoService" />
</bean>
</blueprint>
|
クライアントの構成ファイルが echoService を参照していることに注意してください。また echoService はこのファイルの中で、Java インターフェースの完全修飾名と一緒に定義されています。
サーバーの構成ファイル (リスト 5) はクライアントの構成ファイルと似ています。この構成ファイルは、bean 要素を参照するサービスとしてインターフェースを定義し、この bean 要素にはサービスの実装の完全修飾名が含まれています。
リスト 5. サービスの構成ファイル
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
<bean id="echoServiceImpl" class="com.example.echo.service.DefaultEchoService"
init-method="initialize">
<property name="service" ref="echoService" />
</bean>
<service id="echoService" interface="com.example.echo.api.EchoService" />
</blueprint>
|
ここで、実装クラスを構成ファイルの中で定義することによって非常に強力になることがわかります。つまり、コードをまったく変更せずに実装を変更することができ、しかもクライアントのリソースに影響を与えることはありません。
これで、(クライアント・プロジェクトとサービス・プロジェクトという) 2 つのプロジェクトに XML 構成ファイルを追加できたので、プロジェクトをコンパイルしたり、プロジェクトから JAR ファイルを作成したり、また OSGi コンソールを使ってプロジェクトを起動した場合にプロジェクトがどう表示されるかを調べたりすることができます。
OSGi コンソールに関して言えば、このアプリケーションでは Eclipse IDE に用意されたコンソールを使用しています。あるいは、Apache の別のプロジェクトであり、OSGi コンテナーの実装でもある Apache Felix を使うこともできます (「参考文献」を参照)。
単純な Apache Ant スクリプト (リスト 6) を使ってすべてのプロジェクトをコンパイルし、JAR ファイルをビルドし、それらの JAR を 1 つのフォルダーに入れます。OSGi コンソールは、このフォルダーから起動します。
リスト 6. バンドルをビルドし、パッケージ化するための単純な Ant スクリプト
<project name="build.echo" default="build" basedir=".">
<property name="src" value="src" />
<property name="build" value="bin" />
<property name="dist" value="dist" />
<property name="workspacedir"
value="${basedir}/.." />
<property name="api"
value="${workspacedir}/com.example.echo.api" />
<property name="client"
value="${workspacedir}/com.example.echo.client" />
<property name="services"
value="${workspacedir}/com.example.echo.services" />
<target name="build">
<javac srcdir="${api}/${src}" destdir="${api}/${build}"/>
<javac srcdir="${client}/${src}" destdir="${client}/${build}"/>
<javac srcdir="${services}/${src}" destdir="${services}/${build}"/>
</target>
<target name="package">
<mkdir dir="${dist}" />
<jar jarfile="${dist}/com.example.echo.api.jar"
basedir="${api}/build" />
<jar jarfile="${dist}/com.example.echo.client.jar"
basedir="${client}/build" />
<jar jarfile="${dist}/com.example.echo.services.jar"
basedir="${services}/build" />
</target>
</project>
|
この Ant スクリプトを Eclipse から実行し、ターゲットのビルドを使って JAR ファイルをビルドします。ビルドが完了したら、下記のコマンドを実行して OSGi コンソールを起動します。
java -jar org.eclipse.osgi_3.5.0.v20090520.jar -console |
OSGi コンソールが実行されると、コンソールに ss と入力することでモジュールの状態を表示することができます。リスト 7 は OSGi コンソールの出力の例です。
リスト 7. サービスを一覧表示する
osgi> ss Framework is launched. id State Bundle 0 ACTIVE org.eclipse.osgi_3.5.0.v20090520 1 ACTIVE org.eclipse.equinox.cm_3.2.0.v20070116 2 ACTIVE org.eclipse.osgi.services_3.1.200.v20070605 3 ACTIVE org.ops4j.pax.logging.pax-logging-api_1.4.0 4 ACTIVE org.ops4j.pax.logging.pax-logging-service_1.4.0 5 ACTIVE org.apache.aries.util_0.2.0.incubating-SNAPSHOT 6 ACTIVE org.apache.aries.blueprint_0.2.0.incubating-SNAPSHOT 7 RESOLVED com.example.echo.api_1.0.0 8 RESOLVED com.example.echo.client_1.0.0 9 RESOLVED com.example.echo.server_1.0.0 |
これらのサービスのいずれかを起動するためには、start コマンドを使用します (例えば start 8 など)。
ここまでで、いくつかの OSGi バンドルを作成し、それらのバンドルの動作を確認したので、今度は Aries が Web アプリケーションの中で OSGi バンドルをどう使用するのかを調べてみましょう。
Aries Web アプリケーションを起動するためには、mvn install を実行した時にコンパイルされたプロジェクトのコンポーネント (バイナリー・バージョンをダウンロードするには、「参考文献」のリンクを参照) をディレクトリーの中に入れ、OSGi コンソールを起動します。Aries のコンポーネントがすべて起動すると、ロード・ディレクトリーが作成されます。
Web アプリケーションは、.eba というファイル拡張子を持つアーカイブ・ファイルの中にパッケージ化された、OSGi モジュールから作成されます。これらの .eba ファイルは共通のフォーマットを持っており、先ほど作成した EchoService インターフェースに Java サーブレットを含むバンドルが追加されている場合には、.eba ファイルの内容はリスト 8 のようになります。
リスト 8. .eba ファイルの例
META-INF/APPLICATION.MF com.example.echo.api.jar com.example.echo.client.jar com.example.echo.service.jar com.example.echo.web.jar |
Aries のインスタンスの実行中に .eba ファイルがロード・ディレクトリーにドロップされると、Aries は .eba ファイルを解凍し、.eba ファイルの中にあるバンドルをロードして起動します。Aries からアプリケーションをアンイストールするためには、単純に .eba ファイルをロード・ディレクトリーから削除します。
ロード・ディレクトリーに .eba ファイルをドロップすると、その URL (例えば http://localhost:8080/com.example.echo.web/ など) までブラウザーでナビゲートすることで、その Web アプリケーションを表示することができます。
Aries に用意されているブログの例は、Web バンドルをまとめる方法を示しています。先ほど実行した mvn eclipse:eclipse コマンドにより、ブログのサンプルも Eclipse にインポートすることができます。サンプルのプロジェクトを示したものがリスト 9 です。
リスト 9. サンプルの Web バンドル・プロジェクト
org.apache.aries.samples.blog.api org.apache.aries.samples.blog.biz org.apache.aries.samples.blog.datasource org.apache.aries.samples.blog.itests org.apache.aries.samples.blog.jdbc.eba org.apache.aries.samples.blog.jpa.eba org.apache.aries.samples.blog.peristence.jdbc org.apache.aries.samples.blog.peristence.jpa org.apache.aries.samples.blog.web |
Aries に似たプロジェクトや製品、また Aries を補完するプロジェクトや製品には、OSGi 技術を使ってアプリケーションを作成するための多種多様な方法が用意されています。OSGi コンポーネントをアプリケーションとして作成、管理、配布するための関連技術を以下にいくつか挙げておきます。
Apache Felix と Apache Felix Karaf
Apache Felix は OSGi フレームワークのコアの実装です。Felix OSGi フレームワーク実装には多くのサブプロジェクトがあり (例えば、Aries をデプロイ可能な OSGi ランタイムを提供する Apache Felix Karaf など)、それらのサブプロジェクトによって、フル機能の OSGi フレームワーク実装を作成するためのコンポーネントを追加することができます。Apache Felix と Felix Karaf に関する詳細は「参考文献」を参照してください。
Apache ServiceMix は ESB (Enterprise Service Bus) を提供しており、Felix Karaf ランタイムのベースにもなりました。ServiceMix は OSGi コンポーネントを使用して作られており、ServiceMix によって SOA (Service-Oriented Architecture) で OSGi 技術を使えるようになります。
IBM WebSphere Application Server バージョン 7 の Feature Pack for OSGi Applications and Java Persistence は、Aries にも使用されている Blueprint Container 仕様を実装しています (「参考文献」を参照)。Blueprint Container は以下の役割を果たします。
- コンポーネントに対して XML 構成ファイルを使用する
- コンポーネントのインスタンス化と初期化を行う
- コンポーネント間の通信を行う
- サービスの登録および参照を行う
この Feature Pack により、Aries の場合と同様、OSGi バンドルの集合としてアプリケーションをデプロイすることができます。
Aries プロジェクトは現在、Apache インキュベーターの段階にありますが、OSGi 技術を利用したアプリケーション開発によってモジュール型アプリケーションを作成することを目指しています。OSGi は、真にモジュール型のプラガブル・コンポーネントとして Java サービスや Java モジュールを作成するための技術です。
皆さんも Aries をダウンロードして Eclipse にインポートすることができます。そしてこの記事のサンプル・アプリケーションをテンプレートとして使うことで、Aries の機能のいくつかを実際に実行する独自のサービスを作成することができます。
学ぶために
- Blueprint Container について学んでください。Blueprint のチュートリアルは Aries と Blueprint の使い方を解説しています。
- Apache Aries のビルド方法を学んでください。
- Aries に関する提案を読み、Aries に関して学んでください。
- OSGi Alliance についての資料を読んでください。
- 「Understanding how Eclipse plug-ins work with OSGi」(Scott Delap 著、developerWorks、2006年6月) を読み、Eclipse と OSGi との関係について学んでください。
- 「Building OSGi applications with the Blueprint Container specification」(Jarek Gawor、developerWorks、2009年11月) を読み、Blueprint XML ファイルの定義、また XML によるコンポーネントの定義の第一歩を学んでください。
- developerWorks の Web development ゾーンは Web ベースのさまざまなソリューションを解説した記事に特化しています。
- developerWorks の Technical events and webcasts で最新情報を入手してください。
- developerWorks On demand demos をご覧ください。初心者のための製品インストール方法やセットアップのデモから、上級開発者のための高度な機能に至るまで、多様な話題が解説されています。
製品や技術を入手するために
- Apache Felix のサイトで Felix について学んでください。
- Apache ServiceMix のサイトで ServiceMix について学んでください。
- WebSphere Application Server 7 Feature Pack for OSGi Applications and Java Persistence API 2.0 のサイトから、IBM WebSphere Application Server 7 Feature Pack をダウンロードしてインストールしてください。
- ビルド済みの Aries バイナリーをダウンロードしてください。
- WebSphere Application Server CE をダウンロードしてインストールしてください。
- IBM 製品の評価版をダウンロードするか、あるいは IBM SOA Sandbox のオンライン試用版で、DB2®、Lotus®、Rational®、Tivoli®、WebSphere® などが提供するアプリケーション開発ツールやミドルウェア製品を試してみてください。
議論するために
- 今すぐ My developerWorks のプロフィールを作成し、OSGi に関するウォッチ・リストを設定してください。また My developerWorks に接続し、そして My developerWorks への接続を維持してください。
- Web 開発に関心を持つ他の developerWorks メンバーを見つけてください。
- Web 開発者の方は、その経験や知識を Web 開発グループの他の人達と共有してください。
- Web のトピックに焦点を絞った developerWorks のグループの 1 つに参加し、皆さんの知識を共有させてください。
- Roland Barcia が彼のブログの中で Web 2.0 とミドルウェアについて語っています。
- developerWorks のメンバーが Web のトピックに関して共有するブックマークを調べてみてください。
- 即座に答えを得るために、Web 2.0 Apps フォーラムを訪れてください。

Nathan A. Good はミネソタ州の Twin Cities エリアに住んでいます。彼はプロとしてソフトウェア開発やソフトウェア・アーキテクチャー、システム管理などを行っています。彼はソフトウェアを書いている時以外は、PC やサーバーを構築したり、新しい技術について資料を読んだり、そうした技術に取り組んだり、彼の友人達をオープソース・ソフトウェアに移行させようとしたりしています。彼は数多くの本や記事を執筆、あるいは共同で執筆しており、その中には『Professional Red Hat Enterprise Linux 3』や『Regular Expression Recipes: A Problem-Solution Approach』、『Foundations of PEAR: Rapid PHP Development』などがあります。