Javaでのプラグイン機構の実装について

Javaでプラグイン機構を持つプログラムを作成するページを色々巡ってみたのだけれど、プラグイン側のクラスの特定の方法が「決めうち」「META-INFに書く」のどちらかのページばかりだったので、それ以外の方法も一応あるよ、というメモ。

前提としては、プラグインはJarファイルで所定のディレクトリに置かれる、プラグインは処理をするために特定のインターフェースを実装している、というところまで。

JarファイルはZip形式でいろんなファイルが入っているだけなので、ファイルのエントリを引っ張ってくることも出来ます。

大体説明は要らないと思いますが、処理の流れとしては単純で、Jarファイルを読み込み、名前が*.classのファイルを探し、プラグインのインターフェースを実装しているかを確かめています。ファイル名からクラス名の変換は9行目にあるような処理で行えます。

この方法でプラグインを作成してもいいのですが、一番の問題点は非効率的というところでしょうか。時間がかかるのはプラグインの読み込み(つまり起動時)のみになるので、たいした問題ではないと思いますが。

自分で適当に結構な頻度でプラグイン作って放り込むのであればMETA-INFの内容をごにょごにょ、などよりは手間をかけずに作れると思います。

Eclipseで作業をする際には、プラグイン(とそのホスト側)が実装すべきインターフェースのみが定義されているJarを作成して、それをビルドパスにくっつける必要があるようです。(プロジェクトをビルドパスに加えてテストをするとうまくいかなかった)

なぜプラグイン機構を作ろうと思ったかというと、Javaでソケット通信でデータを常時受け取るサーバの処理を任意のタイミングで書き換えたいと思ったのですが、いちいちJavaプログラムを再起動していたらデータの受け取り漏れが出そうかな、というそれだけです。

任意のタイミングでプラグインを読ませるために、プラグイン構成に変更を加えたらplugin_reloadファイルにtouchする流れにして、plugin_reloadファイルのlastModifiedを一定時間毎に読む、とかも作りましたが、そのあたりはいくらでも作り方や工夫があると思うので省略です。マルチスレッドで任意のタイミングで読み込む場合は、synchronizedとかそのあたりも適当に工夫してください。

カテゴリー: Java, プログラミング関連 パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です