Eclipseプラグインの開発

プラグインの作成、デバッグ、およびインストール方法

この記事で、David Gallardoは、Plug-in Development Environmentのコード生成ウィザードを使ってEclipseプラグインを作成する方法を示します。ランタイム・ワークベンチでプラグインを実行してデバッグする方法と、完成したプラグインをEclipseにインストールする方法について学びます。Davidはまた、プラグインのパッケージ化に関連した問題について説明します。これには、バージョン情報の保守、プラグイン・フラグメント形式での機能のアップグレード、およびプラグインの結合による完成された機能の作成が含まれます。

David Gallardo, Software consultant, IBM

David Gallardoはソフトウェアの国際化対応、Java Webアプリケーション、データベース開発を専門とする独立系のソフトウェア・コンサルタントおよび著述家です。15年以上の間、彼はプロのソフトウェア・エンジニアであり、多くのオペレーティング・システム、プログラム言語、およびネットワーク・プロトコルについての経験があります。彼の最近の経験には、企業間 (B2B) e-commerce企業TradeAccess, Inc.における先進的なデータベースおよび国際化対応の開発が含まれています。その前まで、彼はLotus Development CorporationのProduct Developmentグループにおけるシニア・エンジニアであり、Dominoを含むLotus製品にUnicodeおよび国際言語サポートを提供するクロス・プラットフォーム・ライブラリーの開発に貢献しました。



2002年 12月 01日

プラグイン・ベースのアーキテクチャー

IBMがオープン・ソース・コミュニティーに寄贈した開発フレームワークであるEclipse Platformは、IBMが開発に費やしたと言われている金額 (4000万ドル) によってではなく、その支出によって姿を現したもの (成熟し、設計が優れている、拡張可能なアーキテクチャー) により、注目に値します。Eclipseの貴重な点は、拡張可能な統合開発環境を作成するためのオープン・ソース・プラットフォームであるという点です。このプラットフォームを使えば、この環境や他のツールにシームレスに統合されるツールをだれでも構築できます。

Eclipseにツールをシームレスに統合するための鍵は、プラグイン です。小規模なランタイム・カーネルを除き、Eclipse内にあるすべてのものはプラグインになっています。つまり、独自に開発したプラグインは、他のプラグインとまったく同じようにしてEclipseに統合されます。この点において、すべての機能は対等に作成されます。

ただし、一部のプラグインは対等性において他のものよりも高いレベルにあります。WorkbenchとWorkspaceはEclipse Platformに欠くことのできない2つのプラグインであり、図1で示されているように、ほとんどのプラグインが使用する拡張ポイントを提供します。プラグインが機能するには、プラグインする (差し込む) ための拡張ポイントが必要です。

図1. Eclipse WorkbenchおよびWorkspace: 不可欠なプラグイン・サポート
図1. Eclipse WorkbenchおよびWorkspace: 不可欠なプラグイン・サポート

Workbenchコンポーネントに含まれる拡張ポイントをプラグインで使えば、Eclipseユーザー・インターフェースを拡張し、メニュー選択項目やツールバー・ボタンを追加したり、さまざまなタイプのイベントを通知したり、新規ビューを作成したりできます。Workspaceコンポーネントに含まれる拡張ポイントを使えば、プロジェクトやファイルなどのリソースと対話できます。

もちろん、WorkbenchとWorkspaceは、他のプラグインによって拡張できる唯一のEclipseコンポーネントではありません。この他にも、Debugコンポーネントを使えば、プラグインはプログラムを起動したり、実行中のプログラムと対話したり、エラーを処理したりするなど、デバッガーを構築するのに必要なすべての機能を実行できます。Debugコンポーネントは、特定のタイプのアプリケーションでは必要ですが、ほとんどのアプリケーションでは不要です。

また、Teamコンポーネントを使えば、Eclipseリソースはバージョン管理システム (VCS) と対話できます。ただし、Debugコンポーネントと同様、VCS用のEclipseクライアントを構築しないかぎり、Teamコンポーネントの機能は拡張も強化もされません。

