コントロールをプラグインとして配布する

カスタム コントロールを広範に配布する場合や、カスタム コントロールを大幅にカスタマイズしたい場合は、コントロールをプラグインとしてパッケージ化できます。この方法のメリットは以下のとおりです。

このトピックでは、コントロールをプラグインにパッケージ化する方法について説明します。この方法では Eclipse プラグインを作成するため、Eclipse プラグインおよびその作成方法についての基礎知識があるとより理解が深まります。

なお、この方法では、コントロール JAR をプラグインにラップします。社内での配布の場合は、わざわざプラグインを作成する必要はなく、単純にコントロール JAR ファイルを直接共有できます。

この方法の手順は次のとおりです。

  1. コントロールをコントロール JAR ファイルにエクスポートする
  2. コントロール プラグイン プロジェクトを作成する
  3. コントロール JAR をプラグイン プロジェクトにコピーする
  4. プラグイン プロジェクトの依存関係を設定する
  5. 拡張を追加して設定をカスタマイズする
  6. 挿入の委託コードを作成する
  7. プラグインをビルドしてテストする
  8. プラグインをエクスポートする

手順 1: コントロールをコントロール JAR にエクスポートする

JAR へのコントロールのエクスポート」で説明されている手順に従います。

手順 2: コントロール プラグイン プロジェクトを作成する

  1. [ファイル|新規|プロジェクト] でプラグイン プロジェクトを作成します。[プラグイン開発] を展開して [プラグイン・プロジェクト] を選択します。これらのプロジェクト タイプが表示されない場合は、[すべてのウィザードを表示] チェック ボックスをオンにすると表示されます。

    [次へ] をクリックします。

    次の画面で、[プラグイン・プロバイダー] フィールドに入力して [終了] をクリックし、プロジェクトを作成します。

    [はい] をクリックして [プラグイン開発] パースペクティブに変更します。

手順 3: コントロール JAR をプラグイン プロジェクトにコピーする

プラグイン プロジェクトのルートに (src フォルダの下ではなく)、lib フォルダを作成します。(前の手順で作成した) コントロール JARlib ディレクトリにコピーします。

手順 4: プラグイン プロジェクトの依存関係を設定する

マニフェストのエディタ ウィンドウが表示されていない場合は、MANIFEST.MF ファイルをダブルクリックしてウィンドウを開きます。エディタで、[依存関係] タブをクリックするか、[プラグイン・コンテンツ] セクションの [依存関係] リンクをクリックします。[必須プラグイン] セクションで [追加] ボタンをクリックして、次のプラグインを選択します。

[OK] をクリックして依存関係を追加します。[ファイル|すべて保管] をクリックして、依存関係を MANIFEST.MF ファイルに保存します。

手順 5: 拡張を追加して設定をカスタマイズする

[拡張] タブをクリックします。[追加] をクリックして、以下を選択します。

[終了] をクリックして拡張を追加します。[ファイル|すべて保管] をクリックして変更内容を保存します。

新しいファイル plugin.xml がプロジェクトに追加されています。このファイルには、以下の拡張情報が記述されています。

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.2"?>
<plugin>
<extension
point="com.bea.workshop.controls.core.controls">
</extension> </plugin>

com.bea.workshop.controls.core.controls 拡張ポイントには、少なくとも id、class、isControlExtension、および isExtensible 属性を指定したネストされた <control> タグが含まれている必要があります。例を示します。

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.0"?>
<plugin>   <extension point="com.bea.workshop.controls.Controls">     <control         id="com.mycompany.example.MyExampleControlId"         class="com.mycompany.example.control.MyExampleControl"         isControlExtension="false"         isExtensible="false" />   </extension> </plugin>

<control> タグの属性は、以下のとおりです。

