プラグイン開発入門: 第 1 回 開発の基本

Eclipse のプラグイン開発の基本を学ぶ

Eclipse でのプラグイン開発は、少しばかり芸術のようなところがあります。プラグインの概念、特に OSGi と Eclipse でのプラグインの概念を初めて学ぶ人にとっては、プラグインの作成を補助するために Eclipse に用意されている無数のツールを学ぶことは非常に大きな負担かもしれません。この記事の目的は、いくつかのベスト・プラクティスを適切に交えながら、プラグイン開発のための基本的なスキルを学ぶ手助けをすることです。

Chris Aniszczyk, Software Engineer, IBM 

Chris AniszczykChris Aniszczyk は IBM Lotus の Eclipse コミッターとして、OSGi 関連の開発に取り組んでいます。最近主に専念しているのは、Eclipse のプラグイン開発環境 (PDE) を改善し、IBM Lotus 社内で Eclipse の支持者を増やすことです。 オープン・ソースの熱烈な支持者である彼は、オープン・ソースを広めることを専門としています。自身のブログでは Eclipse の魅力を説き、Eclipse Foundation の役員会では Eclipse コミッターの代表も務めています。ここをクリックすれば、彼は冷たい飲み物を口にしながら、オープン・ソースと Eclipse に関する議論にいつでも応じてくれます。



2008年 2月 12日

この「プラグイン開発入門」シリーズの記事では、プラグインの開発に関するすべてを学びます。しかし始める前に、プラグインを開発するために適切な環境が用意できていることを確認する必要があります。最初のステップは、PDE (Plug-in Development Environment) が含まれている Eclipse のディストリビューションを Eclipse.org からダウンロードすることです。ここでは、Eclipse Classic の最新バージョンをダウンロードすることをお勧めします。このシリーズでは、Eclipse V3.4 (M5) のマイルストーン・リリースを使います。それが終われば準備は完了です。(「参考文献」には、Eclipse が初めての人のために、Eclipse とその背景情報をどこから入手すればよいかを説明してあります。)

この記事ではプラグイン開発を理解しやすくするために、図 1 に詳述するワークフローに従います。このシリーズの第 1 回では、このワークフローの最初の 5 つのステップに焦点を当てます。残りの 2 つのステップについては、リッチ・クライアント・アプリケーションに焦点を当てる第 2 回で説明します。

図 1. プラグイン開発のワークフロー
プラグイン開発のワークフロー

OSGi とは何か

Eclipse は V3.0 において、それ以前のバージョンに見られた貧弱な Eclipse プラグイン技術の置き換えとして OSGi を選択することで、大きな飛躍を遂げました。OSGi Alliance は、独立の非営利団体として OSGi 技術に責任を持っています。OSGi Alliance は役割としては Eclipse Foundation と似ています。OSGi Alliance は OSGi 技術を記述する仕様の作成を行います。簡単に言えば、OSGi 技術はアプリケーション開発のための、サービス指向でプラグイン・ベースのプラットフォームを提供します。こうした仕様を基に、さまざまな実装が作成されています。最もよく使われる実装の 1 つが、Eclipse による OSGi 仕様の実装である Equinox です。(背景情報は「参考文献」を参照してください。)

プラグイン作成の詳細に入る前に、プラグインとは正確に何なのかを説明しましょう。技術的に言えば、プラグインは自己完結で自己記述型の JAR (Java™ Archive) です。自己完結である理由は、プラグインはそのプラグインを実行するために必要なコードとリソースを含んでいるからです。自己記述型である理由は、プラグインの中に、そのプラグインは何のプラグインなのか、そのプラグインの要求は何か、またそのプラグインはどんなことをしてくれるのかを説明する情報が含まれているからです。一般的にプラグインの中には、2 つの記述子ファイル、MANIFEST.MF と plugin.xm があります。

まず、プラグインを作成する

プラグイン開発のワークフローの最初の部分では、プラグイン・プロジェクトを作成します。Eclipse の場合には、プラグイン・プロジェクトの作成は New >Project... というメニュー・オプションを選択すれば簡単に行うことができます。表示されるウィザードの中で、作成したいプロジェクトのタイプとして Plug-in Project を選択します。

図 2. New Plug-in Project ウィザード
New Plug-in Project ウィザード