最後に、Helpコンポーネントを使えば、アプリケーションに関するオンライン資料やコンテキストに依存したヘルプを提供できます。ヘルプ資料が本格的なアプリケーションに不可欠な部分であることは否定できませんが、プラグインの機能に不可欠の部分ではありません。

上記の各コンポーネントが提供する拡張ポイントについては、Eclipse Platform Helpで文書化されています。Platform Plug-in Developer Guideのリファレンス・セクションを参照してください。APIリファレンスのWorkbenchセクションを見てみると、最初は気が遠くなることでしょう。ここでは、使用可能な多くの拡張ポイントの詳細に飛び込む代わりに、単純なプラグインとそのコンポーネントを調べることによって足を少し踏み入れるだけにします。


簡単なプラグイン入門

プラグインを作成する最も簡単な方法は、Plug-in Development Environment (PDE) を使用することです。PDEは、Java Development Tooling (JDT) IDEとともに、Eclipseの標準の拡張機能として付属しています。PDEには、プラグイン (これから考える"Hello, World"サンプルを含む) を作成するのに役立つウィザードが備わっています。

Eclipseメニューから「File」=>「New」=>「Other」を選択し (またはCtrl-Nを押し)、「Select」ダイアログの左側にある「Plug-in Development」ウィザードを選択します。「Select」ダイアログの右側では、「Plug-in Project」を選択します。「Next」を押します。次の画面では、プロジェクト名を入力します (ここではcom.example.hello を使用しました)。「Next」を再び押します。次の画面では、プラグインIDがプロジェクト名に対応していることに注意してください。プロジェクト名をプラグインIDとして使用すると、このプラグインが他のプラグインの名前と競合する可能性が最小になります。「Next」を再び押します。次の画面では、最初のプラグイン・コードを手動で作成するかコード生成ウィザードを実行するかを選択できます。図2のように、デフォルト (コード生成ウィザード) のままで、"Hello, World"を選択し、「Next」を押します。

図2. "Hello, World"コード生成ウィザードの使用
図2. Hello, World、コード生成ウィザードの使用

次の画面では追加情報が要求されます。この画面の情報に注意してください。プラグイン名、バージョン番号、プロバイダー名、およびクラス名が含まれています。これらはプラグインに関する重要な情報なので、後で考えます。ウィザードが提供するデフォルトを受け入れることができます。「Next」を押します。次の画面では、パッケージ名、クラス名、およびメッセージ・テキストについてデフォルトを受け入れます。「Add the action set to the resource perspective」チェック・ボックスをチェックされたままにしておきます。「Finish」を押します。

完了するために他の特定のプラグインを使用可能にする必要があるとウィザードから通知されたら、「OK」を押します。

しばらくすると、ウィザードが完了し、図3のようにcom.example.hello という名前の新規プロジェクトがワークスペースに作成されます。

図3. PDEパースペクティブ: Welcome to Hello Plug-in
図3. PDEパースペクティブ: Welcome to Hello Plug-in

ワークベンチの左にあるPackage Explorerには、ウィザードが作成したものの一部が概説されています。ほとんどの項目はそれほど興味深くありません。プロジェクトのクラスパスに含まれるいくつかの.jar ファイル (プラグインとJavaランタイムで必要なEclipseクラスを含む)、ツールバー・ボタンのグラフィックを含むアイコン・フォルダー、自動化された構築スクリプトで使用される変数を含むbuild.properties ファイルがあります。

ここで最も興味深いのはsrcフォルダーであり、プラグインのソース・コードとplugin.xml (プラグインのマニフェスト・ファイル) が含まれています。まず、plugin.xmlを見てみます。


プラグインのマニフェスト・ファイル

プラグインのマニフェスト・ファイルplugin.xmlには、Eclipseがプラグインをフレームワークに統合するために使用する記述情報が含まれています。デフォルトでは、plugin.xmlはプラグインの最初の作成時にマニフェスト・エディターでオープンされます。エディターの下部にあるタブにより、プラグインに関するさまざまな情報セットを選択できます。「Welcome」タブには「Welcome to Hello Plug-In」というメッセージが表示され、使用されているテンプレートやEclipseがプラグインをインプリメントする際のヒントについて短く説明されています。「Source」タブを選択すると、plugin.xmlファイルの完全なソースが表示されます。