属性 説明 必須/任意 デフォルト
id ユニークな ID の文字列このプラグインに指定されたコントロール内で重複することはできない。 必須 [none]
class コントロール インタフェース クラスの完全修飾クラス名。 必須 [none]
isControlExtension   必須 拡張可能なコントロールの拡張かどうかを指定する。
isExtensible   必須 拡張可能なコントロールかどうかを指定する。true に設定することでデフォルト挿入が可能になり、ユーザが通常のコントロールではなくコントロール拡張を作成するように誘導できる。
label [挿入|コントロール] ダイアログで表示されるテキスト。 任意 クラス属性の簡略のクラス名
icon [挿入|コントロール] ダイアログでコントロールのラベルの左側に表示されるアイコン。 任意 汎用アイコン。
priority 同じグループのコントロールに対する相対順位 (昇順)。プラグイン ルートへの相対パス。 任意 10
groupName コントロールに対するグループのヘッダ。コントロールが 3 つ未満の場合は、グループは作成されません。3 以上の場合、groupName を指定すると、グループが作成されます。 任意 ラベル属性の値。コントロールがグループ化されない場合や、グループに含まれているコントロールが 3 つでない場合、それらのコントロールが最上位にリストされ、ラベル属性は無視される。
groupPriority 他のグループに対するグループの順位 (昇順)。 任意 100
insertionDelegateClass コントロールがアプリケーションに挿入されるときにトリガされるクラス。目的のアクションの他に、プラグイン JAR からユーザのプロジェクトにコントロールをコピーするために挿入の委託が必要です。 任意 com.bea.workshop.controls.core.DefaultControlInsertionDelegate
description コントロールの説明。 任意 [none]

次に、多くの属性を使用した <control> タグの例を示します。

<extension point="com.bea.workshop.controls.core.controls">
<control
            class="com.mycompany.controls.MyControl"
id="MyControl12"
groupName="My Company"
groupPriority="10"
includeInPalette="true"
insertionDelegateClass="com.mycompany.workshop.MyInsertionDelegate"
isControlExtension="false"
isExtensible="false"
label="Sample Control"
palettePriority="10"
priority="10"       />
</extension>

手順 6 : 挿入の委託コードを作成する

<control> タグの insertionDelegateClass 属性は、挿入の委託を示し、コントロールがファイルに挿入されるときに委託をトリガします。この属性はさまざまな用途に使用できますが、(たとえばファセットやライブラリ モジュールとして) まだプロジェクトに含まれていない場合は、後述のようにコントロール JAR をユーザのプロジェクトにコピーするために使用するのが一般的です。

コントロールをプラグインに含める場合、JAR ファイルはプラグインに配置されますが、コントロールのユーザのプロジェクトには配置されません。JAR をプラグインからコントロールを使用するプロジェクトにコピーするには、以下のようなコードを挿入の委託に挿入する必要があります。このコードでは、挿入の委託が呼び出されると、コントロール JAR がユーザのプロジェクトにコピーされます。

挿入の委託を作成するには、src フォルダ内にパッケージを作成し、挿入の委託のクラス用のファイルを作成します。

挿入の委託のサンプル コードを以下に示します。当然、パッケージ名とクラス名は更新する必要があります。

package org.example.controls.workshop;

import java.io.File;


import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.swt.widgets.Display;

import com.bea.workshop.controls.core.model.IControlInsertionDelegateContext;
import com.bea.workshop.controls.ui.actions.DefaultControlInsertionDelegate;

public class SampleInsertionDelegate extends DefaultControlInsertionDelegate {

	@Override
	public IJavaElement insertControl(IControlInsertionDelegateContext ctxt) {
		try {
			File file = getFileFromPlugin(Activator.getDefault(), "/lib/TestControl.jar");
			copyJarIfNecessary(ctxt, file, file.getName());
			return super.insertControl(ctxt);
		} catch (Exception e) {
			String message = "Error inserting control";
			error(message,e);
		}
		return null;
	}

	private void error(String message, Exception e) {
		ErrorDialog.openError(Display.getCurrent().getActiveShell(),
								"Control Insert Error",
								message + " - " + e.getMessage(),
				new Status(IStatus.ERROR,Activator.PLUGIN_ID,1,"Control Insert Error",e));
	}
	
}

