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 がありました。
ただし、基本的な機能以外のものが必要な場合は、既存のフレームワークのいずれかを使用してください。
JPF(Java Plugin Framework) もあります。
PF4J を使用します。 Web、Spring、Wicketをサポートしています。使いやすく、アプリケーションを構築します
私はOSGiに1週間取り組みました。OSGiの1週間に過ぎませんでした。最後は悪い夢のようでしたが、私は多くを学びました。
私はOSGiを動かすことができました(簡単ではありません、すべての例は時代遅れです、ネット上のすべては5つではないにしても少なくとも3年です)、私はそれが問題のために既存のプロジェクトに統合するのに深刻な問題がありましたjarマニフェスト。
要するに、マニフェストの作成に使用されるあいまいなツールはほんのわずかであり、十分に文書化されていません(BNDツールはほとんどあいまいではありませんが、Eclipseの特定のプロセス用に設計されています)。また、利用可能なOSGi情報のほとんどは、既存のデスクトップアプリケーションを持っているアプリケーション開発者向けではありません。
これにより、情報のコンテキストの多くがぼやけたり不適切になります。 Neil Bartlettのブログ投稿は最大の助けでしたが、それらでも動作するシステムを取得できませんでした(Felixチュートリアルからいくつかのコードを取得し、組み込みフレームワークをロールバックするためにそれをつなぎ合わせました)。彼が何年も前に無料で投稿した本の草稿を見つけましたが、これは素晴らしいものですが、Eclipse OSGiサポートの変更により、Eclipseの例は機能しません。
すべてのステップは大きなハードルです。後で詳細を投稿しようと思います。
上記の問題を解決するためにOSGiを推奨することは、非常に貧弱なアドバイスだと思います。 OSGiは「正しい選択」ですが、上記のようなシナリオでは、JPFまたは独自の最小限のフレームワークのいずれかで十分だと思います。
数年前、私はそのようなプロジェクトを開始し、すぐに準備ができていることを望んでいます。NetBeansやEclipseなどのプロジェクトに触発されましたが、その間に少し異なるものに変わりました。 OSGiは今では良い選択のように見えますが、私のプロジェクトと比較する機会がありませんでした。これは上記のJPFと似ていますが、同時に多くの点で異なっています。
私を動機付けた基本的な考え方は、Webアプリケーション、デスクトップアプリケーション、またはアプレット/ JWSアプリケーションを分離せずにJavaアプリケーションをできるだけ簡単に構築することです(もちろん、これはUIをカバーしていません- )コア機能として。
私はいくつかの目標を念頭に置いてプロジェクトを構築しました。