他の Eclipse プロジェクトの場合とまったく同じように、このウィザードはプロジェクト名を決めるように促しますので helloworld と入力してください。また、ターゲット・プラットフォームを選択するオプションもあります。この場合のターゲット・プラットフォームは単に、Eclipse のバージョンをターゲットとするのか、あるいは Equinox のような OSGi フレームワークをターゲットとするのかを意味します。ここでは簡単のために Eclipse のバージョン 3.3 をターゲットとします。New Plug-in Project ウィザードの中の次のページでは、プラグインの内容を指定します。

図 3. プラグインの内容
プラグインの内容

ウィザードの Plug-in Content のページでは、このプラグインが Eclipse に準拠するように、フォームを完成する必要があります。Plug-in ID はプラグイン固有の ID を表すフィールドです。同じ ID を他のプラグインが共有することはできません。Plug-in Version は 4 つのセグメント (3 つの整数とストリング) から成り、それぞれのセグメントには major.minor.service.qualifier という名前が付いています (「参考文献」の Eclipse Plug-in Versioning ガイドを参照)。Plug-in Name は単に人間が読むための名前を表しています。Plug-in Provider フィールドは人間が読むためのストリングであり、そのプラグインの作成者を表します。Execution Environment (EE) フィールドは、簡単な言葉で言えば、このバンドルを実行できる最低限の JRE を表します (「参考文献」を参照)。

このウィザードでは、プラグイン・アクティベーターを生成するオプションを選択することができます。プラグイン・アクティベーターは単純に、プラグインのライフサイクルを制御するクラスです (起動停止メソッドと考えてください)。通常、プラグイン・アクティベーターは、さまざまな設定を行い、またプラグインが必要なくなった時に適切にリソースを解放します。ここでは、アクティベーターを生成することにし、このプラグインが UI に貢献するようにし、そして RCP (Rich Client Platform) アプリケーションを作成することにします (「参考文献」を参照)。

プラグインを作成するための最後のステップでは、新しいプラグインのベースとなるテンプレートを選択します (図 4)。プラグインの作成に慣れてくると、このステップは通常スキップされます。しかし、初心者には何らかの出発点が必要であり、Eclipse の SDK には出発点として役立つテンプレートが数多く含まれています。ここでは、ビュー・アプリケーションを持つ、基本的な Hello World を選択します。

図 4. プラグインのテンプレート
プラグインのテンプレート

変更

MANIFEST.MF の内部

MANIFEST.MF ファイルの中にあるさまざまなヘッダーに興味がある方は、OSGi Alliance から入手できる OSGi の仕様を読んでください (「参考文献」を参照)。

この前のステップを完了すると、新しいプラグインがワークスペースに作成されます。今度は、この新しいプラグインを扱う際に使用するエディター (図 5) が表示されます。このエディターの中で最初に表示されるページは Overview ページです。このページには、変更可能なプラグインの識別情報が、プラグインの中で編集可能なさまざまな項目を記述した部分と共に含まれています。例えば、先ほど図 4 に示すテンプレートを使って定義した識別子 (ID) のフィールドとバージョンのフィールドが表示されます。

図 5. プラグイン・エディター (Overview ページ)
プラグイン・エディター (Overview ページ)

拡張機能と拡張ポイント

豊富な拡張ポイント

Eclipse V3.3 の時点で、Eclipse SDK の中には 200 を超える拡張ポイントがあります。SDK の中にある拡張可能なもの (つまり拡張ポイント) の一覧を見たい場合には、Eclipse Foundation に用意された「Platform Extension Points」というタイトルの文書を調べてみてください (「参考文献」を参照)。

プラグイン開発の次のステップは、拡張機能を追加することです。ただしその詳細に入る前に、拡張可能な Eclipse プラグインを開発する際に重要な 2 つのトピック、つまり拡張機能と拡張ポイントについてまず理解しましょう。簡単な例えを使うと、拡張機能はプラグ (電源コンセント) と考えることができ、拡張ポイントはソケット (コンセントの差込口) と考えることができます。拡張ポイントはそれぞれ固有であり、従う必要がある内容を定めています。例えば、Eclipse には org.eclipse.ui.editors という拡張ポイント (ソケット) が同梱されており、この拡張ポイントを利用することで独自のエディター (プラグ) を提供することが可能になります。

このケースでは、Eclipse のツールバーに寄与する新しい拡張機能を作成します。これを実現するためには、拡張ポイント org.eclipse.ui.actionSets 用のテンプレートを使います (このテンプレートは、概念としてはプラグインを作成する際に使用したテンプレートと似ています)。プラグイン・エディターの Overview ページから、Extension/Extension Point Content (「拡張 / 拡張ポイント・コンテンツ) セクションの中の Extensions (拡張) リンクを選択します。Add... をクリックし、そしてデフォルトがすべて入力された org.eclipse.ui.actionSets テンプレートを選択します (図 6)。

