Javaアプリケーションのプラグインシステムをどのように実装しますか?
以下を実現する使いやすい(開発者向けの)システムを用意することは可能ですか?
- ユーザーはプラグインをアプリのサブディレクトリに配置します
- プラグインは設定画面を提供できます
- フレームワークを使用する場合、ライセンスは商用開発と互換性がありますか?
Javaアプリケーションのプラグインシステムをどのように実装しますか?
以下を実現する使いやすい(開発者向けの)システムを用意することは可能ですか?
回答:
まず、すべてのプラグインが実装する必要があるインターフェースが必要です。
public interface Plugin {
public void load(PluginConfiguration pluginConfiguration);
public void run();
public void unload();
public JComponent getConfigurationPage();
}
プラグインの作成者は、プラグインをJARファイルにバンドルする必要があります。アプリケーションはJARファイルを開き、JARマニフェストの属性またはJARファイル内のすべてのファイルのリストを使用して、プラグインインターフェースを実装するクラスを見つけることができます。そのクラスをインスタンス化すると、プラグインの準備が整います。
もちろん、プラグインができることとできないことを制限するために、ある種のサンドボックスを実装することもできます。私は2つのプラグインで構成される小さなテストアプリケーションを作成し(そしてそれについてブログを書いて)、そのうちの1つはローカルリソースへのアクセスを拒否されています。
OSGiを使用します。
これは、Eclipseプラグインシステムの基盤です。EquinoxはEclipseの実装(ライセンスされたEPL)で、FelixはApacheプロジェクトの実装(ライセンスされたApache Public License)です。
Eclipseは、OSGiがあなたが言及したポイントをカバーできる具体的な例を提供します(または、完全なEclipse / SWT / JFaceスタックが必要な場合は、Eclipse RCPの上にアプリケーションを構築できます)。
1.6以降、独自の単純なシステムをコーディングしたい場合に使用できるjava.util.ServiceLoaderがあります。
ただし、基本機能以外の機能が必要な場合は、既存のフレームワークのいずれかを使用してください。
私は1週間OSGiに取り組みました。OSGiの1週間に過ぎません。結局それは悪い夢のようでしたが、私は多くを学びました。
OSGiを機能させることはできました(簡単ではない、すべての例は古く、ネット上のすべてが5年ではなくても3年以上古い)が、既存のプロジェクトに統合するのに深刻な問題がありました。 jarマニフェスト。
つまり、マニフェストの作成に使用されるあいまいなツールはわずかしかなく、十分に文書化されていません(BNDツールはほとんどあいまいではありませんが、Eclipseの特定のプロセス用に設計されています)。また、利用可能なOSGi情報のほとんどは、既存のデスクトップアプリケーションを持っているアプリケーション開発者を対象としたものではありません。
これにより、情報の多くのコンテキストが不鮮明または不適切になります。Neil Bartlettのブログ投稿は最大の助けでしたが、実際に動作するシステムを取得できませんでした(Felixチュートリアルからいくつかのコードを取得し、つなぎ合わせて組み込みフレームワークをローリングしました)。彼が何年も前に無料で投稿した彼の本の草稿を見つけました。これはすばらしいですが、Eclipse OSGiサポートの変更のため、Eclipseの例は機能しません。
すべてのステップが大きなハードルです。詳細は後ほどここに投稿してみます。
数年前に私はそのようなプロジェクトを開始し、すぐに準備ができていることを願っています。OSGiは良い選択のように見えますが、自分のプロジェクトと比較する機会がありませんでした。これは、上記のJPFと似ていますが、同時に多くの点で異なります。
私の動機となった基本的なアイデアは、コアアプリケーションとして、Webアプリケーション、デスクトップアプリケーション、またはアプレット/ JWSアプリケーション(もちろんこれはまだUIをカバーしていません)を分離せずに、Javaアプリケーションをできるだけ簡単に構築できることです。
私はいくつかの目標を念頭に置いてプロジェクトを構築しました: