Top / Eclipse / プラグイン開発のTIPS集

コンテンツ一覧


目次

とりあえずやってみる

JavaWorld?の2004年3月号に特集されていたので、Eclipseのプラグイン開発ツールを触ってみました。

Eclipseはこのプラグインの固まりで、すべての機能はプラグインで作成されているみたいです。ようするにEclipseを機能拡張したい場合はこのプラグインという作法に則って作成するわけですね。

まだ全然やり方がわかりません。とりあえずView(パースペクティブ内の一つのタイルのこと)を拡張して、選択しているファイルのファイル名を表示するプラグインを作成しています。

一番簡単なやり方は

後はすべてデフォルトでOKでよいです。ウィザードが完了すると、単純なプラグイン・プロジェクトの作成完了です。

基本的な構成はできたので、次はプラグインファイル(plugin.xml)の記述です。手順は

覚え書き

サンプルのダウンロード

ヘルプに リッチ・クライアント・プラットフォーム・アプリケーションのビルド という項目があったので、見てみるとサンプルがEclipseのCVS

:pserver:anonymous@dev.eclipse.org:/home/eclipse

からダウンロード可能とのこと。

アクティブなエディタへの参照の取得

// ワークベンチの取得
IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();

//アクティブなエディタの取得
IEditorPart editor = window.getActivePage().getActiveEditor();
AbstractTextEditor aEditor = (AbstractTextEditor) editor;

エディタ内のドキュメントを取得

IDocument document =
  aEditor.getDocumentProvider().getDocument(editor.getEditorInput());

プラグインのディレクトリを取得する(2.0系)

Log4jの初期化のためにlog4j.xmlを読み込むなど、プラグインディレクトリのパスを取得する場面は結構ありますが、その方法です。

 String pluginDirectory = Platform
    .resolve(getDefault().getDescriptor().getInstallURL()).getPath();

で取得できます。 ちなみにLog4jの初期化などはAbstractUIPluginのサブクラス(勝手に作られるヤツ)で

public void startup() throws CoreException {
 super.startup();

 String pluginDirectory = null;
 try {
  pluginDirectory =
   Platform
    .resolve(getDefault().getDescriptor().getInstallURL())
    .getPath();
 } catch (IOException e) {
  e.printStackTrace();
 }

 DOMConfigurator.configure(new File(pluginDirectory, "lib/log4j.xml").toString());
}

などとstartup()をOverrideすればよいでしょうか。

プラグインのディレクトリを取得する(3.0系)

Eclipse3.0から上のやり方は deprecated になりました。2.0で

String pluginDirectory = Platform
    .resolve(getDefault().getDescriptor().getInstallURL()).getPath();

だったのを3.0では

URL entry = getDefault().getBundle().getEntry("/");
String pluginDirectory = Platform.resolve(entry).getPath();

と書き換えます。

http://www3.vis.ne.jp/~asaki/p_diary/diary.cgi?Date=2004-09-05

外部のライブラリを使用する

プラグインディレクトリにlibディレクトリなどを作成しておいて、plugin.xmlで

<runtime>
  <library name="hoge.jar"/>
  <library name="lib/fuga.jar"/> <-外部ライブラリ
</runtime>

とすればOKです。

プロジェクトへの参照を取得する

いわゆるEclipseのプロジェクトへの参照を取得する方法です。

IWorkspaceRoot myWorkspaceRoot =
  ResourcesPlugin.getWorkspace().getRoot();
IProject project = myWorkspaceRoot.getProject([プロジェクト名の文字列]);

ポップアップメニューの拡張

<extension point="org.eclipse.ui.popupMenus">
  <objectContribution
      objectClass="org.eclipse.core.resources.IResource" <- ファイルとか、フォルダだったら表示
      objectClass="org.eclipse.jdt.core.ICompilationUnit" <- いわゆるソースファイルだったら
      objectClass="org.eclipse.core.resources.IFile" <- ファイルだったら表示
      objectClass="org.eclipse.core.resources.IFolder" <- フォルダだったら表示
      id="nu.mine.kino.IResource">
     <action label="スクリプト生成(&amp;R)"
       class="nu.mine.kino.HogeAction"
       menubarPath="additions"  <- すでにあるメニューに追加
       enablesFor="1" <- 選択したファイルが1つだけの時有効
       id="nu.mine.kino.HogeAction">
     </action>
   </objectContribution>