図 6. Extension テンプレート
Extension テンプレート

ランタイム

私達が作成するプラグインで重要な点として、このプラグインが自己記述型であることが挙げられます。このプラグインが記述しなければならないことの 1 つが、このプラグインが提供してくれる内容です。Eclipse の場合、これらはエクスポートされるパッケージ (exported packages) と呼ばれます。私達のプラグインでは、エクスポートされるパッケージの内容を決め、他のプラグインがこうしたパッケージの中を覗いたときに、そのプラグインが私達のプラグインに依存するかどうかを判断できるようにします。また、エクスポート・パッケージを内部用とマーキングし、私達が問題のパッケージを API と見なしていないことをプラグイン開発者に伝えることもできます。エクスポート・パッケージを指定するためには、マニフェスト・エディターの Runtime ページを使います。

図 7. Runtime ページ
Runtime ページ

依存関係

豊富なプラグイン

Eclipse のエコシステムには利用可能なプラグインが非常に多数あるため、途方に暮れてしまうかもしれません。そこで、プラグインを探す場合には次の 2 つのサイトから始めるようにお勧めします。最初のサイトは Eclipse Foundation のプロジェクト・リストであり、2 番目は EPIC (Eclipse Plug-in Central) です (「参考文献」を参照)。

この前のセクションでは、プラグインはそのプラグインの機能を公開するために何をする必要があるかを説明しましたが、もし皆さんが別のプラグインから、そうやって公開された機能を使いたい場合、どのようにしてそれを表現するのでしょう。Eclipse の場合には、これは依存関係 (dependencies) と呼ばれます。最も単純なケースでは、プラグインは他のプラグインに依存することができます。例えば Eclipse の中で独自のエディターを作成したい場合には、org.eclipse.ui.editors というプラグインに依存する必要があります。依存関係を指定するためには、プラグイン・エディターの Dependencies ページから行う必要があります。

図 8. Dependencies ページ
Dependencies ページ

個々のプラグインに依存することに加えて、プラグインからエクスポートされるパッケージに依存するように選択することもできることに注意してください (Dependencies ページの Imported Packages (インポート済みパッケージ) セクションを見てください)。これはやや高度な方法であり、特定の実装にプラグインを結びつけたくない場合に便利です。例えば、XML パーサーを提供する com.company.xml.parser というパッケージに依存する場合を考えてみてください。そして、異なる環境用に、同じ XML パーサーの 2 つの異なる実装を提供する 2 つのプラグイン (例えば com.company.xml.parser.mobilecom.company.xml.parser.desktop など) が必要な場合に、この方法が適用できます。

ソース・エディター

Runtime ページと Dependencies ページは、主に MANIFEST.MF ファイルの中で指定されているものを単に視覚的に表現したものです。PDE は、このファイルのソースを手動で編集したいという上級ユーザー用に、プラグインのマニフェスト定義の中にある各種ヘッダーを編集するための、コード補完機能付きソース・エディターを提供しています。

図 9. ソースの編集
ソースの編集

テストとデバッグ

プラグイン開発の次のステップは、テストとデバッグです。プラグインをテストするために、Eclipse と PDE には自己ホストという概念があります。自己ホストの意味は単純であり、現在ワークスペースで作業対象としているプラグインを使って、実際にプラグインをエクスポートしたりデプロイしたりせずに新しい Eclipse を起動できるということです。新しい Eclipse を起動するために必要なことは、Overview ページの Testing (テスト) セクションから別のランタイム・ワークベンチを起動することだけです (Overview ページの中の Launch an Eclipse application (Eclipse アプリケーションの起動) リンクを見てください)。数秒後、新しいワークベンチが起動し、プラグインのサンプル・アクションがツールバーに表示されるはずです。

図 10. Eclipse での自己ホスト
Eclipse での自己ホスト

テスト駆動型のプラグイン開発

実際にプラグインの開発を始める前に、テストすることから始めたい場合には、テスト以外に何も含まないプラグイン・プロジェクトを作成することができます。プラグインの中に含まれるテストを実行するための、Plug-in JUnit Test と呼ばれる特別な起動構成があります。