プラグインのマニフェスト・ファイルのさまざまな部分を見てみましょう。最初にあるのは、プラグインに関する一般情報であり、名前、バージョン番号、インプリメントするクラス・ファイルの名前、および.jar ファイル名が含まれます。

リスト1. プラグインのマニフェスト・ファイル -- 一般情報
<?xmlversion="1.0" encoding="UTF-8"?>
<plugin
id="com.example.hello"
name="Hello Plug-in"

version="1.0.0"
provider-name="EXAMPLE"
class="com.example.hello.HelloPlugin">
<runtime>
<library name="hello.jar"/>

</runtime>

次に、このプラグインで必要なプラグインがリストされます。

リスト2. プラグインのマニフェスト・ファイル -- 必要なプラグイン
<requires>  <import plugin="org.eclipse.core.resources"/>
<import plugin="org.eclipse.ui"/>
</requires>

最初にリストされているプラグインorg.eclipse.core.resources はワークスペース・プラグインですが、今回のプラグインでは必要ありません。2番目のプラグインorg.eclipse.ui はワークベンチです。このワークベンチ・プラグインが必要なのは、続く拡張タグで示されているようにこの拡張ポイントの2つを拡張するためです。

最初の拡張タグにはポイント属性org.eclipse.ui.actionSets があります。アクション・セット (action set) とは、プラグインがワークベンチのユーザー・インターフェースに追加する提供物 (つまり、メニュー、メニュー項目、およびツールバー) のグループのことです。アクション・セットはユーザーが簡単に管理できるように提供物をグループ化します。たとえば、Helloプラグインのメニューおよびツールバー項目はResource Perspectiveで表示されます。これは、コード生成ウィザードの実行時に選択したからです。ユーザーは、「Window」=>「Customize Perspective」メニュー・オプションを使ってResourceパースペクティブで表示される項目から「Sample Action Set」を除去することにより、これを変更できます。

図4. Resourceパースペクティブのカスタマイズ
図4. Resourceパースペクティブのカスタマイズ

アクション・セットには2つのタグが含まれています。メニュー・タグ は項目をワークベンチ・メニューに表示する位置と方法を記述し、アクション・タグ は項目が実行する内容を記述します。特に、アクション・タグはアクションを実行するクラスを識別します。このクラスは上でリストしたプラグイン・クラスとは異なることに注意してください。

リスト3. アクション・セット
<extension
point="org.eclipse.ui.actionSets">
<actionSet
label="Sample Action Set"
visible="true"
id="com.example.hello.actionSet">
<menu
label="Sample &Menu"
id="sampleMenu">
<separator
name="sampleGroup">
</separator>
</menu>
<action label="&Sample Action"
icon="icons/sample.gif"
class="com.example.hello.actions.SampleAction"
tooltip="Hello, Eclipse world"
menubarPath="sampleMenu/sampleGroup"
toolbarPath="sampleGroup"
id="com.example.hello.actions.SampleAction">
</action>
</actionSet>
</extension>

メニューおよびアクション属性の多くの目的は非常に明確です。たとえば、ツールチップ・ヘルプを提供したり、ツールバー項目のグラフィックを識別したりします。アクション・タグにあるmenubarPath にも注意してください。この属性は、メニュー・タグで定義されているメニュー項目のうち、アクション・タグで定義されているアクションを起動するものを識別します。このポイントおよび他のワークベンチ拡張ポイントについての詳細は、Platform Plug-in Developer Guide (特に『Plugging into the workbench』の章) を参照してください (このガイドはEclipseのヘルプ・メニューから使用できます)。

2番目の拡張タグは、プラグインをResourceパースペクティブに追加するという決定の結果として生成されました。このタグにより、プラグインはEclipseがプラグインを最初に起動してロードしたときにResourceパースペクティブに追加されます。

