レベル: 初級 Chris Aniszczyk (zx@us.ibm.com), Software Engineer, IBM
2007年 1月 30日 この記事で、OSGi (Equinox) コンソールとして知られる隠れた宝石について学び、この珠玉の宝を Eclipse 開発者のツールボックスに加える方法、そしてこのコンソールを拡張してツールボックスにさらに追加する方法についても学んでください。
Eclipse は、V3.0 で大きな飛躍を遂げました。それまでのバージョンで使用されていた不安定な Eclipse プラグイン技術に代わり、OSGi (Open Services Gateway Initiative) を選んだためです。プラグインのインストールと動作は見かけ上、以前と変わらなかったため、この変更はほとんどユーザーに見えないものでした。
図 1. Eclipse に含まれるプラグイン
Eclipse は OSGi でビルドされるようになったことから、図 1 に示されたプラグインは本格的 OSGi バンドルです (図 2 に、OSGi コンソールを使用して Eclipse インスタンス内で実行中のバンドルを示しています)。OSGi の使用によって Eclipse は業界が支持するオープン標準をサポートするようになり、現在は、セキュリティー、HTTP サービス、useradmin など、OSGi が提供する機能を活用できます。Eclipse の OSGi への賭けは功を奏したようで、Eclipse の普及はますます進み、プラグイン同士の競合が報告されることも少なくなっています。
図 2. Eclipse に含まれる OSGi バンドル
 |
Eclipse、Equinox、OSGi の関係
OSGi Alliance は OSGi 技術に取り組む独立した非営利団体で、機能的には Eclipse Foundation とよく似ています。OSGi Alliance が関与しているのは、OSGi 技術を記述する仕様の作成です。OSGi 技術は手短に言うと、アプリケーション開発を対象としたサービス指向、コンポーネント・ベースのプラットフォームで、さまざまなインプリメンテーションがこれらの仕様に基づいています。なかでも人気が高いのが Eclipse による Equinox です。他に人気のある OSGi インプリメンテーションとしては、Apache の Felix プロジェクトがあります。
|
|
ここから先、この記事では Eclipse および OSGi に関する実用的知識があることを前提とします。この前提にそぐわない場合は、OSGi コンソールの世界に足を踏み入れる前に、Scott Delap の記事「Understanding how Eclipse plug-ins work with OSGi」を読むことをお勧めします。
自分自身の OSGi バンドルを作成する
この冒険の第一歩は、プラグイン開発環境 (PDE: Plug-in Development Environment) を使用して、Eclipse で単純な OSGi バンドルを作成することです。それには、PDE (File > New > Project > Plug-in Project) を使って新しいプラグイン・プロジェクトを作成する必要があります。プラグイン・プロジェクトを新規作成するプロセスでは、確実に正しいオプションを設定してください。まず、プラグインのターゲット・プラットフォーム (Target Platform) には、OSGi フレームワークである Equinox を選択します。さらに、プラグイン・プロジェクトの作成を簡潔にするため、PDE が提供する Hello OSGi Bundle テンプレートを使用します (図 3 を参照)。これで、この記事で使用するバンドルが用意できます。
図 3. PDE の Hello OSGi バンドル・ウィザード
Hello OSGi コンソール
Hello バンドルが用意できたら、次はフレームワークを起動して OSGi コンソールを表示します。フレームワークは、PDE の OSGi フレームワーク起動構成を利用して起動できます。まず、起動構成メニューに進み (Run > Run ...)、Hello バンドルの OSGi フレームワーク起動構成を作成します (図 4 を参照)。この際、Hello バンドルを実行するのに必要なバンドルだけが選択されるようにしてください。それには、起動構成で Deselect All をクリックして Hello バンドルのチェック・マークを外し、それから Add Required Plug-ins をクリックすると簡単です。
図 4. PDE の OSGi フレームワーク起動構成
 |
