S-JIS[2013-02-19] 変更履歴

Eclipseプラグイン アーカイブの解凍

Eclipseプラグイン開発のプラグインアーカイブの解凍方法。


概要

プラグインでは、ファイル(jarファイル等)をプラグインアーカイブに含めることが出来る。

しかし(デフォルトでは)実際にプラグインが配布されて使われる時には そのファイルはアーカイブ内に入っているので、そのまま普通のファイルとして使うことは出来ない。

という訳で、フィーチャーを作る際のオプションでインストール後にアーカイブを解凍させることが出来る。(by ashigeruさん)


feature.xmlの指定

インストール後にアーカイブを解凍させる方法。

  1. フィーチャーのマニフェストエディターで「プラグイン」タブを選択する。
  2. 左側の「プラグインおよびフラグメント」欄から、インストール後に解凍したいプラグインを選択する。
  3. 右側に「プラグインの詳細」が表示されるので、「インストール後にプラグイン・アーカイブを解凍します」にチェックを付ける。

feature.xmlが以下のように変わる(unpackの指定が無くなる)。

<plugin
      id="jp.hishidama.eclipse_plugin.dmdl_editor"
      download-size="0"
      install-size="0"
      version="0.0.0"
      unpack="false"/>
<plugin
      id="jp.hishidama.eclipse_plugin.dmdl_editor"
      download-size="0"
      install-size="0"
      version="0.0.0"/>

解凍される場所は、プラグインのインストール先になる。
例:「C:\eclipse\plugins\jp.hishidama.eclipse_plugin.dmdl_editor_1.0.1.201302192127」

で、中を見てみると、プラグインのプログラムのファイルまで解凍されて、classファイル群が作られている^^;
これはちょっと良くないので、classファイルは別途jarファイル化しておいた方が良い。(プラグインの機能でjarファイル化することが出来る)


プログラムアーカイブの作成

プラグインのclassファイル群をアーカイブ化する方法。

  1. ランタイムに(アーカイブ化される)ライブラリーを追加する。
    1. プラグインのマニフェストエディターで「ランタイム」タブを選択する。
    2. 右下の「クラスパス」で「新規」ボタンを押し、「新規ライブラリー」ダイアログを開く。
    3. 新規ライブラリー名を入力する。例:「plugin.jar
    4. 「クラスパス」の一覧に「plugin.jar」と「.」が追加される。(一覧に何も無いときは、「.」が省略されているという扱いらしい)
    5. (「.」は要らないので、)「.」を選択して「除去」ボタンを押す。
  2. ビルド対象に(アーカイブ化する)ライブラリーを追加する。
    1. ビルド」タブを選択する。
    2. 上部の「ランタイム情報」の「ライブラリーの追加」ボタンを押して「エントリーの追加」ダイアログを開く。
    3. plugin.jar」を選択する。
  3. ビルドの設定を修正する。
    1. build.properties」タブを選択する。
    2. output..」とか「javacSource..」とかのピリオドが2つある指定「..」があるので、「.plugin.jar」に置換する。
      (sourceだけはplugin.jarの設定が出来ているが、他は手で変換する必要がある (output以外は元々手で追加したものだから、自動的には変わらない))
      output.. = classes/
      bin.includes = plugin.xml,\
                     META-INF/,\
                     icons/,\
                     plugin.jar
      
      javacSource.. = 1.6
      javacTarget.. = 1.6
      javacDefaultEncoding.. = UTF-8
      source.plugin.jar = src/
      output.plugin.jar = classes/
      bin.includes = plugin.xml,\
                     META-INF/,\
                     icons/,\
                     plugin.jar
      
      javacSource.plugin.jar = 1.6
      javacTarget.plugin.jar = 1.6
      javacDefaultEncoding.plugin.jar = UTF-8
      source.plugin.jar = src/

これで、プラグインをビルドすると「plugin.jar」が作られる。


一番最初の状態のbuild.propertiesは以下のようになっている。

source.. = src/
output.. = classes/
bin.includes = plugin.xml,\
               META-INF/,\
               icons/

javacSource.. = 1.6
javacTarget.. = 1.6
javacDefaultEncoding.. = UTF-8

source..」という指定は、“カレントディレクトリー「.」のソース”というような意味になっているらしい。
つまり、「プロパティー名.対象」という指定の仕方のようだ。
普通だったら「対象.プロパティー名」という命名になっていて欲しいところだが、対象には「plugin.jar」の様にピリオド入りのファイル名が指定できるので、逆になっているのかもしれない。

したがって、
「source.plugin.jar = src/」は、「plugin.jarを作る為のソースディレクトリーはsrc/である」
「output.plugin.jar = classes/」は、「plugin.jarを作る為の(コンパイルの)出力ディレクトリーはclasses/である」
「javacSource.plugin.jar = 1.6」は、「plugin.jarはjavac 1.6で作成する」
というような意味になるのだろう。


解凍されたファイルの読み込み

プラグインアーカイブに含まれたファイルは、“バンドルされたリソース”としてアクセスすることが出来る。

プラグインプロジェクト内の「resource/zzz.properties」というファイルを使用する例。
まず、マニフェストエディターの「ビルド」タブの「バイナリー・ビルド」で「resource/zzz.properties」にチェックを付け、アーカイブに含まれるようにしておく。
それからソースをコーディングする。

import java.net.URL;

import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;

import org.osgi.framework.Bundle;
	Bundle bundle = Activator.getDefault().getBundle();
	IPath path = Path.fromPortableString("resource/zzz.properties");
	URL bundleUrl = FileLocator.find(bundle, path, null);
	URL url = FileLocator.resolve(bundleUrl);

Eclipseプラグインへ戻る / Eclipseへ戻る / 技術メモへ戻る
メールの送信先:ひしだま