3

他のプロジェクトで使用できるJavaの「ライブラリ」(JAR)を作成したいと思っていますが、ライブラリを拡張可能にしたいと考えています。私はOSGi風のものを求めています。私のライブラリには、他のJARがフックできる「拡張ポイント」があります。私のライブラリには、それが使用されているプロジェクトによって呼び出されるメソッドのコアセットがあると考えていますが、これらのメソッドの正確な実装は、プロジェクト/コンテキストによって異なる場合があります。

私はOSGi(Equinoxなど)を調べましたが、それが私が求めている方法で使用できるかどうかはわかりません。ライブラリを作成するのではなく、スタンドアロンアプリを対象としているようです。

これを達成するための最良の方法は何でしょうか?OSGiをこのように使用できますか?そうでない場合は、これを実行するフレームワークがありますか?

私はそれがすべて明確であることを願っています-私は自分が何を望んでいるかについて明確な考えを持っていますが、明確にするのは難しいです。

4

3 に答える 3

2

OSGiは素晴らしいですが、これがあなたに必要なものではないと思います。OSGi(-Services)を使用すると、ライブラリーのユーザーにもOSGi環境を使用するように強制されます。

@Peterが述べたように、特定のプロジェクト/コンテキストでライブラリのクラスを拡張するだけでこれを行うことができると思います。

ただし、OSGiを使用する場合は、これを実現する簡単な方法があります。これはバンドルフラグメントと呼ばれます。このようにして、元のライブラリを変更せずに、バンドルを作成し、いわゆるホストバンドル、つまりライブラリを拡張できます。これの一般的な使用例は、バンドルにプラットフォーム固有のコードがある場合です。

于 2012-09-21T08:36:09.387 に答える
1

Javaライブラリに名前を付けるものは、OSGiコンテキストでは「バンドル」という名前です。

OSGiバンドルは、MANIFEST.MFファイルに特別なメタ情報が含まれるJARファイルです。現在、すべてのOSGiバンドルには、Exported-PackagesまたはImported-Packagesのいずれかがあります。

Export-Packages Manifestヘッダーを使用すると、エクスポートしているすべてのパッケージを表示できます。また、他のプロジェクトでは、使用するパッケージをImport-Packagesに追加するだけです。例を次に示します。

マニフェストをバンドルする:-

Export-Packages: com.demo.exported;

バンドルBマニフェスト:-

Import-Packages: com.demo.exported;version=(1.0.0, 2.0.0]

このようにして、バンドルB(別のプロジェクト)は、バンドルAか​​らインポートしたパッケージ内のクラスからメソッドを呼び出すことができます。これで、import-packageに表示されるバージョンは、すべてのパッケージバージョンで何ができるかを示すだけです。受け入れる..いくつかのインターフェースの2つの異なる実装を持つ2つのバンドルを持ち、このパッケージを2つの異なるバージョンで提供することができます..両方が利用可能になります。

今まで、私は静的データ型について話していました。

宣言型サービスを介してサービスを動的に公開することもできます。この場合、バンドルが公開するすべてのサービスを示す1つのXMLファイル(コンポーネント定義)を定義する必要があります。また、他のバンドルでは、再度定義できます。別のXML。必要なすべてのサービスを示します。これらは、提供サービスおよび参照サービスと呼ばれます。

これで何ができるかについて少し考えられると思います。そして、私があなたの問題の解釈のどこかで間違っているなら、同じことを指定してください。

*注:-そしてもちろん、OSGiは、他のプロジェクトで再利用できる独立したバンドルを作成するために使用されます。これらは、プロジェクトにモジュール性をもたらします。

于 2012-09-20T16:20:16.433 に答える
0

他の人が述べているように、これにはOSGiやフレームワークは必要ありません。これは、テンプレートメソッドパターンストラテジーパターンなどのパターンを使用して行うことができます。機能を動的に変更/拡張するためのパターンは他にもいくつかありますが、これらはあなたの説明に最も適しているようです。フレームワークは必要ありません。

OSGiのようなフレームワークから得られる利点は、配線を管理できることです。通常、ライブラリと拡張機能を結合するコードを作成する必要があります。OSGiのようなフレームワークでは、これは最小限のオーバーヘッドでは自動化されません(OSGiの場合、オーバーヘッドはJARマニフェストの一部のエントリです) 。

于 2012-09-25T07:55:24.460 に答える