自己ホスト型のプラグインをデバッグ・モードで起動するためには、Overview ページの Testing セクションの中の Launch an Eclipse application in debug mode (Eclipse アプリケーションをデバッグ・モードで起動) リンクをクリックします。実際にプラグインをデバッグするためには、必要なブレークポイントを設定する必要があります。もし Eclipse でのデバッグを初めて行う場合には、入門用の資料として developerWorks の記事「Eclipse Platformを使ってデバッグする」(「参考文献」を参照) を読むようにお勧めします。

プラグインの起動あるいはデバッグに関して詳細なオプションを設定したい場合には、Launch Configurations (起動構成) ダイアログを使います (このダイアログを呼び出すためにはメニュー・オプション Run > Run Configurations... を使います)。この場合のプラグインに必要な起動構成タイプは (起動するものは実際に Eclipse アプリケーションなので) 「Eclipse Application」と指定します (図 11)。起動構成の中では引数などを設定することができ、またどの JRE を使ってアプリケーションを起動するかを制御することができます。

図 11. 起動構成のダイアログ
起動構成のダイアログ

ストリングを外部化する

プラグイン開発での一般的なステップが国際化です。プラグインが使用可能になり、また複数のグループによってテストされる段階に達すると、そのプラグインは必ず異なる国の言語で実行できること、という要求を受けることがよくあります。幸い、プラグイン関係のストリングを外部化するために必要な作業の量は、ごくわずかです。PDE には、プラグインの Overview ページで右クリックしてメニュー項目 Externalize Strings... (ストリングの外部化) を選択すると呼び出されるウィザードがあります。この項目を選択すると、外部化に関係するすべてのストリングを表示するウィザードが表示されます。

図 12. Externalize Strings ウィザード
Externalize Strings ウィザード

実際には、ここで行っていることは、プラグインに対する plugin.properties ファイル (外部化されるストリングを含みます) を生成し、Bundle-Localization ヘッダーを MANIFEST.MF ファイルに追加しているだけです。Bundle-Localization ヘッダーを使うことで、外部化されるストリングの名前とオプションとしての場所を簡単に定義することができます。この場合の Bundle-Localization は「plugin」ですが、これはさまざまなロケールに対するストリングが plugin.properties (図 13) や plugin_fr.properties あるいは plugin_de.properties などのファイルの中にあることを表します。ファイル名のアンダーバーの後にある文字は、ロケールを表します。

図 13. plugin.properties ファイル
plugin.properties ファイル

これで終わりです。プラグインの国際化を行うために必要なことはこれだけです。詳しい資料として、古くなっていますが相変わらず重要な記事として、Eclipse コーナーにある「Eclipseプラグインの国際化対応」と「How to Test Your Internationalized Eclipse Plug-In」(「参考文献」を参照) を読むことをお勧めします。


マニフェストを整理する

プラグイン開発の次のステップは、いくつかのベスト・プラクティスを使ってマニフェスト・ファイル (つまり MANIFEST.MF と plugin.xml) を整理することです。PDE には、Overview ページの Exporting セクションから呼び出すことのできる、便利なウィザードが用意されています。このウィザードが起動されると (図 14)、調整可能なさまざまなオプションが表示されます。デフォルトは非常に妥当なものですが、例えば plugin.properties ファイルの中に使用されていないキーが確実にないようにすることができる便利なオプションなどもあります。

図 14. Organize Manifests ウィザード
Organize Manifests ウィザード

まとめ

この記事の使命は全体として、ベスト・プラクティスを交えながらプラグイン開発の基本を紹介することでした。ここではその使命を、サンプル・プラグインを作成し、典型的なプラグイン開発のワークフローを説明することで達成しました。いったんこのワークフローを学ぶと、プラグインの開発はずっと楽になり、また Organize Manifests ウィザードなどのベスト・プラクティスを使うとプラグインの管理もさらに容易になります。第 2 回では、リッチ・クライアント・アプリケーションを開発するために利用できるツールの使い方と、図 1 に示したプラグイン開発のワークフローの残りの部分を説明することに焦点を当てます。

参考文献

学ぶために

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

議論するために

  • Eclipse に関する質問を議論するための最初の場所として、Eclipse newsgroups があります (このリンクをクリックすると、デフォルトの Usenet ニュース・リーダー・アプリケーションが起動し、eclipse.platform が開きます)。
  • Eclipse Platform 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=294127
ArticleTitle=プラグイン開発入門: 第 1 回 開発の基本
publish-date=02122008