リスト4. 拡張タグ
<extension  point="org.eclipse.ui.perspectiveExtensions">
<perspectiveExtension
targetID="org.eclipse.ui.resourcePerspective">
<actionSet
id="com.example.hello.actionSet">
</actionSet>
</perspectiveExtension>
</extension>
</plugin>

この最後の拡張が省略されていると、ユーザーは「Window」=>「Customize Perspective」を使ってプラグインをResource (または他の) パースペクティブに追加しなければなりません。


プラグインのソース・コード

コード生成ウィザードが生成した2つのJavaソース・ファイルは、PDE Package Explorerでsrcフォルダーをオープンすることによって表示できます。最初のソース・ファイルHelloPlugin.java はプラグイン・クラスであり、AbstractUIPlugin 抽象クラスを拡張します。HelloPlugin はプラグインのライフ・サイクルを管理し、より拡張されたアプリケーションでは、ダイアログ・ボックス設定やユーザー設定などの情報を管理します。HelloPlugin は、それほど多くのことを行いません。

リスト5. HelloPlugin
packagecom.example.hello.actions;
import org.eclipse.ui.plugin.*;
import org.eclipse.core.runtime.*;
import org.eclipse.core.resources.*;
import java.util.*;
/**
* The main plugin class to be used in the desktop.
*/
public class HelloPlugin extends AbstractUIPlugin {
//The shared instance.
private static HelloPlugin plugin;
//Resource bundle.
private ResourceBundle resourceBundle;
/**
* The constructor.
*/
public HelloPlugin(IPluginDescriptor descriptor) {
super(descriptor);
plugin = this;
try {
resourceBundle= ResourceBundle.getBundle(
"com.example.hello.HelloPluginResources");
} catch (MissingResourceException x) {
resourceBundle = null;
}
}
/**
* Returns the shared instance.
*/
public static HelloPlugin getDefault() {
return plugin;
}
/**
* Returns the workspace instance.
*/
public static IWorkspace getWorkspace() {
return ResourcesPlugin.getWorkspace();
}
/**
* Returns the string from the plugin's resource bundle,
* or 'key' if not found.
*/
public static String getResourceString(String key) {
ResourceBundle bundle= HelloPlugin.getDefault().getResourceBundle();
try {
return bundle.getString(key);
} catch (MissingResourceException e) {
return key;
}
}
/**
* Returns the plugin's resource bundle,
*/
public ResourceBundle getResourceBundle() {
return resourceBundle;
}
}

2番目のソース・ファイルSampleAction.java には、マニフェスト・ファイル内のアクション・セットで指定されているアクションを実行するクラスが含まれています。SampleAction がインプリメントするIWorkbenchWindowActionDelegate インターフェースにより、Eclipseはプラグイン用のプロキシーを使用でき、プラグインが本当に必要になるまでプラグインをロードする必要がありません (この最適化により、プラグインがロードされるときのメモリーおよびパフォーマンスの問題を最小にすることができます)。IWorkbenchWindowActionDelegate インターフェース・メソッドにより、プラグインはプロキシーと対話できます。

リスト6. IWorkbenchWindowActionDelegateインターフェース・メソッド
package com.example.hello.actions;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.jface.dialogs.MessageDialog;
/**
* Our sample action implements workbench action delegate.
* The action proxy will be created by the workbench and
* shown in the UI. When the user tries to use the action,
* this delegate will be created and execution will be * delegated to it.
* @see IWorkbenchWindowActionDelegate
*/
public class SampleAction implements IWorkbenchWindowActionDelegate {
private IWorkbenchWindow window;
/**
* The constructor.
*/
public SampleAction() {
}
/**
* The action has been activated. The argument of the
* method represents the 'real' action sitting
* in the workbench UI.
* @see IWorkbenchWindowActionDelegate#run
*/
public void run(IAction action) {
MessageDialog.openInformation(
window.getShell(),
"Hello Plug-in",
"Hello, Eclipse world");
}
/**
* Selection in the workbench has been changed. We * can change the state of the 'real' action here
* if we want, but this can only happen after * the delegate has been created.
* @see IWorkbenchWindowActionDelegate#selectionChanged
*/
public void selectionChanged(IAction action, ISelection selection) {
}
/**
* We can use this method to dispose of any system
* resources we previously allocated.
* @see IWorkbenchWindowActionDelegate#dispose
*/
public void dispose() {
}
/**
* We will cache window object in order to
* be able to provide parent shell for the message dialog.
* @see IWorkbenchWindowActionDelegate#init
*/
public void init(IWorkbenchWindow window) {
this.window = window;
}
}

