0

OSGi コンテナーに OSGi バンドルをインストールしようとしています。フォルダーの 1 つに jar ファイルがあります。その jar ファイルを読み込んでByteArrayから、これを使用して OSGi コンテナーにバンドルByteArrayをインストールしています。Framework以下はコードです..

FrameworkFactory frameworkFactory = ServiceLoader.load(FrameworkFactory.class).iterator().next();

framework = frameworkFactory.newFramework(new HashMap<String, String>());
framework.start();

final String basePath = "C:\\LocalStorage";
final BundleContext bundleContext = framework.getBundleContext();
final List<Bundle> installedBundles = new LinkedList<Bundle>();

String filename = "Framework" + "-" + "1.0.0" + ".jar";
String localFilename = basePath+ File.separatorChar + filename;

File file = new File(localFilename);
byte [] fileData = new byte[(int)file.length()];
DataInputStream dis = new DataInputStream((new FileInputStream(file)));
dis.readFully(fileData);
dis.close();

// But below line gives me exception always-
installedBundles.add(bundleContext.installBundle(filename, new ByteArrayInputStream(fileData)));

for (Bundle bundle : installedBundles) {
    bundle.start();
}

以下は例外です、私はいつも-

org.osgi.framework.BundleException: Bundle symbolic name and version are not unique: Framework:1.0.0

誰が私が何を間違っているのか教えてもらえますか? また、別のクラスのコードの一部で ByteArray を使用しているため、ByteArray を使用する必要があるため、jar ファイルの ByteArray をそれらのメソッドに渡す必要があります。

アップデート:-

しかし、このようにインストールすると、問題なく動作します。ByteArray 経由でインストールすると機能しません。

final String basePath = "C:\\LocalStorage";
final BundleContext bundleContext = framework.getBundleContext();
final List<Bundle> installedBundles = new LinkedList<Bundle>();

String filename = "Framework" + "-" + "1.0.0" + ".jar";
String localFilename = Constants.FILE_PROTOCOL + basePath+ File.separatorChar + filename;

installedBundles.add(bundleContext.installBundle(localFilename));

for (Bundle bundle : installedBundles) {
    bundle.start();
}

ByteArray で何か間違ったことをしている可能性がありますか? 何か案が?

4

3 に答える 3

1

このエラーは、同じシンボル名とバージョンのバンドルが既にあることを示しています。これら 2 つを合わせて、各バンドルの「主キー」のようなものです。同じバンドルの 2 つのバージョンを存在させることはできますが、同じ名前とバージョンの 2 つのバンドルを存在させることはできません。

なぜバイト配列を渡す必要があるのか​​ まだわかりません... FileInputStream を渡さないのはなぜですか?

とにかく、同じバンドルを 2 回ロードしている理由を解決するのはあなたに任せます。注意: ファイル名は重要ではなく、MANIFEST.MF 内のエントリBundle-SymbolicNameとエントリのみです。Bundle-Version

于 2013-09-23T07:24:24.107 に答える
0

インストールしている jar の MANIFEST.MF に OSGi ヘッダーが不足しているようです。次のようなメタデータ エントリを追加してみてください。

Bundle-SymbolicName: your.name.Class

Bundle-Version: 1.0.0

ウィキペディアのエントリをチェックしてください

于 2013-09-23T01:16:35.493 に答える