プラグインとバンドル、その違いは?
Eclipse 開発者たちが集まってアプリケーションのハッキング (解析や改造など) をしている地下室を歩き回ると、プラグインとバンドルという魔法の言葉が無造作に使われているのを耳にするはずです。プラグインとバンドルに違いはあるのでしょうか。マーケティング部長からすると、この 2 つの用語の意味はまったく同じで、バンドルはプラグイン、プラグインはバンドルです。これでは行き詰まってしまいますが、Uber オタクの視点からは、ある特定の違いがあります。正確に言うと、Eclipse プラグインは拡張レジストリーを活用する OSGi バンドルです (つまり、バンドルのルートには plug-in.xml があります)。一方、OSGi バンドルは、その言葉通り OSGi バンドルです。
|
|
起動構成が完成して準備が整うと、起動構成ダイアログの Run ボタンを使ってバンドルを起動できるようになります。バンドルが起動されると、図 5 のような結果が表示されるはずです。
図 5 を見ると、Hello バンドルが起動されたこと (コンソールに表示された HelloWorld メッセージが、バンドルが起動されたことを示します)、そして osgi> プロンプトが表示されていることがわかります。OSGi プロンプトは DOS プロンプトや Bash プロンプトと同様で、ここには OSGi インスタンスに作用するコマンドを入力できます。この図では、すべての簡易ステータスを表示する ss コマンドを実行しています。このコマンドを標準 Eclipse インスタンスでも実行してみると、あらゆるものが実は OSGi バンドルであることがわかるはずです。標準 Eclipse インスタンスの OSGi コンソールは、-console パラメーターを使って Eclipse を起動するだけで表示できます。
図 5. 最初の起動
バンドルの起動と停止
OSGi 動的環境では、バンドルを簡単に起動、停止できます。これをテストするために、上記の単純な Hello バンドルを使ってみましょう。stop コマンドでバンドルを停止し、それから start コマンドでバンドルを起動してください。すると、図 6 のような結果が表示されます。
図 6. バンドルの起動と停止
バンドルの追加、除去、更新
OSGi システムが持つもう 1 つの際立った特徴は、Java™ 仮想マシンを再起動せずに実行中の OSGi インスタンスでバンドルを追加、除去、そして更新できることです。図 7 に、バンドルをインストールおよびアンインストールした様子を示します。
図 7. バンドルのインストールおよびアンインストール
診断
バンドルまたはプラグインを起動しようとして、初期化中にエラーが発生することがあります。そんな場合に備えて、OSGi コンソールにはバンドルの初期化に関する問題をデバッグするのに役立つ diag コマンドが用意されています。図 8 の例では、Hello バンドルを起動する際にエラーが発生しています。このエラーを診断するためにバンドルに対して diag コマンドを実行したところ、ランタイム環境にインポート済みパッケージが欠けていることが分かりました。
図 8. コンソールの診断
便利なコンソール・コマンドの要約
表 1. 便利なコンソール・コマンド
| コマンド | 内容 |
|---|
|
start
| ID またはシンボル名で指定されたバンドルを起動します。 |
|---|
|
stop
| ID またはシンボル名で指定されたバンドルを停止します。 |
|---|
|
install
| URL で指定されたバンドルを現行インスタンスに追加します。 |
|---|
|
uninstall
| URL で指定されたバンドルを現行インスタンスから除去します。 |
|---|
|
update
| URL で指定されたバンドルを現行インスタンスに対して更新します。 |
|---|
|
active
| 現行インスタンスでアクティブになっているすべてのバンドルをリストします。 |
|---|
|
headers
| ID またはシンボル名で指定されたバンドルのヘッダーをリストします。 |
|---|
|
ss
| 現行インスタンスに登録されているすべてのバンドルの簡易ステータスをリストします。 |
|---|
|
services <filter> | 適切なフィルターで指定されたサービスをリストします。 |
|---|
|
diag
| ID またはシンボル名で指定されたバンドルで診断を実行します。 |
|---|
他にも多数の OSGi コマンドが用意されていますが、なかでも上記にリストしたコマンドが特に重宝すると思います。すべてのコマンドのリストを表示するには、コンソールで help と入力してください。
コンソールを拡張する
Eclipse の長所はその拡張性にあると言われていますが、OSGi コンソールも同じように拡張できます。この拡張性は重要です。なせなら、開発者はある種のサービスをユーザーに提供しますが、コンソールを拡張することで、そのサービスに関する問題を上級ユーザーや管理者がデバッグできるようになるからです。
お馴染みの拡張ポイントを使用する代わりに、このコンソールには単純な拡張メカニズムが備わっています。ここからは、いくつかの例を取り上げて OSGi コンソールの拡張性を説明していきます。
OSGi 流のuname
UNIX® フレーバーのシステムで作業したことのある人なら誰でも、
uname
コマンドを知っているはずです。uname コマンドは、名前、バージョンをはじめとする実行中のオペレーティング・システムの関連情報を表示します。UNIX にさまざまなフレーバーがあるように、OSGi のコンテキストでは OSGi コンソールにもさまざまなインプリメンテーションがあります (Apache Felix、Knopflerfish など)。
OSGi コンソールを拡張する上で最も重要な部分は、CommandProviderinterface です。コンソールの拡張に興味があるクライアントは、これをインプリメントしなければなりません。このインプリメントに続くステップは、「_」を名前に持つメソッドを開始することです。これらのメソッドは、コンソールで使用できるコマンドを表します。拡張に必要なのはこれだけです。その一例としてリスト 1 を見てください。
リスト 1. OSGi の uname
public class Activator implements BundleActivator, CommandProvider {
private BundleContext context;
public void start(BundleContext context) throws Exception {
this.context = context;
Hashtable properties = new Hashtable();
context.registerService\
(CommandProvider.class.getName(), this, properties);
}
public String getHelp() {
StringBuffer buffer = new StringBuffer();
buffer.append("\tuname - returns framework information\n");
return buffer.toString();
}
public void stop(BundleContext context) throws Exception {}
public void _uname(CommandInterpreter ci) throws Exception {
String vendor = context.getProperty(Constants.FRAMEWORK_VENDOR);
String version = context.getProperty(Constants.FRAMEWORK_VERSION);
String osName = context.getProperty(Constants.FRAMEWORK_OS_NAME);
String osVersion = context.getProperty(Constants.FRAMEWORK_OS_VERSION);
System.out.println("\n " + vendor + " "
+ version + " (" + osName + " "
+ osVersion + ")");
}
}
|
バンドルと実存主義
バンドルがその存在に疑問を持つことはないかもしれませんが、バンドルが定番のバンドルであるか、または Eclipse プラグインであるかを表示する単純な例を紹介します (前にも言ったように、両方ともバンドルであることに変わりはありません)。リスト 2 は前の例に新しいメソッドを追加し、getHelp() メソッドを変更したものです。
リスト 2. getHelp() の変更
...
public String getHelp() {
StringBuffer buffer = new StringBuffer();
buffer.append("\twhatami - \
returns whether the bundle is a plug-in or not\n");
buffer.append("\tuname - returns framework information\n");
return buffer.toString();
}
public void _whatami(CommandInterpreter ci) throws Exception {
try {
long id = Long.parseLong(ci.nextArgument());
Bundle bundle = context.getBundle(id);
URL url = bundle.getEntry("plugin.xml");
if(url != null) {
System.out.println("\n I'm \
(" + bundle.getSymbolicName() + ") a plug-in");
} else {
System.out.println("\n I'm \
(" + bundle.getSymbolicName() + ") not a plug-in");
}
} catch (NumberFormatException nfe) {
System.out.println("\n Error processing command");
}
}
...
|
上記の作業の結果を図 9 に示します。
図 9. コンソールの拡張結果
まとめ
この記事では、OSGi コンソールの使用方法と拡張方法を説明するとともに、コンソールについて考察し、コンソールの拡張例をいくつか取り上げました。OSGi コンソールを十分に理解できた今、日々の Eclipse 開発でこのコンソールをどのように使用すればいいかがわかったことでしょう。このコンソールを使用するうちに、Doom や Quake で遊んだ記憶も甦ってくるかもしれません。
図 10. Quake コンソール
ダウンロード | 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|
| Source code | os-ecl-osgiconsole.hello.zip | 49KB | HTTP |
|---|
参考文献 学ぶために
製品や技術を入手するために
議論するために
著者について  | 
|  | Chris AniszczykはIBM Lotusのソフトウェア技術者であり、IBMのExtreme Blueインターンシップ・プログラムの卒業生でもあります。オープンソースの信奉者であり、現在はGentoo Linux (http://www.gentoo.org) ディストリビューションに取り組んでいます。またEMFT(Eclipse Modeling Framework Technology)プロジェクトのコミッターでもあります。 |
記事の評価
|