2014-01-27 91 views
0

我正在使用OSGI聲明式服務。使用相同的文件安裝兩個軟件包

在我的Java應用程序中,我啓動了Apache Felix,並安裝並啓動了一些軟件包。

使用相同的文件路徑安裝了兩個軟件包。一旦包開始,它應該顯示一個'你好'的消息。

當我安裝並啓動第一包:

Bundle bundle1 = context.installBundle("file:C://Users//bundles//myBundle.jar"); 
bundle1.start(); 

這顯示「您好」在控制檯中。

然而,當我安裝第二束(具有作爲第一束同一文件路徑)

Bundle bundle2= context.installBundle("file:C://Users//bundles//myBundle.jar"); 
bundle2.start(); 

我看不出有任何輸出。這意味着第二個軟件包的安裝和/或啓動被忽略。

我需要一種方法來安裝和啓動具有相同文件路徑的兩個不同的捆綁包,當我停止其中一個捆綁包時,另一個應該保持ACTIVE。我怎麼可能做到這一點?謝謝。

我想到的用例:假設我有兩個用戶,並且都想使用相同的功能(包)。如果其中一人決定停止捆綁功能,而另一人想保留它,會怎麼樣?

有沒有更好的方法來實現這一目標?謝謝。

回答

1

你可以調用函數

context.installBundle(位置的inputStream)

,並通過一個InputStream該功能。在這種情況下,您可以指定兩個不同的位置(例如具有一些含義但不是真實位置的位置)。

如果兩個具有相同SymbolicName和相同版本的捆綁包不能存在兩次,則會出現下一個問題。

我無法想象一個用例,其中應該安裝兩次相同的包。這可能是一個糟糕的概念的結果。

+0

假設我有兩個用戶。兩人都選擇了相同的功能,但後來,有人決定停止該功能。 (這裏的功能是一個包)。這不是一個用例嗎? –

+0

取決於功能的含義。我認爲一個包包含了一個功能的實現。通過多次選擇該特徵,這意味着捆綁中的類被多次實例化。例如。您可以創建基於配置工廠的DS組件。如果用戶創建新配置,則該組件將使用該配置實例化。 –

+0

您是否在談論ComponentFactory?你能提供一個例子,希望有一個小代碼嗎? –

1

安裝兩次之間文件內容是否發生變化?如果沒有,那麼你不能這樣做。基本上你試圖實例化捆綁包兩次,OSGi只允許每個捆綁包安裝一次。

實際上,您可以同時擁有多個版本的捆綁包,但該對Bundle-SymbolicNameBundle-Version在框架內必須是唯一的。

將用戶功能映射到已安裝的軟件包並不是一個好主意。爲什麼用戶需要關心應用程序中安裝的模塊?相反,您希望使捆綁中的功能支持多個用戶。

+0

謝謝尼爾,我現在意識到了。但是我需要知道你是如何在聲明式服務中做到這一點的「一個包中的多個功能」。任何文件解釋這個想法,用代碼?像往常一樣,我嘗試從頭學習osgi。搜索API並在那裏迷路。 –

+0

我認爲Balazs在評論中提供的鏈接非常好。 –

1

您需要考慮兩件事情:捆綁包位置必須是唯一的,並且必須將該框架設置爲接受具有相同捆綁符號名稱的多個捆綁包。您應該使用bundleContext.install(location, inputStream) 來安裝該軟件包。也許是這樣的:

byte[] byteArray byteArray = IOUtils.toByteArray(new FileInputStream(new File(filePath); 
Bundle bundle = bc.installBundle(jobID, new ByteArrayInputStream(byteArray)); 

,並啓用框架接受同捆的符號名稱的多個包,你需要使用下列選項啓動框架:

-Dorg.osgi.framework.bsnversion=multiple 

注意,更新命令仍然會嘗試更新來自給定位置的包,這在我的情況下(jobID)不是真正的文件路徑。這與我的用例無關,所以我從來沒有打算解決它。