2013-09-23 66 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

您可能不止一次運行過代碼,並且不初始化您的框架。一旦安裝了一個軟件包,你必須更新它。 –