eRCP(embedded Rich Client Platform)は、EclipseのRCP(Rich Client Platform)で実現された進歩を埋め込み空間に反映するための方法として登場しました。
eRCPは、次のようなコンポーネントから構成されています。
- eSWT(Standard Widget Toolkit): コア・コンポーネントと拡張コンポーネント、そしてモバイル・エクステンション・コンポーネントがあります。
- eJFace
- eWorkbench
- eUpdate
この記事では、こうした各コンポーネントを、必要に応じてコード例を使いながら説明して行きます。
eSWT(embedded Standard Widget Toolkit)は、Java™のグラフィックス・ツールキットとして知られているSWT(Standard Widget Toolkit)のサブセットです。eSWTには、ユーザー・インターフェース(UI)の構成ブロックとして一般的に使われる、一連のコントロールやパネル、ウィジェットなどが用意されています。また、元々SWTに含まれていたものに加えて、モバイル・エクステンションという新しいコンポーネントが導入されています。モバイル・エクステンションはIBMとNokia、Motorolaの共同設計による仕様であり、主にPDAやスマートフォンのようなモバイル・デバイスを対象としています。
eSWTの設計は、その「いとこ」であるSWTとはプラットフォーム依存性の面で異なっています。SWTはプラットフォームに依存しない方式を採用しており、オペレーティング・システム間での移植性を高めるために、可能な限りネイティブ・コードを単純にしています。ただし、移植性とパフォーマンスは相反する問題です。そこでeSWTは別の方法、つまりUGL(Universal Graphics Layer)を採用しました。UGLは、ネイティブ・ツールキット実装上では相変わらずJNI(Java Native Interface)を保持しています。しかしUGLは1:1のJNIラッパーとして動作する代わりに、できるだけネイティブ実装に近づこうとしており、JNIを通してコールバックするための情報しか必要としません。eSWTの方法では、使用されるグラフィック・システムにネイティブ・ツールキットが完全依存するため、移植性は犠牲になります。しかしこれによって、パフォーマンスは劇的に改善されるのです。(パフォーマンスはモバイル・デバイスにとって大きな関心事です。)
eSWTには、下記の3つのコンポーネントが含まれています(図1)。
- コア・コンポーネント
- 拡張コンポーネント
- モバイル・エクステンション・コンポーネント
図1.eSWTのUIツールキット・パッケージ
コア・コンポーネントと拡張コンポーネントは、eSWTのサブセットです。新たに開発されたモバイル・エクステンション・コンポーネントは、モバイル・デバイスを対象としています。このようにコンポーネント化されているため、どのコンポーネントをデバイスに含めるべきかを、デバイスの機能や目的に応じて柔軟に決めることができます。コア・コンポーネントは必須であり、基本的なアプリケーションの実行に必要な最低限の機能を含んでいます。拡張コンポーネントとモバイル・エクステンション・コンポーネントはオプションです。
ここから先では、サンプル・アプリケーションを示しながら各コンポーネントを順次説明します。
eSWT Coreには基本的なUI要素が含まれています(下位レベルのグラフィックス、イベント、基本的なウィジェット・インフラなど)。表1は、eSWT Coreの中のクラスを示しています。
表1.eSWT Coreのorg.eclipseクラス
| swt.widgets | swt.graphics | swt.events | swt.layout | swt.swt |
|---|---|---|---|---|
| Button | Color | ControlEvent | FormLayout | SWT |
| Canvas | Device | DisposeEvent | FormData | SWTException |
| Combo | Font | FocusEvent | FormAttachment | SWTError |
| Composite | FontData | KeyEvent | - | - |
| Control | FontMetrics | MenuEvent | - | - |
| Decorations | GC | ModifyEvent | - | - |
| Dialog | Image | MouseEvent | - | - |
| Display | ImageData | PaintEvent | - | - |
| Event | PaletteData | SelectionEvent | - | - |
| FileDialog | Point | ShellEvent | - | - |
| Item | Rectangle | TraverseEvent | - | - |
| Label | Resource | TypedEvent | - | - |
| Layout | RGB | VerifyEvent | - | - |
| List | - | - | - | - |
| Menu/MenuItem | - | - | - | - |
| MessageBox | - | - | - | - |
| ProgressBar | - | - | - | - |
| Scrollable | - | - | - | - |
| Scrollbar | - | - | - | - |
| Shell | - | - | - | - |
| Slider | - | - | - | - |
| Synchronizer | - | - | - | - |
| Text | - | - | - | - |
| TypedListener | - | - | - | - |
まず、完全なeSWTプログラムから始めましょう。このプログラムはウィンドウを作成し、アプリケーションのタイトル・バー上に「HelloWorld from eSWT」を表示します。次に、幾つかのコア・コントロール(テキストやボタン、リスト)を追加します。レイアウトに関しては、FormLayoutとFormDataを使います。また、ボタン上にSelectionListenerを追加し、メッセージ・ボックスを出せるようにします。完全なコードをリスト1に示します。
リスト1.eSWT版のHelloWorld
01 public class HelloWorldeSWT {
02
03 public static void main(String[] args) {
04 Display display = new Display();
05 final Shell shell = new Shell(display);
06
07 Text text = new Text(shell,SWT.SINGLE);
08 text.setText("This is a text");
09 Button buttonleft = new Button(shell, SWT.PUSH);
10 buttonleft.setText("Left Push!");
11 Button buttonright = new Button(shell, SWT.PUSH);
12 buttonright.setText("Right Push!");
13 buttonright.addSelectionListener(new SelectionListener(){
14 public void widgetSelected(SelectionEvent e) {
15 MessageBox messageBox = new MessageBox(shell,
16 SWT.ICON_INFORMATION| SWT.YES | SWT.NO);
17 messageBox.setText("MessageBox");
18 messageBox.setMessage("Can you see me?");
19 messageBox.open();
20 }
21 public void widgetDefaultSelected(SelectionEvent e) {
22 }});
23 List list = new List(shell,SWT.MULTI|SWT.BORDER);
24 for (int i=0; i<5; i++) {
25 list.add("item "+i);
26 }
27
28 shell.setText("HelloWorld from eSWT");
29 FormLayout layout = new FormLayout();
30 layout.spacing = 5;
31 layout.marginHeight = layout.marginWidth = 9;
32 shell.setLayout(layout);
33
34 FormData textData = new FormData();
35 textData.top = new FormAttachment(0);
36 textData.left = new FormAttachment(0);
37 textData.right = new FormAttachment(90);
38 text.setLayoutData(textData);
39
40 FormData buttonleftData = new FormData();
41 buttonleftData.top = new FormAttachment(text);
42 buttonleftData.left = new FormAttachment(0);
43 buttonleftData.right = new FormAttachment(40);
44 buttonleft.setLayoutData(buttonleftData);
45
46 FormData buttonrightData = new FormData();
47 buttonrightData.top = new FormAttachment(text);
48 buttonrightData.left = new FormAttachment(buttonleft);
49 buttonright.setLayoutData(buttonrightData);
50 FormData listData = new FormData();
51
52 listData.top = new FormAttachment(buttonleft);
53 list.setLayoutData(listData);
54
55 shell.setSize(240,320);
56 shell.open();
57
58 while (!shell.isDisposed()) {
59 if (!display.readAndDispatch())
60 display.sleep();
61 }
62 display.dispose();
63 }
|
図2は、日本語版のPocketPCデバイス上で実行するアプリケーションを示しています。ユーザーがRight Push!ボタンを押すと、メッセージ・ボックスが現れます(図3)。eSWTは、基礎となっているネイティブのグラフィックス・ライブラリー・サポートを利用して、一貫性のあるUIを提供しています(つまり新しいルックは作らず、ネイティブ・アプリケーションのルック・アンド・フィールを利用しています)。
図2.eSWT版のHelloWorld
図3.ネイティブのルック・アンド・フィールを持つMessageBox
リスト1で何を行ったのか、1ライン毎に検証してみましょう。
- ライン04-05:
- ディスプレイとシェルを作成します。シェルは、ディスプレイを自分の親として設定し、最上位レベルのウィンドウとなるようにしています。『最上位レベルのウィンドウ』は、PocketPCプラットフォームでの一貫性を保つために自動的に最大化されます。『final』修飾子を持つシェルが作成されていますが、これは後でSelectionListenerの中で使われます。
- ライン07-08:
- テキストを作成し、setText() を呼んでテキスト・ストリングを設定します。
- ライン09-22:
- 2つのボタンを作成します。単純なメッセージ・ボックスを出せるように、右ボタンにSelectionListenerを追加します。
- ライン23-26:
- 5つのアイテムを含むリストを作成します。
- ライン28:
- ウィンドウのタイトル・バー上のテキストを設定します。
- ライン29-53:
- FormLayoutとFormData、FormAttachmentを使ってレイアウト処理を行います。
- ライン55-56:
- シェル・サイズを設定し、シェルを開きます。この場合では(デバイスの制約により)、setSize() は最上位レベルのウィンドウには影響を与えません。
- ライン 58-61:
- while() ループの内部に明示的なループを確立し、オペレーティング・システムから継続的にユーザー・イベントを読み取り、ディスパッチできるようにします。もはやイベントが得られなくなると、display.sleep() が呼ばれ、スリープ状態に入って次のイベントを待機します。
- ライン 62:
- 最後のラインのdisplay.dispose() コールは、明示的にディスプレイを廃棄し、関連する全リソースをeSWTアプリケーションから解放します。
eSWT Expandedはオプショナル・コンポーネントであり、より高度なUI要素やレイアウトを含んでいます。これらの機能は、ハイエンドのモバイル・デバイスやPDAには一般的に見られるものです。表2は、eSWT Expandedの中にあるクラスの詳細リストを示しています。
表2.eSWT Expandedのクラス
| org.eclipse.swt.widgets | org.eclipse.swt.browser | org.eclipse.swt.dnd | org.eclipse.swt.graphics |
|---|---|---|---|
| ColorDialog | Browser | ByteArrayTransfer | ImageLoader |
| DirectoryDialog | LocationEvent | Clipboard | - |
| FontDialog | ProgressEvent | TextTransfer | - |
| Table | StatusTextEvent | Transfer | - |
| Tree | TitleEvent | TransferData | - |
Browserウィジェットは、eSWT Expandedの中にある興味深いコントロールです。ここではBrowserコントロールを使って、完全機能のWebブラウザーを作ります(リスト2)。ユーザーは、URLを設定することができ、また先に進んだり前に戻ったり、ページを再ロードしたりすることができます。
リスト2.単純なHTMLブラウザー
public class BrowserTest {
static Button prev, reload, next, go;
static Text url;
static Browser browser;
public static void main(String[] args) {
final Display display = new Display();
Shell shell = new Shell(display);
//set window title and size
shell.setText("SimpleBrowser");
shell.setSize(240,320);
//previous button
prev = new Button(shell, SWT.PUSH);
prev.setText("<<");
prev.addSelectionListener(new SelectionListener(){
public void widgetSelected(SelectionEvent e) {
browser.back();
}
public void widgetDefaultSelected(SelectionEvent e) {
}});
//reload button
reload = new Button(shell, SWT.PUSH);
reload.setText("R");
reload.addSelectionListener(new SelectionListener(){
public void widgetSelected(SelectionEvent e) {
browser.refresh();
}
public void widgetDefaultSelected(SelectionEvent e) {
}});
//next button
next = new Button(shell, SWT.PUSH);
next.setText(">>");;
next.addSelectionListener(new SelectionListener(){
public void widgetSelected(SelectionEvent e) {
browser.forward();
}
public void widgetDefaultSelected(SelectionEvent e) {
}});
// url text
url = new Text(shell, SWT.SINGLE|SWT.BORDER);
url.setText("http://");
// go button
go = new Button(shell, SWT.PUSH);
go.setText("GO");
go.addSelectionListener(new SelectionListener(){
public void widgetSelected(SelectionEvent e) {
// TODO Auto-generated method stub
browser.setUrl(url.getText());
}
public void widgetDefaultSelected(SelectionEvent e) {
}});
// browser
browser = new Browser(shell, SWT.NONE);
browser.setUrl("http://www.google.com");
FormLayout formLayout = new FormLayout();
shell.setLayout(formLayout);
formLayout.spacing = 1;
formLayout.marginHeight = formLayout.marginWidth = 2;
FormData prevData = new FormData();
prevData.left = new FormAttachment(0);
prevData.top = new FormAttachment(0);
prevData.width = 16;
prev.setLayoutData(prevData);
FormData reloadData = new FormData();
reloadData.left = new FormAttachment(prev);
reloadData.top = new FormAttachment(0);
reloadData.width = 16;
reload.setLayoutData(reloadData);
FormData nextData = new FormData();
nextData.left = new FormAttachment(reload);
nextData.top = new FormAttachment(0);
nextData.width = 16;
next.setLayoutData(nextData);
FormData urlData = new FormData();
urlData.left = new FormAttachment(next);
urlData.top = new FormAttachment(0);
urlData.right = new FormAttachment(89);
urlData.bottom = new FormAttachment(browser);
url.setLayoutData(urlData);
FormData goData = new FormData();
goData.left = new FormAttachment(url);
goData.top = new FormAttachment(0);
goData.width = 24;
go.setLayoutData(goData);
FormData browserData = new FormData();
browserData.top = new FormAttachment(prev);
browserData.left = new FormAttachment(0);
browserData.right = new FormAttachment(100);
browserData.bottom = new FormAttachment(100);
browser.setLayoutData(browserData);
shell.open();
while( !shell.isDisposed() ) {
if( !display.readAndDispatch() )
display.sleep();
}
display.dispose();
}
}
|
図4は、PocketPC上で実行している単純なブラウザーを示しています。
図4. 単純なブラウザー
eSWT Mobile Extensionsはオプション・コンポーネントであり、様々なモバイル・デバイスに一般的に見られるUI要素を提供しています。表3は、eSWT Mobile Extensionsコンポーネントの中にあるクラスを示しています。
表3.eSWT Mobile Extensionsのクラス
| org.eclipse.ercp.swt.mobile |
|---|
| CaptionedControl |
| Command |
| ConstrainedText |
| DateEditor |
| HyperLink |
| Input |
| ListBox/ListBoxItem |
| MobileDevice/MovileDeviceEvent/MobileDeviceListener |
| MobileShell |
| MultiPageDialog |
| QueryDialog |
| Screen/ScreenEvent/ScreenListener |
| SortedList |
| TaskTip |
| TextExtension |
| TimedMessageBox |
この例では、Shellの代わりにMobileShellを使ってフルスクリーン機能を実現します。MobileShellの最上位にはSortedListがあり、最下位にはListViewがあります。コマンドはMobileShellと関連付けられており、ユーザーはフルスクリーン・モードを変更でき、またListViewを使ってレイアウト密度を変更することができます。このソースをリスト3に示します。
リスト3.MobileExtensionの例
public class MobileExtensionSample implements IPlatformRunnable {
public static void main(String[] args) {
Display display = new Display();
final MobileShell shell = new MobileShell(display);
final Button resetButton = new Button(shell, SWT.PUSH|SWT.BORDER);
Command shellCommand = new Command(shell, Command.SELECT,0);
shellCommand.setText("FullScreen");
shellCommand.addSelectionListener(new SelectionListener(){
public void widgetSelected(SelectionEvent e) {
shell.setFullScreenMode(true);
resetButton.setVisible(true);
}
public void widgetDefaultSelected(SelectionEvent e) {
}});
resetButton.setText("Normal Screen");
resetButton.addSelectionListener(new SelectionListener(){
public void widgetSelected(SelectionEvent e) {
shell.setFullScreenMode(false);
resetButton.setVisible(false);
}
public void widgetDefaultSelected(SelectionEvent e) {
}});
// Create SortedList and add items
SortedList sortedList = new SortedList(
shell,
SWT.MULTI|SWT.V_SCROLL|SWT.BORDER,
SortedList.FILTER);
sortedList.add("banana");
sortedList.add("123");
sortedList.add("12");
sortedList.add("happyhour");
sortedList.add("toobad");
sortedList.add("youknowwhat");
sortedList.add("yes");
sortedList.add("886222333");
// Create ListView and add items with image set
Image[] image = new Image[4];
image[0] = new Image(
Display.getDefault(),
MobileExtensionSample.class.getResource\
AsStream("/icons/sample.gif"));
image[1] = new Image(
Display.getDefault(),
MobileExtensionSample.class.getResource\
AsStream("/icons/sample.gif"));
image[2] = new Image(
Display.getDefault(),
MobileExtensionSample.class.getResource\
AsStream("/icons/sample.gif"));
image[3] = new Image(
Display.getDefault(),
MobileExtensionSample.class.getResource\
AsStream("/icons/sample.gif"));
final ListView lv = new ListView(shell, SWT.MULTI|SWT.BORDER);
for (int i=0; i<20; i++) {
lv.add("item"+i, image[i % 4]);
}
//Create a Command for setting low density
Command lowCommand = new Command(lv, Command.SELECT, 0);
lowCommand.setText("LOW");
lowCommand.addSelectionListener(new SelectionListener(){
public void widgetSelected(SelectionEvent e) {
lv.setLayoutDensity(ListView.LOW);
}
public void widgetDefaultSelected(SelectionEvent e) {
}});
//Create a Command for setting high density
Command midCommand = new Command(lv, Command.SELECT, 0);
midCommand.setText("MEDIUM");
midCommand.addSelectionListener(new SelectionListener(){
public void widgetSelected(SelectionEvent e) {
lv.setLayoutDensity(ListView.MEDIUM);
}
public void widgetDefaultSelected(SelectionEvent e) {
}});
FormLayout layout = new FormLayout();
layout.spacing = 2;
layout.marginHeight = layout.marginHeight = 2;
shell.setLayout(layout);
FormData sortedListData = new FormData();
sortedListData.top = new FormAttachment(0);
sortedListData.left = new FormAttachment(0);
sortedListData.right = new FormAttachment(100);
sortedListData.height = 120;
sortedList.setLayoutData(sortedListData);
FormData lvData = new FormData();
lvData.top = new FormAttachment(sortedList);
lvData.right = new FormAttachment(100);
lvData.left = new FormAttachment(0);
lvData.height = 130;
lv.setLayoutData(lvData);
FormData resetData = new FormData();
resetData.top = new FormAttachment(lv);
resetData.left = new FormAttachment(0);
resetButton.setLayoutData(resetData);
resetButton.setVisible(false);
shell.setSize(240,320);
shell.setText("Mobile Example");
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
|
図5は、PocketPCプラットフォーム上で実行している結果を示しています。そして図6はフルスクリーン・モードを示しています。
図5. SortedListとListViewを使ったMobileShell
図6. フルスクリーンのMobileShell
eJFaceは、プラットフォームとは独立な、eSWTに依存するUIツールキットです。eJFaceには一連のコンポーネントとヘルプ・ユーティリティーが用意されており、(eSWTウィジェットをラップすることによって)eSWTベースのアプリケーション開発を単純化することができます。これはJFaceとSWTの関係と同じです。実際、eJFaceはJFaceの厳密なサブセットであり、多く点で「いとこ」と似ています。eJFaceは、リソース管理やビューアー、アクション、プレファレンス・ページなどをサポートしています。参考文献に挙げたJFace用のチュートリアルは、eJFaceを使う上でも役に立つはずです。
eJFaceで利用できるビューアー・タイプは下記の通りです。
-
CheckBoxTableViewer -
CheckBoxTreeViewer -
ComboViewer -
ListViewer -
TableViewer -
TreeViewer
eWorkbenchを利用すると、1つのワークベンチ・ウィンドウの中で複数のeRCPアプリケーションを同時に実行することができます(RCPの中での場合と似ています)。eWorkbenchクライアントは特定なディスプレイ・シナリオのためのビューを提供し、またeWorkbenchは使用されているモバイル・デバイスに基づいて、どのビューを使用するかを自動的に決定します。eWorkbenchにはパースペクティブという概念はありません。パースペクティブという概念からすると、アプリケーション同士が埋め込みデバイス上で共有できるパースペクティブは1つしかない、と考えることができます。
eWorkbenchアプリケーションを作成するためには、(RCP開発者にはおなじみの)幾つかのステップがあります。このプロセスは、コントリビューション(contribution)の概念を利用してEclipse RCPアプリケーションを作成するプロセスと似ています。
eWorkbenchでは、org.eclipse.ui.part.ViewPart を拡張した3つのタイプのビュー(下記)を定義することができます。ノーマル・ビューは必須ですが、他の2つはオプションです。
- ノーマル・ビュー: デフォルトのビューです
- ラージ・ビュー: ディスプレイが大きい場合に使われるビューです
- ステータス・ビュー: ディスプレイが小さい場合に使われるビューです
こんどはサンプルのビューを作ってみましょう。
リスト4.サンプル・ビュー
public class DefaultView extends ViewPart {
public void createPartControl(Composite parent) {
//create a composite with fill layout to host a label
Composite composite = new Composite(parent, SWT.NONE);
composite.setLayout(new FillLayout());
// create a label
Label label = new Label(composite,SWT.CENTER);
label.setText("Hello eWorkbench!"); }
public void setFocus() {}
}
|
extension pointという機構を使って、ビューがあることをEclipseに知らせましょう(リスト5)。
リスト5.plugin.xml
<extension point="org.eclipse.ui.views">
<view allowMultiple="false"
category="org.eclipse.ercp.eworkbench.viewCategory"
class="com.ibm.ercp.application.views.DefaultView"
icon="icons/sample.gif"
id="com.ibm.ercp.application.defaultView"
name="Sample DefaultView"/>
</extension>
|
ステップ2: eWorkbenchコントリビューションを定義する
eWorkbenchアプリケーションであると見なされるためには、org.eclipse.ercp.eworkbench.applicationsというextension pointを拡張し、下記のような幾つかの情報を提供する必要があります(一例をリスト6に示します)。
- id: eWorkbenchアプリケーションを表現する固有識別子
- name: アプリケーションの名前(ワークベンチに表示されます)
- views: アプリケーションがサポートするビュー(ノーマル、ラージ、サポート)
リスト6.plugin.xml
<extension point="org.eclipse.ercp.eworkbench.applications">
<application id="com.ibm.ercp.application" name=\
"IBM Sample Application" singleton="true">
<views normal="com.ibm.ercp.application.views.normal" />
</application>
</extension>
|
図7は、eWorkbenchのアプリケーション・リストと、それに続くサンプル・アプリケーションの起動を、並べて示したスクリーン・ショットです。
図7. Hello, eWorkbench
RCPの利点は、アップデート・マネージャー・インターフェースを使って中央サーバーからプラグインをアップグレードできることです。またRCPにはスケジュール・アップデートなど、アップデート管理に関連した機能も用意されています。さらにOGSI(Open Grid Service Infrastructure)とプラグインを使うことによって、動的に機能をインストールすることができます。RCPのこうした利点に対応するものとして、eRCPにはeUpdateがあります。この記事の執筆時点で、eUpdateは活発な開発が行われている最中です。
eUpdateは、アップデート管理機能を含めようとするプラグイン用に、ロジックとUIを提供しています。こうしたプラグインを利用するか、あるいはアップデート関連情報のコンフィギュレーション用に完全なGUIを提供するeUpdateワークベンチ・アプリケーションを利用すれば、独自のアップデート機能を書くことができます。
この記事では、eRCP(embedded Rich Client Platform)と、そのコンポーネントについて紹介しました。またeWorkbenchアプリケーションのサンプル・コードや、自己完結的な例として幾つかのコード・リストを解説しました。
| 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|---|---|---|
| Sample code | os-ecl-rcp-com.ibm.ercp.application_1.0.0.jar | 25KB | HTTP |
学ぶために
-
embedded Rich Client Platformについて、さらに学んでください。
-
Eclipse.orgの「How to use the JFace Tree Viewer」を利用して、JFaceの使い方について学んでください。
- 幾つかのSWT Snippetsを利用して、eSWTの使い方を学んでください。
-
Eclipse Foundationについて、またそこで行われている多くのプロジェクトについて学んでください。
- developerWorksのEclipse project resourcesを利用して、Eclipseをさらに学んでください。
-
developerWorks technical events and webcastsを利用して、最新技術を学んでください。
- developerWorksのOpen sourceゾーンをご覧ください。オープンソース技術を使った開発や、IBM製品でオープンソース技術を使用するためのハウ・ツー情報やツール、プロジェクトの更新情報など、豊富な情報が用意されています。
製品や技術を入手するために
- IBMのalphaWorksから最新のEclipse technology downloadsを入手してください。
- 皆さんの次期オープンソース開発プロジェクトを、IBM trial softwareを使って構築してください。ダウンロード、あるいはDVDで入手することができます。
議論するために
-
eRCPのメーリング・リストを利用して、eRCP開発に参加してください。
- eRCPで助けが必要な場合には、まずeRCPのニュースグループを利用してください。
-
Eclipseのニュースグループには、Eclipseを使用し、拡張することに興味を持つ人達のための資料が豊富に用意されています。
-
developerWorks blogsからdeveloperWorksのコミュニティーに加わってください。

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

Uriel Liuは、IBM China Software Development Labのソフトウェア開発者であり、WEDクライアント技術に取り組んでいます。またeRCPプロジェクトのコミッターでもあります。