本文へジャンプ

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


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

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

  • 閉じる [x]

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

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

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


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

  • 閉じる [x]

OSGi と Spring: 第 2 回 Felixを使用して OSGi の Spring バンドルを作成し、デプロイする

オープンソースの OSGi コンテナーである Apache Felix を使用して、Java コンポーネントを OSGi ベースの Spring バンドルとして作成し、パッケージ化するための開発者向けステップバイステップ・ガイド

Naveen Balani, Enterprise Architect, IBM
Naveen Balani's photo
Naveen Balani は、IBM India Software Labs (ISL) のアーキテクトで、ISLでは WebSphere Business Services Fabric の設計および開発作業のリーダーを務めています。新しい技術の調査に積極的な彼は、IBM developerWorks ではお馴染みの寄稿者でもあり、今まで Web サービス、ESB、JMS、SOA、アーキテクチャー、オープンソース・フレームワーク、セマンティック Web、J2ME、パーベイシブ・コンピューティング、Spring、Ajax、そしてさまざまな IBM 製品についての記事を書いています。また、『Beginning Spring Framework 2』、『Getting Started with IBM WebSphere Business Services Fabric V6.1』の共著者でもあります。
Rajeev Hathi, Technical Architect, Consultant
Rajeev Hathi's photo
Rajeev Hathi は、J2EE プラットフォームのソフトウェア・コンサルタントとして働いてきました。彼の専門は、J2EE をベースとしたアプリケーションの設計です。得意とするサブジェクトは Web サービスで、Web サービスを通じて SOA の概念を適用し、吸収するという方法を好んでいます。趣味は、スポーツ観戦とロックを聴くことです。

概要: Felix コンテナー内で Spring DM (Spring Dynamic Modules) フレームワークを使用して、Java クラスを OSGi バンドルとして作成し、パッケージ化してください。この連載の第 2 回では、Spring フレームワークを使ってバンドルを作成し、そのバンドルを Felix ランタイム環境にデプロイする方法を説明します。単純な Spring ベースの構成によって、コアとなる OSGi フレームワークの依存関係が取り除かれる仕組みを学んでください。

このシリーズの他の記事を見る

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


はじめに

この記事では、連載第 1 回で開発した注文用アプリケーションを再び取り上げます。今回このアプリケーションでバンドルの作成およびパッケージ化に使用するのは、Spring DM (Spring Dynamic Modules) です。アプリケーションのクライアントがサービス・コンポーネントを起動することで注文を処理し、サーバー・コンポーネントが注文 ID を出力します。この記事を参考に、Spring DM の概念、そして Spring DM を Felix ベースの OSGi コンテナーで使用する方法を理解してください。

システム要件

この記事のサンプル・コードを実行するには、お使いのマシンに必ず以下のソフトウェアをインストールして、セットアップしてください。

  • Java 5 以降
  • Ant ビルド・ツール
  • Felix バイナリー・ディストリビューション 1.0.4
  • Spring DM バンドル

上記のディストリビューションをインストールしたら、以下の環境変数を設定します (一例として、set ANT_HOME=C:\apache-ant-1.7.0)。

  • JAVA_HOME (Java 用)
  • ANT_HOME (Ant 用)

続いて PATH 環境変数に以下の内容を追加します。

  • JAVA_HOME\bin
  • ANT_HOME\bin

Spring DM

Spring DM には、Spring アプリケーションを OSGi 環境にデプロイする際に役立つ JAR またはバンドルが含まれています。Spring DM ベースのアプリケーションは、OSGi 環境が提供するサービスを利用することができます。そして Spring DM ベースのアプリケーションによって、OSGi をベースとしたアプリケーションの開発には、容易さと利便性がもたらされます。Spring DM は、以下のメリットを OSGi 環境に提供します。

  • アプリケーションを動的なバンドルにモジュール化し、これらのバンドルにランタイム・サービスを提供します。
  • モジュールにバージョン管理機能を提供します。
  • モジュールは、動的に検出して使用可能なサービスとしてバンドルされます。
  • モジュールは動的にインストール、更新、およびアンインストールすることができます。
  • アプリケーションを OSGi モジュールとして構成する際に、Spring フレームワークを活用します。
  • ビジネス・ロジックと構成を切り離し、それによって開発を簡単かつ便利にします。

注文用アプリケーションの再登場

今回も、連載第 1 回で開発した注文用アプリケーションを取り上げます。ご存知のとおり、現時点ではクラスが OSGi フレームワークに密接に結合されていますが、今回は Spring DM を使用して、この密結合を取り除き、クラスを単純な POJO にします。以下に記載する改良後の OrderClient.java を見てください。


