0

我正在尝试在 OSGi 容器中安装 OSGi 包。我的一个文件夹中有一个 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,所以我需要将 jars 文件的 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

该错误表明您已经有一个具有相同符号名称和版本的包。这两者加在一起就像每个捆绑包的“主键”;您可以存在同一个包的两个版本,但不能有两个具有相同名称版本的包。

我仍然不明白为什么你需要传递字节数组......为什么不传递 FileInputStream,因为你已经有了呢?

无论如何,我会让你弄清楚为什么你要加载同一个包两次。注意文件名并不重要,只有 MANIFEST.MF 中的Bundle-SymbolicNameBundle-Version条目。

于 2013-09-23T07:24:24.107 回答
0

You tried to install OSGi framework bundle manually additionally to Framework system bundle already initialized by FrameworkFactory (this is the same bundle/file). This is the cause of your exception (read details here).

于 2013-09-23T06:14:56.933 回答
0

听起来您正在安装的 jar 的 MANIFEST.MF 中缺少一些 OSGi 标头。尝试添加一些像这样的元数据条目:

Bundle-SymbolicName: your.name.Class

Bundle-Version: 1.0.0

查看维基百科条目

于 2013-09-23T01:16:35.493 回答