0

プレーンJavaアプリケーション内で2つのOSGiフレームワークを使用しています。どちらのフレームワークも、共有ディレクトリからバンドルをロードします。

1つのバンドルでは、リソースからファイルをロードします。私はさまざまな方法を試しました

this.getClass().getClassLoader().getResourceAsStream(...)
FrameworkUtil.getBundle(XXX.class).getEntry(...)
FrameworkUtil.getBundle(XXX.class).getResource(...)

ただし、どのコマンドを使用するかは関係ありません。最初はすべて正常に機能します。ただし、両方のフレームワークでいくつかのインストールとアンインストールの手順を実行した後。返されるInputStreamはnullです。

また、OSGiフレームワークを1つだけ使用しても問題なく動作します。

少しデバッグした後、バンドルが

FrameworkUtil.getBundle(XXX.class)

は正しいjarファイルを指していますが、バンドルのBundleDataで参照されているバンドルファイルを探すと、別のバンドルのバンドルファイルを参照しています。バンドルファイルは、OSGiフレームワーク(私の場合はEquinox)の一時ファイルであり、たとえばローカルのMavenリポジトリーにあります。

.m2 \ repository \ org \ eclipse \ osgi \ org.eclipse.osgi \ 3.6.0.v20100517 \ configuration \ org.eclipse.osgi \ bundles \ 29 \ 1

誰かがここで何が間違っている可能性があるか考えていますか?

4

2 に答える 2

0

リソースの読み込みを行うコードは、フレームワークのバンドルから実行されていますか?またはフレームワーク外のコードから?

バンドルが解決されるたびに、新しいクラスローダーを取得します。バンドルが未解決になると(アンインストールされたときなど)、そのクラスローダーは破棄され、バッキングストア(バンドルjarファイルなど)から切断されます。そのため、使用するClassオブジェクトは、破棄されたクラスローダーからロードされたため、役に立たなくなる可能性があります。

実行時に、Classオブジェクトはクラスファイルとクラスローダーのペアによって一意であることを忘れないでください。

于 2012-09-12T15:51:03.407 に答える
0

どちらのフレームワークも同じディレクトリを使用して、バンドルの構成を保存します。あるフレームワークが他のフレームワークのバンドルファイル/構成ファイルを誤って上書きしているようです。

バンドルがそのリソースにアクセスしようとすると、構成ファイルが検索されます。このファイルが上書きされた場合、リソース ファイルのエントリは使用できなくなり、値が null の InputStream になります。

この種の問題を回避するために、各フレームワークの構成ディレクトリを異なる方法で設定することができます。

Map<String, String> frameworkPropertiesMap = new HashMap<String, String>();
frameworkPropertiesMap.put("osgi.configuration.area", "@user.home/osgi-framework-configuration-" + numberOfFramework);
framework = getFrameworkFactory().newFramework(frameworkPropertiesMap);
framework.start();
于 2012-09-13T07:09:42.683 に答える