0

私は自分が書いているJavaコンソールアプリを持っています。そして、人々がそれのためのプラグインを書いて、それらのプラグインをjarとして配布できるようにしたいと思っています。ユーザーがプラグイン(jar)を「plugins」フォルダーにドロップし、アプリを再起動して、プラグインをロードして実行できるようにしたいと思います。プラグインなどで実行するクラス/メソッドをユーザーが指定する必要はありません。

ワイルドカードクラスパスを使用してjarを「plugins」ディレクトリにロードできますが、register()各プラグインがどこかで定義する必要があるメソッドを実行することにより、これらのプラグインがアプリケーションに登録するための何らかの方法が必要です。プラグイン(jar)は、メソッドが定義されている場所(パッケージとクラス)をどのように指定しregister()て、アプリがそれを呼び出すことができるようにすることができますか?

私はOSGiがこれを達成できることを理解していますが、これはかなり小さなアプリケーションであり、より単純なソリューションが存在する場合はOSGiを使用したくないと思います。

バックグラウンド:

これらのプラグインは、処理したいアプリからのイベントを登録します。ユーザーはプラグインごとに特定のイベントの処理を無効にできるため、これらのプラグインの構成はアプリのデータベースに保存されます。プラグインがそれ自体を登録すると、アプリはデータベースをチェックしてそのプラグインの構成が存在するかどうかを確認し、存在しない場合はデータベースに新しいデフォルト構成を作成します。

4

3 に答える 3

2

この動作を標準化するアプリケーションのマニフェストファイルを定義します。プロパティファイル、XML、または選択した任意の形式として実装できます。マニフェストファイルには標準のプロパティ名が含まれ、値はプラグインの「スタートアップクラス」になります。定義したインターフェイスまたは抽象クラスからこのスタートアップクラスを拡張して、期待される動作を強制できるようにします(つまり、「register」メソッドを使用します)。

次に、エンドユーザーはクラスファイルとマニフェストをJARにバンドルし、アプリケーションのプラグインフォルダーに配布します。

OSGIは間違いなくこれにぴったりですが、コンシェルジュを見たことがありますか?展開サイズが途方もなく小さいです。

于 2011-08-05T21:11:05.983 に答える
0

おそらくあなたのregisterメソッドはプラグインインターフェースの一部ですか?

その場合は、カスタムClassLoaderを実装して、このインターフェイスを実装するクラスを検出できます。その後、リスナーベースのアプローチを使用して、プラグインを管理するオブジェクトにクラスの存在を通知します。

于 2011-08-05T21:14:23.450 に答える
0

あなたが役立つかもしれない別のスレッドがあります

実行時にJarsを動的にロードするにはどうすればよいですか?

また、 Jarクラスローダーを調べてみてください

于 2011-11-01T10:04:57.920 に答える