2011年11月06日

OSGI入門 その1 〜Hello OSGI World〜


・OSGIとは何なのか?
OSGIとはOpen Services Gateway initiativeの略であり、もともとはサービスゲートウェイの仕様を
策定する目的で作られたものでした。サービスゲートウェイとして想定されるのはホームサービス
ゲートウェイによるネットワーク家電の制御プラットフォームなどが挙げられますが、実際はそれ以外
にも広く応用されている技術です。Javaプログラムを組む人ならば、まず間違いなくEclipseを使用した
経験があるでしょうが、このEclipse IDEもOSGIプラットフォームを採用しています。

OSGIはJavaベースのプラットフォームであり、その主な特徴として、JavaVMを上げ下げすることなしに
「bundle」と呼ばれるプログラムコンポーネントを起動/停止/インストール/アンインストールすること
ができます。Eclise IDEで言うところのbundle(バンドル)とはpluginのことでです。我々はEclipseの
「新規ソフトウェアのインストール」からネットワークを通じて自由にpluginをインストールできますが
それを可能にしているのがこのOSGIということになります。

・まずはバンドルを作ってみよう!
と、まあ堅苦しい話はこれくらいにして、実際に手を動かしてみましょー。
まずは恒例のHello Worldから。あ、すでにEclipseは入っている前提で話します。持ってないひとはインスコしてね。
私はEclipse3.6使ってます。

Eclipseにはバンドルを作成するための仕組みが標準で存在します。それが「プラグイン・プロジェクト」です。
パッケージエクスプローラから[新規]-[その他]-[プラグイン・プロジェクト]でプロジェクトを作成します。
プロジェクト名:HelloOSGIBundle
実行ターゲット:Equinox
で、次へをクリック、Activatorを生成のところで、パッケージ名やクラス名を好きに設定する。(別にdefaultで
もいいですけど)

これでとりあえず空のバンドルが作成できました。プロジェクトの中を見ていくと、まず先ほど作成した
Activatorがあるはずです。このActivatorはバンドルが起動/停止された際に実行する処理を記述するクラスです。
すなわち
Activator#stop()
Activator#start()
ですね。

ではまず、ここにそれぞれこんな感じで実装しましょう。



	public void start(BundleContext bundleContext) throws Exception {
		Activator.context = bundleContext;

		System.out.println("Hello OSGI World!!!");
	}


	public void stop(BundleContext bundleContext) throws Exception {
		Activator.context = null;

		System.out.println("Good Bye OSGI World!!!");
	}


これで準備完了ですが、ひとつ重要なことがあります、プロジェクトの中にMETA-INF/MANIFEST.MFというファイル
がありますね?このファイルはこのバンドル自体の情報やバンドル間の依存関係など様々なことを規定するものです。
今後非常に重要になってくるファイルです。ダブルクリックすると、そのファイルの内容だけでなく、ファイルに設定
するためのGUIも用意されていることに気づくはずです。便利ですね。ただ、いまはまだ使いません。

・さっそく実行!
実行は[実行]-[実行構成]から[OSGI フレームワーク]で右クリックし、[新規構成]を選択します。
すると、なんだかごちゃごちゃとした画面が出てきますが、まず[バンドル]欄に注目してください。以下の二つのグループが
あると思います。
・ワークスペース・・・あなたのEclipseワークスペース内のバンドル群です。今回はHelloOSGIBundleですね。
・ターゲット・プラットフォーム・・・OSGIフレームワークである「Equinox」が提供するバンドル群です。
今回は作成したHelloOSGIBundleとosgi本体であるorg.eclipse.osgiしか要りませんので以下のように構成します。
ちなみに、右側にある必須バンドルの追加ボタンやOnly show selectedを使うと便利ですよ。

1.png

したらば、実行ボタンをおします。
以下のように表示されたでしょうか?

osgi> Hello OSGI World!!!

これでまずは実行できました。でもこれじゃpublic static void main(String args[])でHello Worldしたのと変わりま
せんね。なのでosgiっぽいことしてみましょう。

・状態表示してみる
結果が表示されているコンソールにカーソルをあわせ、Enterキーを押してみてください。すると
osgi>
という文字列が現れると思います。その状態で「ss」と入力し、Enterキーを押してください。
こんなんが現れたと思います。

Framework is launched.

id State Bundle
0 ACTIVE org.eclipse.osgi_3.6.2.R36x_v20110210
1 ACTIVE HelloOSGIBundle_1.0.0.qualifier


すでにお気づきでしょうが、この「ss」は現在のOSGIプラットフォームにインストールされているバンドルの一覧表示
コマンドです。このコマンド自体はOSGIフレームワークによって異なります。equinoxではssですね。

idというのはこのOSGIフレームワーク上で1つのバンドルに一意でふられるIDです。操作もこのIDを通じて行います。
Stateはバンドルの状態を意味します。Activeは稼動中ってことですね。

・バンドルを停止してみる
んじゃ、バンドルを止めてみましょう。以下のコマンドを打ってください。

osgi>>stop 1


すると、こんな感じで表示されるはずです。

Good Bye OSGI World!!!


先ほど実装したActivator#stop()が呼ばれたわけですね。ただしあくまでも、バンドルが停止しただけですので、
JavaVMは落ちていません。つまりこれがOSGIの特徴なわけです。

・バンドルを更新してみる
では、こんどはバンドル実装を修正して、更新をかけてみましょう。さきほどのSystem.out.printlnに
適当な文字列を追加します。修正が完了して、コンパイルが通ったら以下を入力。
osgi> update 1


んで、そのままstartコマンドを打つと・・・

osgi> start 1
update - Hello OSGI World!!!


「update - 」の文字列が追加されてますね!!しつこいですがJAVAVMはあがりっぱなしです。
※今回は停止している前提で書きますが、もし、updateをかけたバンドルが起動していた場合、
updateの際、自動的に停止/起動されます。

次回からはしばらく、OSGIの肝であるサービスのお話になります。
ではまた。
posted by sandman at 18:07| Comment(0) | Java | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。