Hatena::ブログ(Diary)

Fly me to the Juno! このページをアンテナに追加 RSSフィード

2011-02-08

5分でEclipse PluginをGroovyで書くよー。

ぼーっとしていたらEclipse PluginをGroovyで書いてました!他のJVM言語でもEclipse Plugin書けるんです!

Eclipseはe4プロジェクトでJava以外の言語(例えばJavaScript)でもPluginの実装を実現しようと頑張ってますが、なんか3系でもできちゃった。

必要なもの(環境)

こっからはほぼ画像ペタペタ貼っているだけです。この通りに作業すれば同じようにプラグインが作れます。

ほいじゃ、実際に作っていくよー。

まずGroovyプロジェクトを作るー

f:id:kompiro:20110208221544p:image

プロジェクト名は「 eclipse-plugin-by-groovy 」って作りました。

f:id:kompiro:20110208221545p:image

GroovyプロジェクトをPluginプロジェクトにコンバート

f:id:kompiro:20110208221546p:image

f:id:kompiro:20110208221547p:image

MANIFEST.MFを編集してGroovyのライブラリやらEclipseのライブラリを追加するっす。

f:id:kompiro:20110208221548p:image

f:id:kompiro:20110208221549p:image

f:id:kompiro:20110208221550p:image

下記のダイアログが出るので、次のプラグインを追加するっす。
  • org.eclipse.ui
  • org.codehaus.groovy
  • org.eclipse.core.runtime

f:id:kompiro:20110208221551p:image

こんな感じで追加したらこんなんなります。

f:id:kompiro:20110208221552p:image

続いてメニューの拡張ポイントのテンプレートを追加するよー。

f:id:kompiro:20110208221920p:image

f:id:kompiro:20110208221921p:image

テンプレートの内容をカスタマイズするページが表示されるっす。そのままでOKっす。

f:id:kompiro:20110208221922p:image

テンプレートが出力されたので、Javaのファイルができました。groovyにするっす。

f:id:kompiro:20110208221923p:image

f:id:kompiro:20110208221924p:image

f:id:kompiro:20110208221926p:image

ソースを編集するよー

f:id:kompiro:20110208221927p:image

f:id:kompiro:20110208221928p:image

完全版のソースコードはこんな感じ。

package eclipsepluginbygroovy.handlers;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.jface.dialogs.MessageDialog;

class SampleHandler extends AbstractHandler {
	/**
	 * The constructor.
	 */
	SampleHandler() {
	}

	/**
	 * the command has been executed, so extract extract the needed information
	 * from the application context.
	 */
	def execute(ExecutionEvent event) throws ExecutionException {
		def window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
		MessageDialog.openInformation(
				window.getShell(),
				"eclipse-plugin-by-groovy",
				"Hello, Eclipse world");
		return null;
	}
}
実行してみよー。

f:id:kompiro:20110208221929p:image

Eclipse Applicationを追加するよー。左側のEclipse Applicationを選んで、ノートに+がついたようなアイコンをクリック

f:id:kompiro:20110208221930p:image

「Eclipse Plugin by Groovy」と言う感じでNameをつけてあげよう。Macユーザーの方は、Arguments(引数)タブを開いて、VM Arguments(VM引数)に-d32を追加してください。そんでOKを押してみる。

f:id:kompiro:20110208221931p:image

するともう一つEclipseが立ち上がるので、ツールバーのこのボタンを押してみよー。

f:id:kompiro:20110208221933p:image

うまくいくとこのダイアログが出るよー。

f:id:kompiro:20110208221934p:image

おしまい。

今回はメニューやツールバーのテンプレートを使いましたが、ビューやらエディタやらも各拡張ポイントに対応するクラスを指定すれば同様に動作するはずです。

種明かし

と書いてみましたが、特に種はありません。Groovy Eclipse環境下では、groovyのソースコードがコンパイルされclassファイルになります。groovyのクラスファイルは、実行時にgroovyのランタイムが必要ですが、プラグインの実行時に依存関係にgroovyのライブラリを含んでいるため、意図したとおりクラスが実行できるのです。

これってば他のJVM言語でもうまくいくのではないか!?

Groovyの場合、Javaとソースコード変換をするプラグインがあるのでさくっと行きますが、他のJVM言語でも依存ライブラリにその言語のライブラリを指定すれば動くはず。近いうちにScalaとかJRubyとか試してみたいと思います。それができれば、ポリグロット(多言語)eclipse環境が実現されますね。ではではー。

2011-01-29

Eclipse Plugin開発のチュートリアルを公開します。

1/28に僕のふるさとの名古屋でEclipse Plugin開発セミナーが開催され、講師として参加してきました。そのために作成したEclipseプラグイン開発のチュートリアルを公開します。

http://kompiro.org/nagoya-seminar/html