リスト 1. クライアント・コンポーネント (OrderClient)
package order.client;

import order.OrderService;

public class OrderClient {

	private OrderService orderService;

	public void setOrderService(OrderService orderService) {
		this.orderService = orderService;
	}

	public void removeService() {
		this.orderService = null;
	}

	public void start() {
		orderService.processOrder();
	}

	public void stop() {
		System.out.println("Bundle stopped");
    }

}
			

上記では、OSGi フレームワークの依存関係が完全に取り除かれています。このクラスは、start() メソッドで注文を処理するだけの単純な POJO です。ServiceTracker クラスは一切使用されていません。


リスト 2. OrderService の実装
package order.impl;

import order.OrderService;

public class OrderServiceImpl implements OrderService {

	public void start() {
		System.out.println("Order Service registered");
    }

	public void stop() {
		System.out.println("Order Service stopped");
    }

	public void processOrder() {
		System.out.println("Order id: ORD123") ;
	}
}
			

上記の OrderServiceImpl も同じく単純な POJO で、processOrder() メソッドが用意されています。ここには、OSGi コア・コンポーネントとの関連付けはありません。また、クライアントとサービスのいずれのクラスにしても、BundleActivator を実装していません。バンドルのライフサイクルはこの場合、Spring DM によって管理されます。

以上の単純な 2 つの POJO は、どのようにして OSGi コンポーネントとして機能するのでしょうか。その仕掛けは Spring 構成ファイルにあります。OSGi のパーツを定義する場所は、この構成ファイルです。

しかし XML ファイルを定義する前に、マニフェスト・ファイルに加えなければならない変更がいくつかあります。その変更とは、マニフェストにインポート・パッケージを組み込み、これらのインポート・パッケージに Spring DM ファイルを組み込むことです。こうすることによって、Spring が確実に OSGi バンドルの管理とライフサイクルを引き継ぐことになります。以下のコード・スニペットに、サービスおよびクライアントのマニフェスト・ファイルを記載します。


リスト 3. サービスのマニフェスト・ファイル
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Order Service
Bundle-SymbolicName: orderservice
Bundle-Version: 1.0.0
Import-Package: org.springframework.beans.factory.xml, 
org.springframework.aop, org.springframework.aop.framework, 
org.aopalliance.aop, org.xml.sax, org.osgi.framework, 
org.springframework.osgi.service.importer.support, 
org.springframework.beans.propertyeditors, 
org.springframework.osgi.service.exporter.support, 
org.springframework.osgi.service.exporter
Export-Package: order
			


リスト 4. クライアントのマニフェスト・ファイル
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Order Service Client
Bundle-SymbolicName: orderclient
Bundle-Version: 1.0.0
Import-Package: org.springframework.beans.factory.xml, 
org.springframework.aop, org.springframework.aop.framework, 
org.aopalliance.aop, org.xml.sax, org.osgi.framework, 
org.springframework.osgi.service.importer.support, 
org.springframework.beans.propertyeditors, 
org.springframework.osgi.service.importer, 
org.springframework.osgi.service.exporter.support, 
order
			

サービス・コンポーネントとクライアント・コンポーネントのそれぞれに、2 つの XML ファイルを作成します。サービスについては、orderservice.xml という XML ファイルで注文サービスの実装 Bean を定義し、orderservice-osgi.xml という XML ファイルで注文サービス・インターフェースを定義して、その実装を参照します。クライアントについても同じように、XML ファイルで注文クライアント Bean を定義して、注文サービス・コンポーネントを参照します。サービスおよびクライアントの XML ファイルは、それぞれの META-INF/spring フォルダー内に配置します。以下のコードは、サービスの XML ファイルです。