</extension>

デバッグするためのダイアログを出したい

IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
Shell shell = window.getShell();
MessageDialog.openInformation(shell, "タイトル","メッセージ");

が定番でしょう。windowオブジェクトはメソッドを記述するクラスによってはフィールドから得られたりしますが。。

ウィンドウに配置されているViewを取得する。

IWorkbenchPage page = workbench.getActiveWorkbenchWindow().getActivePage();
IViewReference[] references = page.getViewReferences();

for (int i = 0; i < references.length; i++) {
  IViewPart view = references[i].getView(false); <- Viewへの参照が取得できました
  MessageDialog.openInformation(window.getShell(), "ViewのtoString()", view.toString());
}

ウィンドウに配置されているViewを、ID指定で取得する。

IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchPage workbenchPage = workbench
       .getActiveWorkbenchWindow().getActivePage();
//IWorkbenchPage workbenchPage = editor.getSite().getPage();
try {
  HogeView view =
    (HogeView) workbenchPage.showView("HogeViewのID");
} catch (PartInitException e) {
}

おなじViewを複数開く

Eclipse3.0から(だと思う)同じウィンドウを複数開くことができるようです。

IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchPage workbenchPage = workbench
        .getActiveWorkbenchWindow().getActivePage();
try {
  HogeView view =
    (HogeView) workbenchPage
    .showView("HogeViewのID", "HogeViewの別のID(Uniqueならよい?)",
    IWorkbenchPage.VIEW_ACTIVATE);
} catch (PartInitException e) {
}

http://d.hatena.ne.jp/muimy/20040804 から情報をいただきました。

プラグインのパッケージング手順

トラブル(↓メモ書き状態)

パッケージ化するとインスタンスを生成できない。

パッケージ化するとインスタンスを生成できない。 私も同じトラブルに遭遇しました。

プラグインをパッケージングすると、何故かエラーになってしまうというもの。ビューを開こうとすると

インスタンスを生成できませんでした。

と言われてしまうんだけど、エラーを調べようにもどこにエラーが表示されているのかも分からないので困っていました。

そこでネットを探していたところ、同じような内容の投稿が。とりあえずこれを見て、プラグインのログは

というところまで分かりました。感謝!!

そのエラーログを見ると、xml関連のライブラリがないと。どうもプラグインをパッケージした場合と、ランタイムワークベンチで稼動しているVMのバージョンの違いが原因でした。*1 plugin.xmlに、

<library name="lib/xercesImpl.jar"/>
<library name="lib/xml-apis.jar"/>

を追加して、ようやく動きました。疲れた...。。。

プラグインがロードされるタイミング

http://www-6.ibm.com/jp/developerworks/opensource/040604/j_os-ecspy1.html

拡張ポイントクラス(IExtension)から、そのクラスローダでメソッドを実行する

プラグインクラスに必ず定義したいメソッド

public static void log(String message, Exception e) {
    IStatus status = new Status(IStatus.ERROR, getPluginId(),
            IStatus.ERROR, message, e);
    getDefault().getLog().log(status);
}

public static void log(String message) {
    log(message, null);
}

public static void log(Exception e) {
    StringWriter stringWriter = new StringWriter();
    e.printStackTrace(new PrintWriter(stringWriter));
    String message = stringWriter.getBuffer().toString();
    log(message, e);
}

public static String getPluginId() {
    return getDefault().getBundle().getSymbolicName();
}

リファクタリング >> ストリングの外部化

チェックExternalize外部化して、//$NON-NLS-1$ をつける
×Ignore以後無視するよう、//$NON-NLS-1$ をつける
×'Internalize//$NON-NLS-1$ をはずすもしくはなにもしない

関連リンク

IBM developerWorks

Eclipseのサイトの technical articles

基本

難しい

Eclipseプラグイン開発






Last-Modified:1970/01/01 09:00:00


この記事は

選択肢 投票
おもしろかった 9  
そうでもない 1  

Top / Eclipse / プラグイン開発のTIPS集

現在のアクセス:140186


*1 WebSphereStudio?はJ2SE1.3だったためだ〜

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS