18

Javaアプリケーションに動的プラグイン機能を実装したいと思います。理想的には:

  • アプリケーションは、のPluginようなメソッドでインターフェースを定義しますgetCapabilities()
  • プラグインは、実装pluginX.jarするクラス(およびおそらく他のいくつか)を含むJARになります。PluginXImplPlugin
  • ユーザーはpluginX.jar、特別なディレクトリに配置するか、それを指す構成パラメーターを設定します。ユーザーは必ずしもpluginX.jarクラスパスに含める必要はありません。
  • アプリケーションはPluginXImpl(おそらくJARマニフェストを介して、おそらくリフレクションによって)それを見つけてレジストリに追加します。
  • クライアントはPluginXImpl、たとえば、のようなメソッドを呼び出すことによって、のインスタンスを取得できますgetPluginWithCapabilities("X")。ユーザーは必ずしもプラグインの名前を知っている必要はありません。

ピーベリーでこれができるはずだと思いますが、ドキュメントの意味がわかりません。私はGuiceの学習に時間を費やしてきたので、私の好みの答えは「SpringDynamicModulesを使用する」ではありませ

Guice / peaberry、OSGi、または単なるJavaを使用してこれを行う方法について誰かが私に簡単なアイデアを教えてもらえますか?

4

5 に答える 5

17

これは、プレーンJavaを使用すると、実際には非常に簡単です。

アプリケーションを起動する前にユーザーがクラスパスを構成する必要がないため、最初に、プラグインディレクトリ内のファイルへのURLの配列を使用してURLClassLoaderを作成します。File.listFilesを使用してすべてのプラグインjarを検索し、次にFile.toURI()。toURL()を使用して各ファイルへのURLを取得します。システムクラスローダー(ClassLoader.getSystemClassLoader())を親としてURLClassLoaderに渡す必要があります。

java.util.ServiceLoaderのAPIドキュメントで説明されているように、プラグインjarにMETA-INF / servicesに構成ファイルが含まれている場合、ServiceLoader.load(Plugin.class、myUrlClassLoader)を使用して、プラグインインターフェイスのサービスローダーを取得できるようになりました。 iterator()を呼び出して、構成されているすべてのプラグイン実装のインスタンスを取得します。

プラグインの機能をフィルタリングするには、これに独自のラッパーを用意する必要がありますが、それほど問題にはならないはずです。

于 2010-01-20T21:22:57.517 に答える
1

24時間年中無休の環境でバグ修正のためにランタイムig中にプラグインを置き換えたい場合は、OSGIで問題ありません。私はOSGIでしばらく遊んでいましたが、それは必須ではなかったので時間がかかりすぎました。バンドルを削除する場合はプランbが必要です。

私の謙虚な解決策は、プラグイン記述子クラスのクラス名をプロパティファイルに提供し、サーバーがそれらを呼び出して登録できるようにすることでした(機能の確認を含む)。

これは明らかに次善の策ですが、受け入れられた答えを読むのが待ちきれません。

于 2010-01-20T21:43:11.133 に答える
1

サービスプロバイダーインターフェイスを活用できる可能性はありますか?

于 2010-01-21T01:19:36.250 に答える
1

Guiceでプラグインを実装する最良の方法は、Multibindingsを使用することです。リンク先のページでは、マルチバインディングを使用してプラグインをホストする方法について詳しく説明しています。

于 2010-01-21T08:45:01.540 に答える
0

これを知っている場合はお詫びしますが、 ClassforNameのメソッドを確認してください。少なくともJDBCでは、DBMS固有のドライバクラスランタイムをクラス名で動的にロードするために使用されます。

getCapabilities()次に、ディレクトリ内のすべてのクラス/ jarファイルを列挙し、それぞれをロードし、それらの機能/説明を任意の用語と形式で返す静的メソッド(または選択した任意の名前)のインターフェイスを定義することは難しくないと思い ますそれはあなたのシステムにとって理にかなっています。

于 2010-01-20T20:55:24.300 に答える