このチュートリアルはチュートリアルを通じて手を動かしてみる事でプラグイン開発とはどういったものかを、一通り学ぶ事を目的にしています。手順通りに実施すると二つ小さなプラグインを作成できるチュートリアルです。

このチュートリアルではまだテストコードを書いたり、ビルドサーバを立てたCIのやりかたなどは取り上げていませんが、その辺りも追加できればと思っています。

2010-09-26

Buckminsterを試してみる(1)

BuckminsterとはEclipse Plug-inのビルドやテストを補助するEclipse Plug-inです。Eclipse Demo Camp Tokyoで、「こんなネタで話したかったんだ」とつぶやいたネタの一つがBuckminsterでした。それで興味を持ってくださった方がいらっしゃったのと、PluginBuilderのHelios版がリリースされる様子がないので、この機会に試してみました。ここで公開されているチュートリアルを試しました。このチュートリアルを訳しつつ、メモをとりました。

準備
  • まっさらなEclipse RCP/RAPパッケージを用意*1

やったこと

RCPのサンプルとしてよく使われる、Mailテンプレートプロジェクトを作成する。
  • プラグインプロジェクト(com.example.mail)を作成
  • RCPの作成を選択
  • Nextを選ぶとテンプレートプロジェクトが表示される。Mailテンプレートを選択
配布用フィーチャーを作る(com.example.mail.feature)
  • フィーチャープロジェクト(com.example.mail.feature)を作る
  • Plug-insにcom.example.mailを追加
  • include featuresにcom.eclipse.rcp*2を追加
RCPとしてビルドできる事を確認する。
  • com.example.mail.featureにproductファイル*3を追加する。
  • 下記の写真みたいに情報を追加する。

f:id:kompiro:20100920161342p:image

  • "The product configuration is based"にfeatureを選択し、Dependencyタブでcom.example.mail.featureを選ぶ
  • 試しにプロダクトが起動するか確認する。OverviewタブのLaunch an Eclipse Applicationを選択する。*4
Buckminsterをインストールする。
Buckminster用のフィーチャープロジェクト(com.example.mail.site)を作成

target platform*5の定義と共有をします。

  • Preference画面を開き、 Plug-in Development > Target Platformを選ぶ。
  • 空の定義を作成し、Eclipse Software SiteからEclipse RCP SDK と Eclipse Platform Launchersを追加する。
  • Include required softwareのチェックは外し、Include all environmentsにチェックを入れる。
  • 現在のターゲットプラットフォームに指定する
Buckminsterを使ってp2リポジトリを作成する

Buckminsterを使ってp2リポジトリを作るのは簡単です。

  • com.example.mail.siteを選択し、コンテキストメニューを表示し、Buckminster > Invoke Action を選択すると次のダイアログが表示される。

f:id:kompiro:20100926214442p:image

  • しばらく待つと、site.p2が表示される。site.p2を選択すると、同じワークスペースにBuckminster.outputというフォルダが出来る。それがp2のリポジトリ。
  • 今度はp2リポジトリの出力先等、カスタマイズ。まず下記のプロパティファイルを作る。
# 出力先
buckminster.output.root=${user.home}/tmp/mail
# 一時ファイルの出力先
buckminster.temp.root=${user.home}/tmp/buildtmp
# .qualifier の置換方法(リビジョンで置き換える)
qualifier.replacement.*=generator:lastRevision

target.os=*
target.ws=*
target.arch=*
  • 先ほどのダイアログではpropertiesファイルの指定欄があったが、そこに作成したbuckminster.propertiesを指定。

これで出力先のカスタマイズ等できます。.qualifierの指定方法は他にもgenerator:lastModifiedや generator:buildTimestamp があります。一般的にeclipse上からエクスポートされると置換されるのは、buildTimestamp形式です。先ほどのbuckminster.propertiesはこんな感じで指定します。

qualifier.replacement.*=generator:buildTimestamp
generator.buildTimestamp.format=yyyyMMddHHmm

これで自動ビルドの下準備が整いました。続いてHudson...と行きたいところですが、ちょうど区切りがいいので次回。ちなみに紹介したチュートリアルのサイトではHudsonの自動化までやられており、実際にやってみたのですが、拍子抜けするくらい簡単でした。ただ、作業は簡単ですが、実際はp2のインストールに時間がかかる事があるので、なんか止まってるっぽいと思って終了しないように。ハマったのは、フィーチャーIDの指定が間違っていた、ということくらいです。

*1:他のプラグインによる干渉を防ぐため。何か変な動作があったとき、その原因を探る時間がもったいないでしょう。

*2:RCP用のベース機能を用意しているフィーチャー

*3:RCPとしてパッケージするための情報を格納したファイル

*4Macの場合、64bit Java VMを利用しているのであれば、VM引数に-d32が含まれていないと起動しない。