リスト 5. サービスの XML ファイル (orderservice.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans 
  http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean name="orderService" class="order.impl.OrderServiceImpl"/>

</beans>
			


リスト 6. サービスの OSGi XML ファイル (orderservice.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans 
  http://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean name="orderService" class="order.impl.OrderServiceImpl"/>
</beans>
			

実際には、1 つの XML ファイルに Bean と OSGi 定義の両方を指定しても構いません。2 つの別個のファイルを作成する必要はありませんが、ここではインターフェース定義と構成を区別するために 2 つのファイルに分けています。2 つのファイルに分けて、それぞれのファイルを管理および保守するほうが、作業としては楽になります。Spring ベースの構成ならではの長所は、注文サービスの Bean を OSGi コンテナーの外部でテストできることです。

実際に OSGi コンテナー外部でテストできるようにするには、関連する Spring DM の jar ファイルを Felix にインストールする必要があります。


リスト 7. Felix 構成の部分
felix.auto.start.1= \
 file:/felix-1.0.4/bundle/org.apache.felix.shell-1.0.1.jar \
 file:/felix-1.0.4/bundle/org.apache.felix.shell.tui-1.0.1.jar \
 file:/felix-1.0.4/bundle/org.apache.felix.bundlerepository-1.0.3.jar \
 file:/osgi_spring/order/springlib/aopalliance.osgi-1.0-SNAPSHOT.jar \
 file:/osgi_spring/order/springlib/jcl104-over-slf4j-1.4.3.jar \
 file:/osgi_spring/order/springlib/log4j.osgi-1.2.15-SNAPSHOT.jar \
 file:/osgi_spring/order/springlib/org.apache.felix.main-1.0.1.jar \
 file:/osgi_spring/order/springlib/slf4j-api-1.4.3.jar \
 file:/osgi_spring/order/springlib/slf4j-log4j12-1.4.3.jar \
 file:/osgi_spring/order/springlib/spring-aop-2.5.1.jar \
 file:/osgi_spring/order/springlib/spring-beans-2.5.1.jar \
 file:/osgi_spring/order/springlib/spring-context-2.5.1.jar \
 file:/osgi_spring/order/springlib/spring-core-2.5.1.jar \
 file:/osgi_spring/order/springlib/spring-osgi-core-1.0.2.jar \
 file:/osgi_spring/order/springlib/spring-osgi-extender-1.0.2.jar \
 file:/osgi_spring/order/springlib/spring-osgi-io-1.0.2.jar
			

上記に示した内容からわかるように、Felix 構成ファイルには Spring DM バンドルが定義されます。Spring DM バンドルをダウンロードして、任意のフォルダーに配置してください。jar ファイルを適切なフォルダーに配置したら、Felix 構成ファイルに関連するエントリーを作成し、これらの jar ファイルを Felix の起動時にインストールするように指定します。

この設定が完了すれば、Felix ランタイム環境にクライアント・バンドルとサービス・バンドルをインストールする手順に進めます。これらのバンドルのインストールが済むと、バンドルを起動および停止できるようになり、OSGi バンドルでの場合と同じ結果が表示されます。ただし Felix ベースの OSGi とは異なり、この場合にバンドルのライフサイクルを管理しているのは Spring DM です。

まとめ

この記事で説明したように、Spring フレームワークを利用することで OSGi アプリケーションの開発は一層単純かつ効率的になります。OSGi 自体でも、Java アプリケーションをバンドルする方法が大幅に変わってきます。OSGi を Spring と組み合わせることで、エンタープライズ規模のアプリケーション開発に確固たる基盤を提供することができます。



ダウンロード

内容ファイル名サイズダウンロード形式
OSGi Spring Order Applicationosgispring_orderapp.zip11KBHTTP

ダウンロード形式について


参考文献

著者について

Naveen Balani's photo

Naveen Balani は、IBM India Software Labs (ISL) のアーキテクトで、ISLでは WebSphere Business Services Fabric の設計および開発作業のリーダーを務めています。新しい技術の調査に積極的な彼は、IBM developerWorks ではお馴染みの寄稿者でもあり、今まで Web サービス、ESB、JMS、SOA、アーキテクチャー、オープンソース・フレームワーク、セマンティック Web、J2ME、パーベイシブ・コンピューティング、Spring、Ajax、そしてさまざまな IBM 製品についての記事を書いています。また、『Beginning Spring Framework 2』、『Getting Started with IBM WebSphere Business Services Fabric V6.1』の共著者でもあります。

Rajeev Hathi's photo

Rajeev Hathi は、J2EE プラットフォームのソフトウェア・コンサルタントとして働いてきました。彼の専門は、J2EE をベースとしたアプリケーションの設計です。得意とするサブジェクトは Web サービスで、Web サービスを通じて SOA の概念を適用し、吸収するという方法を好んでいます。趣味は、スポーツ観戦とロックを聴くことです。

不正使用の報告のヘルプ

不正使用の報告

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


不正使用の報告のヘルプ

不正使用の報告

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


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=SOA and Web services, Open source
ArticleID=385313
ArticleTitle=OSGi と Spring: 第 2 回 Felixを使用して OSGi の Spring バンドルを作成し、デプロイする
publish-date=03302009
author1-email=naveenbalani@rediffmail.com
author1-email-cc=
author2-email=rajeevhathi@gmail.com
author2-email-cc=

タグ

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

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

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

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

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