3

ホストアプリケーション内で、setおよびgetメソッドを提供することにより、Vehicleという名前のクラスのインスタンスをOSGiワールドに転送するために使用される単純なpushServiceを実装しようとしました。サービスを使用できるようにするために、サービスインターフェイスとVehicleクラスの両方をjarファイルにエクスポートし、そのファイルをバンドル内にインポートしました。このファイルはサービスを使用する必要があります。

felixフレームワークとバンドルをインスタンス化するホストアプリケーション内でVehicleクラスを使用しようとするたびに、リンケージエラーが発生しました。次のブログエントリ(http://frankkieviet.blogspot.com/2009/03/javalanglinkageerror-loader-constraint.html)を読んだ後、このエラーが発生する理由を理解しました。しかし、私には自分の問題を解決する方法がわかりません。

ホストアプリケーションとOSGiインスタンスの間でクラスを共有することは可能ですか?jarファイルをインポートする代わりにリフレクションを使用する必要があるかもしれませんか?私はそのライブラリ(http://code.google.com/p/transloader/)を調べましたが、このライブラリが私の問題を解決できるかどうかはよくわかりません...

BR、

マーカス

4

1 に答える 1

3

かつて私はFelixを使用して、カスタムクライアントサーバーアプリケーションで求めていることを正確に実行していました。それ以来、Equinoxに切り替えました(Swing LAFに必要なフレームワークフラグメントをosgiバンドルとして正しく実装しています)。私は以下がフェリックスで機能すると思います、私はそれがエクイノックスで機能することを知っています。

更新:ホストアプリケーションと非常によく似たパスを開始しました。プラットフォームを真に活用するには、できるだけ多くのコードを実際のOSGiバンドルに移動する必要があることに早くから気づきました。私のホストアプリケーションは、クライアント/サーバー通信をセットアップし、バンドルを同期します。それでおしまい。私が共有していたいくつかのクラスはバンドルに移動され、振り返ることはありません。あなたがデザイン/アプリケーションがコードの大部分をバンドルにすることをサポートできるなら、私は間違いなくその道を行くでしょう。再設計が必要な場合でも、それだけの価値があります。

OSGiランタイムを初期化する前に、このプロパティ「org.osgi.framework.system.packages」を設定して、セミコロン「;」で区切られたパッケージ(ワイルドカードなし)を含めます。さらに、基本osgiパッケージ「org.osgi.framework」と基本サービス「org.osgi.packageadmin」、「org.osgi.startlevel」、「org.osgi.url」を含める必要がある場合があります。

バージョン管理を掘り下げて、まだFelixを使用しているときにスニペットを見つけました(セットアップはEquinoxでもほぼ同じです)

Map<String, String> configMap = new HashMap<String, String();

configMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES,
    "your.package;other.package;org.osgi.framework");

// setup other properties

Bundle systemBundle = new Felix(configMap, null);
systemBundle.start();

// Now you can use classes from "your.package" with explicity 
// declaring them as imports in bundles
于 2009-06-18T14:43:26.690 に答える