プラグインの実行とデバッグ

Eclipse用のプラグインを開発するとき、テストとデバッグを行うためにEclipseを停止してプラグインとともに再始動しなければならないとしたら、やっかいでしょう。うれしいことに、EclipseのPDEは、ワークベンチの別個のインスタンスにインストールしなくてもプラグインを実行できるセルフホスト開発環境となっています。

Helloプラグインを実行するには、「Run」=>「Run As」=>「Run-time Workbench」を選択して、図5で示されているように、プラグインのメニュー選択項目とツールバーが追加された、Workbenchの別のインスタンスを始動します。

図5. ランタイム・ワークベンチで実行されているHelloプラグイン
図5. ランタイム・ワークベンチで実行されているHelloプラグイン

プラグインを活動化するには、ツールバー・ボタンをクリックするか「Sample Menu」メニューから活動化します。いずれの方式でも、「Hello Plug-in」というタイトルのボックスに、「Hello, Eclipse world」という内容と消去するための「OK」ボタンが表示されます。

プラグインをデバッグするには同様に、「Run」=>「Debug As」=>「Run-time Workbench」を選択します。このとき、プラグインが2番目のワークベンチ・インスタンスで実行されている間に、オリジナルのワークベンチでソース・コードをステップ実行したり、変数を調べたりできます。

プラグインをテストしてリリースの準備ができたら、Eclipseでのインストールに適したパッケージ化を行う必要があります。


プラグインのパッケージ化

Eclipseは、始動時にプラグイン・ディレクトリーを参照することにより、ロードするプラグインを判別します。プラグインをインストールするには、プラグイン・ディレクトリーにサブディレクトリーを作成し、プログラム・ファイルとマニフェスト・ファイルをそこにコピーする必要があります。必須というわけではありませんが、ディレクトリー名はプラグインのIDに下線とバージョン番号を組み合わせたものにすることをお勧めします。たとえば、EclipseがC:\eclipseにインストールされているとしたら、次のようなディレクトリーを作成します。

C:\eclipse\plugins\com.example.hello_1.0.0.

Javaアプリケーションの標準と同様、プログラム・ファイルは.jar ファイルにアーカイブする必要があります。プラグイン・マニフェスト・ファイルにこのエントリーが含まれていたことを思い出すかもしれません。

<runtime> <library name="hello.jar"/>
</runtime>

hello.jar ファイルを作成するには、プロジェクト名を強調表示してEclipseメニューから「File」=>「Export」を選択することにより、プラグイン・ファイルをエクスポートします。宛先として「JAR file」を選択し、「Next」を押し、JARファイル用に作成したディレクトリーに移動します。次に、plugin.xmlファイルもこのディレクトリーにコピーする必要があります。ここでも「File」=>「Export」メニュー選択項目を使用できます (ただし、宛先として「File System」を選択してください)。

プラグインをインストールするために必要なのはこれですべてですが、新しいプラグインが認識されるようにEclipseを停止して再始動する必要があります。ヘルプ・メニューから「About Eclipse Platform」を選択すれば、インストールされたプラグインに関する情報 (バージョン番号を含む) を知ることができます。画面に表示されるボタンの1つは「Plug-in Details」です。リストをスクロールダウンして、Helloプラグインとそのバージョン番号を見付けてください。


プラグイン・バージョンの更新

