本文へジャンプ

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

送信されたすべての情報は安全です。

  • 閉じる [x]

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む


送信されたすべての情報は安全です。

  • 閉じる [x]

Aries を使って OSGi アプリケーションを作成する

Apache Aries の紹介

Nathan A. Good, Senior Consultant and Freelance Developer, Enterprise Frameworks
Nathan Good
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』などがあります。

概要: Aries は Apache のインキュベーター・プロジェクトであり、アプリケーションを作成するための OSGi プラガブル・フレームワークを提供することを目的としています。この記事では Aries と OSGi の概念を紹介し、アプリケーションの作成に使用できる OSGi 準拠のモジュールを作成する方法について説明します。

日付:  2010年 8月 10日
レベル:  初級 この記事の原文:  英語
アクティビティー: 4863 ビュー
お気軽にご意見・ご感想をお寄せください: 


OSGi Alliance は多種多様な貢献者で構成されたグループであり、これらの貢献者によって OSGi 仕様が管理、維持されています。OSGi 技術を使えば、モジュールで構成されたサービス・ベースのアーキテクチャーを Java™ 技術によって実現することができるため、OSGi 技術は多くの主要な製品やフレームワークで使用されています。

よく使われる頭字語

  • API: Application Programming Interface
  • IDE: Integrated Development Environment
  • JAR: Java ARchive
  • XML: Extensible Markup Language

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 間の競合が起こることはありません。クラスのロードは各バンドルに対してサンドボックス化されており、そのためロギング・フレームワークなどの依存関係がバンドル間で異なっていても問題は起こりません。

Aries について

Apache Aries の目標は、アプリケーションを構成するさまざまな部品を結合する際のベースとなる技術として OSGi を使用し、エンタープライズ・アプリケーションを作成できるようにすることです。Aries を使用することで、JTA (Java Transaction API) や JPA (Java Persistence API) などの技術を利用してアプリケーションのさまざまな部品を作成することができ、それらの部品を OSGi のサービスやモジュールとして公開することができます。Aries の OSGi モジュールのスコープは特定のアプリケーションに限定されているため、Aries を使って作成されるアプリケーションの外からこの OSGi モジュールは見えません。Apache Aries インキュベーター・プロジェクトに関する詳細な情報は「参考文献」のリンクを参照してください。

OutOfMemory

私が自分のコンピューターで Maven ターゲットを実行している際、OutOfMemory エラーが発生しました。そこで私は、このエラーを解決するために export MAVEN_OPTS=-Xmx265M と入力してから、再度 mvn コマンドを実行しました。

Aries をダウンロードしてインストールする

Aries をソース・コード形式でダウンロードし、ローカルでビルドします。その方法については、Aries のソースをビルドするための方法として Aries のサイトに説明されています (「参考文献」を参照)。この記事の例では、Maven を使って Aries プロジェクトをビルドし、そのコードを Eclipse にインポートします。

Aries をダウンロードしてインストールするためには、以下の手順を実行します。

  1. 下記のようにコマンドラインで Subversion を使用し、Aries のコードをチェックアウトします。

    svn export https://svn.apache.org/repos/asf/incubator/aries/trunk
    

  2. コードをチェックアウトしたら、Maven でコードをダウンロードできるように、下記のコマンドを使って準備します。

    mvn clean
    

  3. Eclipse のワークスペースにコードをインポートできるように、下記の Maven コマンドを使ってコードを準備します。

    mvn eclipse:eclipse
    

  4. 「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 など)。


Web コンテナーの中で OSGi サービスを使用する

ここまでで、いくつかの 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

Apache ServiceMix は ESB (Enterprise Service Bus) を提供しており、Felix Karaf ランタイムのベースにもなりました。ServiceMix は OSGi コンポーネントを使用して作られており、ServiceMix によって SOA (Service-Oriented Architecture) で OSGi 技術を使えるようになります。

WebSphere Feature Pack

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 の機能のいくつかを実際に実行する独自のサービスを作成することができます。


参考文献

学ぶために

製品や技術を入手するために

議論するために

著者について

Nathan Good

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』などがあります。

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


developerWorks: サイン・イン


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。 プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。 お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

表示名をお選びください

developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

(半角英数字で3文字以上31文字以下にする必要があります)


「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 利用条件

 


この記事を評価する

コメント

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Web development
ArticleID=521203
ArticleTitle=Aries を使って OSGi アプリケーションを作成する
publish-date=08102010
author1-email=mail@nathanagood.com
author1-email-cc=

タグ

Help
このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。

スライダーバーを使用することで、より多く(少なく)タグを表示します。

人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。

マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。

このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。