Eclipse の OSGi コンソールを探る

Eclipse を駆動するコンソールの使い方とその拡張方法

この記事で、OSGi (Equinox) コンソールとして知られる隠れた宝石について学び、この珠玉の宝を Eclipse 開発者のツールボックスに加える方法、そしてこのコンソールを拡張してツールボックスにさらに追加する方法についても学んでください。

Chris Aniszczyk, Software Engineer, IBM

Chris AniszczykChris AniszczykはIBM Lotusのソフトウェア技術者であり、IBMのExtreme Blueインターンシップ・プログラムの卒業生でもあります。オープンソースの信奉者であり、現在はGentoo Linux (http://www.gentoo.org) ディストリビューションに取り組んでいます。またEMFT(Eclipse Modeling Framework Technology)プロジェクトのコミッターでもあります。



2007年 1月 30日

Eclipse は、V3.0 で大きな飛躍を遂げました。それまでのバージョンで使用されていた不安定な Eclipse プラグイン技術に代わり、OSGi (Open Services Gateway Initiative) を選んだためです。プラグインのインストールと動作は見かけ上、以前と変わらなかったため、この変更はほとんどユーザーに見えないものでした。

図 1. Eclipse に含まれるプラグイン
図 1. Eclipse に含まれるプラグイン

Eclipse は OSGi でビルドされるようになったことから、図 1 に示されたプラグインは本格的 OSGi バンドルです (図 2 に、OSGi コンソールを使用して Eclipse インスタンス内で実行中のバンドルを示しています)。OSGi の使用によって Eclipse は業界が支持するオープン標準をサポートするようになり、現在は、セキュリティー、HTTP サービス、useradmin など、OSGi が提供する機能を活用できます。Eclipse の OSGi への賭けは功を奏したようで、Eclipse の普及はますます進み、プラグイン同士の競合が報告されることも少なくなっています。

図 2. Eclipse に含まれる OSGi バンドル
図 2. Eclipse に含まれる OSGi バンドル

Eclipse、Equinox、OSGi の関係

OSGi Alliance は OSGi 技術に取り組む独立した非営利団体で、機能的には Eclipse Foundation とよく似ています。OSGi Alliance が関与しているのは、OSGi 技術を記述する仕様の作成です。OSGi 技術は手短に言うと、アプリケーション開発を対象としたサービス指向、コンポーネント・ベースのプラットフォームで、さまざまなインプリメンテーションがこれらの仕様に基づいています。なかでも人気が高いのが Eclipse による Equinox です。他に人気のある OSGi インプリメンテーションとしては、Apache の Felix プロジェクトがあります。

ここから先、この記事では Eclipse および 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 バンドル・ウィザード
図 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 フレームワーク起動構成
図 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. 最初の起動
図 5. 最初の起動

バンドルの起動と停止

OSGi 動的環境では、バンドルを簡単に起動、停止できます。これをテストするために、上記の単純な Hello バンドルを使ってみましょう。stop コマンドでバンドルを停止し、それから start コマンドでバンドルを起動してください。すると、図 6 のような結果が表示されます。

図 6. バンドルの起動と停止
図 6. バンドルの起動と停止

バンドルの追加、除去、更新

OSGi システムが持つもう 1 つの際立った特徴は、Java™ 仮想マシンを再起動せずに実行中の OSGi インスタンスでバンドルを追加、除去、そして更新できることです。図 7 に、バンドルをインストールおよびアンインストールした様子を示します。

図 7. バンドルのインストールおよびアンインストール
図 7. バンドルのインストールおよびアンインストール

診断

バンドルまたはプラグインを起動しようとして、初期化中にエラーが発生することがあります。そんな場合に備えて、OSGi コンソールにはバンドルの初期化に関する問題をデバッグするのに役立つ diag コマンドが用意されています。図 8 の例では、Hello バンドルを起動する際にエラーが発生しています。このエラーを診断するためにバンドルに対して diag コマンドを実行したところ、ランタイム環境にインポート済みパッケージが欠けていることが分かりました。

図 8. コンソールの診断
図 8. コンソールの診断

便利なコンソール・コマンドの要約

表 1. 便利なコンソール・コマンド
コマンド内容
startID またはシンボル名で指定されたバンドルを起動します。
stopID またはシンボル名で指定されたバンドルを停止します。
installURL で指定されたバンドルを現行インスタンスに追加します。
uninstallURL で指定されたバンドルを現行インスタンスから除去します。
updateURL で指定されたバンドルを現行インスタンスに対して更新します。
active現行インスタンスでアクティブになっているすべてのバンドルをリストします。
headersID またはシンボル名で指定されたバンドルのヘッダーをリストします。
ss現行インスタンスに登録されているすべてのバンドルの簡易ステータスをリストします。
services <filter>適切なフィルターで指定されたサービスをリストします。
diagID またはシンボル名で指定されたバンドルで診断を実行します。

他にも多数の OSGi コマンドが用意されていますが、なかでも上記にリストしたコマンドが特に重宝すると思います。すべてのコマンドのリストを表示するには、コンソールで help と入力してください。


コンソールを拡張する

Eclipse の長所はその拡張性にあると言われていますが、OSGi コンソールも同じように拡張できます。この拡張性は重要です。なせなら、開発者はある種のサービスをユーザーに提供しますが、コンソールを拡張することで、そのサービスに関する問題を上級ユーザーや管理者がデバッグできるようになるからです。

お馴染みの拡張ポイントを使用する代わりに、このコンソールには単純な拡張メカニズムが備わっています。ここからは、いくつかの例を取り上げて OSGi コンソールの拡張性を説明していきます。

OSGi 流のuname

UNIX® フレーバーのシステムで作業したことのある人なら誰でも、uname コマンドを知っているはずです。uname コマンドは、名前、バージョンをはじめとする実行中のオペレーティング・システムの関連情報を表示します。UNIX にさまざまなフレーバーがあるように、OSGi のコンテキストでは OSGi コンソールにもさまざまなインプリメンテーションがあります (Apache FelixKnopflerfish など)。

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 コンソール
図 10. Quake コンソール

ダウンロード

内容ファイル名サイズ
Source codeos-ecl-osgiconsole.hello.zip49KB

参考文献

学ぶために

  • OSGi Alliance にアクセスして、OSGi (Open Services Gateway Initiative) の詳細を調べてください。
  • Eclipse による Equinox の OSGi インプリメンテーションについて学んでください。
  • Eclipse.org PDE は、Eclipse が提供するプラグイン開発環境に関する絶好の情報源です。
  • Apache Felix も OSGi インプリメンテーションの 1 つで、Apache ライセンスで使用できます。
  • Knopflerfish も OSGi インプリメンテーションです。
  • Eclipse コンファレンスの代表格、Eclipsecon 2007 について調べてください。
  • Eclipse プラットフォームの優れた紹介記事「Eclipse Platform 入門」を参照してください。
  • IBM developerWorks の Eclipse project resources にアクセスして、Eclipse の詳細を学んでください。
  • developerWorks technical events and webcasts で最新情報を入手してください。
  • 世界中で近日中に予定されている IBM オープン・ソース開発者を対象とした会議、見本市、ウェブ放送やその他の イベントをチェックしてください。
  • オープン・ソース技術を使用して開発し、IBM の製品と併用するときに役立つ広範囲のハウツー情報、ツール、およびプロジェクト・アップデートについては、developerWorks Open source ゾーンを参照してください。
  • ソフトウェア開発者を対象とした興味深いインタービューや討論については、developerWorks ポッドキャストをチェックしてください。

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

  • Eclipse Platform をダウンロードして、さっそく Eclipse を使い始めてください。
  • IBM alphaWorksEclipse 技術の最新ダウンロードを参照してください。
  • IBM ソフトウェアの試用版を使用して、次のオープン・ソース開発プロジェクトを革新してください。ダウンロード、あるいは DVD で入手できます。

議論するために

  • Eclipse に関する質問は、まず Eclipse Platform newsgroups で話し合ってください (このリンクをクリックすると、デフォルトUsenet ニュース・リーダー・アプリケーションが起動して eclipse.platform が開きます)。
  • Equinox newsgroups には、Eclipse の OSGi インプリメンテーションに関する情報が満載されています (このリンクをクリックすると、デフォルト Usenet ニュース・リーダー・アプリケーションが起動して eclipse.technology.equinox が開きます)。
  • Eclipse newsgroups には Eclipse の使用方法や拡張方法に興味を持つ人々を対象としたさまざまな資料があります。
  • developerWorks blogs から developerWorks コミュニティーに加わってください。

コメント

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=Open source
ArticleID=246361
ArticleTitle=Eclipse の OSGi コンソールを探る
publish-date=01302007