2013-09-23 46 views
0

我想在OSGi容器中安装OSGi包。我在我的一个文件夹中有一个jar文件..我将这个jar文件读入ByteArray,然后我使用这个ByteArray在OSGi容器中安装Framework包。下面是代码..使用ByteArray安装OSGi包

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(); 
} 

下面是个例外,我总是GET-

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

谁能告诉我,我做错了什么?而我需要的,因为在我的一些在另一个类的代码,我使用的ByteArray使用的ByteArray,所以我需要通过罐的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的事情吗?任何想法?

回答

0

这听起来像是你正在安装的jar的MANIFEST.MF中缺少一些OSGi头文件。尝试添加一些元数据项这样的:

Bundle-SymbolicName: your.name.Class

Bundle-Version: 1.0.0

退房的wikipedia entry

+0

我已经有这些条目在我的'MANIFEST.MF file' - '捆绑-ManifestVersion:2 捆绑-名称:框架 捆绑-SymbolicName:框架 捆绑-版本:1.0.0' – AKIWEB

0

您试图手动加装OSGi框架包已经通过FrameworkFactory初始化框架系统插件(这是相同的包/文件)。这是你例外的原因(阅读详情here)。

+0

很抱歉的混乱。实际上,框架并不是真正的名字..这是一个很长的名字,所以我需要在发布之前将其缩短。 – AKIWEB

1

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

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

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

+0

谢谢Neil,那么我的问题就是,为什么它能在我的问题中提到我的第二种方法? 'BundleContext.installBundle(String location)'。一切都是一样的,只有方法不同。 – AKIWEB

+0

这是不可能的...你的代码示例只显示一个包的安装,而不是第二个。错误只能在第二次尝试安装相同的包时发生。尝试使用调试器。 –

+0

您可能不止一次运行过代码,并且不初始化您的框架。一旦安装了一个软件包,你必须更新它。 –