ディレクトリー名にバージョン番号を含める目的は、複数のバージョンのプラグインが同じマシンに共存できるようにすることです (1度にロードされるのは1つだけです)。更新されたバージョンのHelloプラグインを作成することにより、この仕組みを調べることができます。たとえば、plugin.xmlファイル内のバージョン番号を"1.0.1"に変更し、SampleAction.java 内のテキストを"New and improved Hello, Eclipse world"に変更します。Eclipseメニューから「Project」=>「Rebuild All」を選択します。次に、プロジェクト・ファイルをJARとして新しいプラグイン・ディレクトリー (たとえばcom.example.hello_1.0.1) にエクスポートします。改訂されたplugin.xmlファイルを同じディレクトリーにコピーします。Eclipseを停止して再始動すると、更新されたプラグインだけがロードされます。


プラグインのフラグメントとフィーチャー

Eclipseはプラグインで構成されていますが、Eclipse用のプラグインの開発を考慮するときに重要な他の2つのレベルのコンポーネントがあります。それは、プラグインのフラグメントとフィーチャーです。

プラグイン・フラグメント は、名前が示しているように、完成されたプラグイン (ターゲット・プラグイン) の一部を形成します。フラグメントが提供する機能は、ターゲット・プラグインの機能にマージされます。フラグメントを使えば、さまざまな言語用にプラグインをローカライズしたり、完全な新規リリースを必要とせずに既存のプラグインにフィーチャーを少しずつ追加したり、プラットフォーム固有の機能を提供したりできます。多くの点で、フラグメントはプラグインと同一です。主な違いは、フラグメントにはプラグイン・クラスがないことです。フラグメントのライフ・サイクルはターゲット・プラグインによって管理されます。加えて、fragment.xmlと呼ばれるフラグメントのマニフェスト・ファイルには、ターゲット・プラグインのIDとバージョン番号、およびフラグメントのIDとバージョン番号がリストされます。

一方、プラグイン・フィーチャー には、コードがまったく含まれません。Eclipseアーキテクチャーの用語において、フィーチャーとは、関連したプラグインのグループを統合製品にパッケージしたものです。たとえば、JDTは、Javaエディター、デバッガー、およびコンソールなどのプラグインで構成されるフィーチャーです。feature.xmlと呼ばれるマニフェスト・ファイルは、フィーチャー・アーカイブを記述します。とりわけ、このマニフェスト・ファイルには、フィーチャーを構成するプラグインや他のリソースへの参照、フィーチャーが更新される方法に関する情報、著作権情報、およびライセンス情報が含まれます。

Eclipseでは、1次フィーチャー・セット によってEclipse Platformのルック・アンド・フィールが設定されます。1次フィーチャーは、スプラッシュ画面やEclipseの身元を示す他の特性を決定します。Eclipseでは1次フィーチャーを1つだけ使用できます。このようにして (プラグインのセットを作成し、フィーチャーにパッケージ化し、そのフィーチャーを1次フィーチャーとすることにより)、Eclipseのブランドを変更したり、まったく新しい別の製品を作成したりできます。Eclipse.orgからダウンロードしたとき、デフォルトの1次フィーチャーはeclipse.org.platform です。


次のステップ

このプラグイン入門は、プラグインで行えることのほんの一部を扱っているにすぎません。プラグインについて学ぶための最も優れた参考文献は、Eclipseのヘルプ・メニューから使用できるPlug-in Developer's Guide です。この資料には、プログラミング・ガイド、Eclipse APIおよびプラグイン拡張ポイントのリファレンス、Eclipse.orgから入手可能なプログラミング例のガイド、およびよく尋ねられる質問のリストが含まれます。別の優れた参考文献は、Eclipseそのもののソース・コードです。関心の度合に応じて、ビューやエディターなどのさまざまなワークベンチ機能の拡張例や、SWT (EclipseのグラフィックスAPI) の使用例を調べることもできます。加えて、下の参考文献も学習に役立ちます。

参考文献

コメント

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, Java technology
ArticleID=237190
ArticleTitle=Eclipseプラグインの開発
publish-date=12012002