上のサンプル コードは、「コントロールをプロジェクトに挿入する」例です。パラメータを収集して追加のアノテーションを挿入するカスタム ウィザードを使用する場合は、コードを次のように更新できます。

public IJavaElement insertControl(IControlInsertionDelegateContext ctxt) {
  try {
	// ここでウィザードを起動して処理を完了させる。必要に応じてパラメータを
	// 収集してから、ファイルをコピーしてパラメータをアノテーション値
	// として使用する。

	File file = getFileFromPlugin(Activator.getDefault(), "/lib/TestControl.jar");
	copyJarIfNecessary(ctxt, file, file.getName());

	HashMap<String, String> attrs = new HashMap<String, String>();
	attrs.put("attr", "aValue");

	return super.insertControl(ctxt,"org.example.controls.SampleControl.SamplePropertySet",attrs);
  } catch (Exception e) {
	String message = "Error inserting control";
	error(message,e);
  }
  return null;
}

前の例は、1 つのアノテーションを追加する場合に便利な API です。追加するアノテーションが複数ある場合は、次の例のように AnnotationInfo オブジェクトのリストを使用できます。


public IJavaElement insertControl(IControlInsertionDelegateContext ctxt) {
  try {
	// ここでウィザードを起動して処理を完了させる。必要に応じてパラメータを
	// 収集してから、ファイルをコピーしてパラメータをアノテーション値
	// として使用する。

	File file = getFileFromPlugin(Activator.getDefault(), "/lib/TestControl.jar");
	copyJarIfNecessary(ctxt, file, file.getName());
			
	List infos = new ArrayList();
	HashMap<String, String> attrs1 = new HashMap<String, String>();
	attrs1.put("attr", "aValue");
	AnnotationInfo info1 = new AnnotationInfo(
			"org.example.controls.SampleControl.SamplePropertySet",attrs1);
	infos.add(info1);

	HashMap<String, String> attrs2 = new HashMap<String, String>();
	attrs2.put("anotherAttribute", "aValue");
	AnnotationInfo info2 = new AnnotationInfo(
			"org.example.controls.SampleControl.SamplePropertySet",attrs2);
	infos.add(info2);
			
	return super.insertControl(ctxt,infos);
  } catch (Exception e) {
	String message = "Error inserting control";
	Activator.getDefault().logError(message, e);
	error(message,e);
  }
  return null;
}

DefaultControlInsertionDelegate によって提供される API の詳細については Javadoc を参照してください。

手順 7 : プラグインをビルドしてテストする

[ビルド] タブをクリックして、プラグインに lib ディレクトリが含まれていることを確認します。[バイナリー・ビルド] セクションの [lib] フォルダをクリックして、プラグインが正しくビルドされていることを確認します。

プラグインを実行するには、[実行|Eclipse アプリケーション] コマンドを使用して、プラグインが正しく動作するかどうかをテストします。

手順 8 : プラグインをエクスポートする

[概要] タブをクリックします。[エクスポート・ウィザード] をクリックして、コントロール JAR、挿入の委託、およびその他の必要なファイルを格納するプラグイン JAR を作成します。このビューが表示されない場合は、META-INF/MANIFEST.MF を右クリックして [開く] を選択すると、ビューが表示されます。

[エクスポート] ダイアログで、必ずプラグイン ファイルを作成するディレクトリを設定します。デフォルトでは、[ソース・コードを組み込む] オプションが無効になっているため、コントロールのソース コードをプラグイン ユーザが使用できません。プラグインの送り先ディレクトリを指定して [終了] をクリックすると、コントロール プラグイン ファイルが作成されます。

これで、作成したプラグインを、他の Eclipse プラグインと同じように他の開発者に配布できます。

関連トピック

カスタム コントロールの開発

JAR へのコントロールのエクスポート


さらにヘルプが必要ですか。質問は Workshop ニュース グループまでお寄せください。