2016-10-05 16 views
2

我正在開發基於OSGi的應用程序。在記錄我自己的OSGi框架功能時,我偶然發現了擴展束的概念。援引R4規範(OSGi R4):擴展bundle在OSGi框架中的含義

擴展束所能提供的框架 實施的可選部分或提供必須駐留在引導 類路徑上的功能。這些軟件包不能由正常的 導入/導出機制提供。引導類路徑擴展是必需的 ,因爲某些軟件包實現假定它們位於引導類路徑的 或要求所有客戶端都可用。引導類路徑擴展的 例子是 java.sql中的實現,如JSR 169

也許這只是我太傻了,但我有在理解概念的困難。我有幾個問題:

  1. 從我的理解看來,擴展束正在做的org.osgi.framework.system.packages.extraorg.osgi.framework.bootdelegation(即com.sun.*sun.*)的相同工作。我對嗎?如果不是,他們之間有什麼區別?

  2. 你能告訴我一個擴展包的真實用例場景嗎?有些說:「除非你使用擴展包,否則你不能這樣做!」 Here某人已經試圖提供擴展套件的例子,但(至少對我來說)似乎可以通過調整org.osgi.framework.system.packages.extraorg.osgi.framework.bootdelegation來實現相同的結果;

我知道已經有this SO answer但對我來說並沒有完全擊中點。

非常感謝您的回覆!

回答

1

擴展束可用於覆蓋任何類,甚至java.lang類。

你可能希望在System.gc()的調用,例如追蹤(例如寫一個堆棧跟蹤到一個日誌文件)

+0

什麼?它是如此強大?你能告訴我一個代碼示例嗎?而且,通過*任何類*,它是否也包含了一個bundle私有實現中的類?即使是單身包? – Koldar

+1

@Koldar是的,引導類路徑總是首先被選中。覆蓋引導類路徑中已有內容的唯一方法是將其添加爲擴展名。 –

+0

哇,它似乎真的強大!但是,它不會打破模塊化嗎?有人可能會認爲不能以任何方式訪問實現,但通過擴展可以「捅他的鼻子」進入實現細節! (順便說一句,請在你的答案中添加一個代碼示例,我會很樂意接受你的回答) – Koldar