2012-06-11 118 views
1

我的應用程序從屬性文件中獲取類名稱。這些類名錶示的類可以駐留在某些未知的OSGI捆綁包中,因此爲了實例化它們,我首先必須找到這些類屬於哪個捆綁包。我正在考慮從BundleContext#getBundles獲取所有已安裝的bundle,這意味着我必須在AbstractUIPlugin#start中獲取對BundleContext的引用。但我不確定是否持有對BundleContext的引用是正確的,因爲它只能在啓動方法中使用。所以我在這裏需要OSGI專家的建議,以獲得捆綁列表的替代方案。在運行時獲取已安裝的OSGI軟件包列表

任何幫助將不勝感激。

問候,

Setya

+0

爲什麼要在OSGi中實例化類?將它們聲明爲服務並讓Equinox處理它們的生命週期您是否有特定的理由這樣做? – maasg

回答

5

這不是OSGi是真的打算如何。如果一個bundle有一些東西要添加到'全局'上下文中,你應該註冊一個服務。因此,每個需要共享的軟件包都可以通過自己的啓動方式來實現。

其他一些組件(DS,ServiceTracker,Blueprint等)可以監聽這些事件並採取相應的行動。

這真的很重要,如果你開始手動搜索所有包,你完全失去了OSGi的優勢。

1

就像之前寫的,你應該嘗試使用服務來實現你想要的。我想你有一個接口,應該在運行時安裝一個或多個實現。因此,如果您控制實現接口的捆綁包,那麼只需讓他們通過使用Activator或藍圖上下文將其實現作爲服務安裝即可。您可以使用服務屬性來描述您的實現。

需要實現的捆綁包然後可以使用藍圖中的服務跟蹤器或服務引用來查找服務。

如果這是不可能的,那麼你可以使用bundle上下文獲得正在運行的bundle並實例化類,但這不是OSGi應該如何工作的。您將遇到類加載問題,因爲嘗試實例化類的包不會直接訪問它們。

1

您的軟件包在啓動時通過捆綁激活器或通過DS更好地控制。那時它可以向服務註冊中心註冊服務,以便其他人可以找到/使用它們。

你打算去的路線(名稱類的屬性)是邪惡的,因爲你毫無疑問會在類加載地獄中運行。模塊化是關於隱藏你的實現細節,你的實現類的名字就是這樣的細節。

在屬性文件中公開實現類是非常糟糕的做法,它喪失了模塊化的優勢。如果另一個類引用您的實現類或屬性文件,則無關緊要,問題在於impl。類暴露。

不幸的是這模式已成爲在我們這個行業很流行,很多開發商認爲這是正常的:-(

的OSGi可以讓你分享通過接口的方式,允許實現類只可內已知類型的實例模塊

相關問題