*5:target platformとは開発中のプラグインを載せるためのプラットフォームの定義です。

2010-09-11

プラグインのソースコードを別のプラグインとして配布するには

以前からプラグインビルドするときにソースコードを同梱して配布する事ができましたが、3.4からは別のプラグインとして配布できるようになりました。それが原因ではないと思うんですが、ソースコードをプラグインの中に同梱するとフィーチャーとしてビルドが出来ない障害もあります。今回はいろいろ調べたので、ソースコードを別のプラグインとして同梱するために行った設定のメモ。

プラグインプロジェクトの設定

build.properties

f:id:kompiro:20100911170515p:image

いつの頃からかはわかりませんが、現在のPDEでは、Binary Buildで指定したファイルはSource Buildに指定しなくてもよいようです。重複して指定すると、build.propertiesの編集ページで警告されます。

フィーチャープロジェクトの設定

ソースコードのプラグインをまとめるフィーチャーは自動で生成されます。自動生成される際に、元のfeatureのファイルがコピーされるため、プラグインを提供するリポジトリにIDの異なる同じ名前のフィーチャーが複数登録されます。ソースコードを同梱したフィーチャーは、IDの最後にsourceが追加されるため、識別は可能です。リポジトリを生成するときのcategory.xmlに下記のように指定すれば、ソースコード提供フィーチャーと、実際の機能を提供するフィーチャーと別々のカテゴリにする事ができます。

<?xml version="1.0" encoding="UTF-8"?>
<site>
   <feature url="features/junit.extensions.eclipse.quick.feature_0.6.0.qualifier.jar" id="junit.extensions.eclipse.quick.feature" version="0.6.0.qualifier">
      <category name="junit.extensions.eclipse.quick.feature"/>
   </feature>
   <feature url="features/junit.extensions.eclipse.quick.feature.source_0.6.0.qualifier.jar" id="junit.extensions.eclipse.quick.feature.source" version="0.6.0.qualifier">
      <category name="junit.extensions.eclipse.quick.source.feature"/>
   </feature>
   <category-def name="junit.extensions.eclipse.quick.feature" label="Quick JUnit Main"/>
   <category-def name="junit.extensions.eclipse.quick.source.feature" label="Quick JUnit Source Feature"/>
</site>

id:"junit.extensions.eclipse.quick.feature"は、<category name="junit.extensions.eclipse.quick.feature"/>に、id:"junit.extensions.eclipse.quick.feature.source"は、<category name="junit.extensions.eclipse.quick.source.feature"/>に、属するように指定しています。(sourceの方のIDが、カテゴリの名前と異なるようにしているのには理由はありません。単に間違っ...)

feature.xml

feature.xmlには、フィーチャー名や提供元などの情報が記述されています。このファイルは国際化のため、文字列を外部化することができます。ベース名はfeature.propertiesです。今回は文字列を外部化させるだけにとどめたいと思います。

feature.properties

feature.xmlから外部化した文字列を参照するには

%featureName

と指定します。feature.propertiesで

featureName=JAMCircle Extension Plugin

となっていれば、%featureNameが、JAMCircle Extension Pluginで置き換わります。

sourceTemplateFeatureディレクトリ

フィーチャーのプロジェクトの直下にこのディレクトリが存在すると、ソースコードのプラグインを生成するように指定したときに、このディレクトリの中身をテンプレートとして上書きします。なので、このフォルダの下に、feature.propertiesを用意し、featureNameにソースコードを同梱したフィーチャーである事を明示した名前にしておけば、識別できる名前にできる、と言う訳です。

sourceTemplateFeature/build.propertiesとfeature.properties

ただ、忘れてはならないのが、このテンプレート置き場のフォルダにもbuild.propertiesが必要、というところです。コピーするときに必要なファイルがなんであるのか、書いておく必要があります。

実際に生成してみる。

上記の設定を行った後、フィーチャーを生成するときにこんな感じで設定してください。

f:id:kompiro:20100911174342p:image:w450

うまく設定できると、生成したリポジトリからのインストールは次のような画面になるはずです。

f:id:kompiro:20100911174341p:image:w450

2010-09-01

Eclipse Helios(3.6) on OSXでPlug-in Selection Spyを動作させるには

Plug-inを作るときにとても有効なPlug-in Spyですが、Helios(3.6)on OSXではOSのホットキーとぶつかっているのか、うまく動作しません。そのため、下記のようにキーバインディングを変更しました。

f:id:kompiro:20100901222923p:image

ぼくはSpy系を下記のように割り当てられてています。

  • Plug-in Selection Spy : Option+Shift+fn+F1
  • Plug-in Menu Spy : Option+Shift+fn+F2

以前のバグが再度発生しているようなので、バグをリオープンするように要請してみました。

https://bugs.eclipse.org/bugs/show_bug.cgi?id=227949