2012-01-10 62 views
0

我有一個服務器端應用程序,並且想要將osgi框架嵌入到動態包加載中。
假設我想公開一個QuoteImpl實現IQuote(實例化爲服務器容器引導程序/ Spring的一部分),供不同的Bundle使用。OSGI Embedded Equinox - 用於訪問未在osgi框架中實例化的pojos的包

Q1。是否有一種將服務器應用程序實例暴露給Bundle的乾淨方式? (順便說一句,因爲遺產是不可能使服務器代碼捆綁:)並且不想讓整個應用程序osgi'ed。

試圖通過服務和捆綁暴露投入IQuote。不知道我做得很好,但由於IQuote駐留在覈心應用程序項目中而不是捆綁項目,導致未解決的編譯問題失敗。有任何想法嗎?

回答

3

是的,要做到這一點的方式是與服務。 「主機」應用程序將發佈服務,並且OSGi內部的捆綁包將以正常方式使用該服務。

要實現此目標的關鍵在於服務API(即包含IQuote的包)必須由主機應用程序通過系統包導出導出。您可以通過在創建嵌入式OSGi框架時設置org.osgi.framework.system.packages.extra屬性來控制此屬性。我在這個主題上寫了一個blog post,可以幫助您開始使用(查找標題「公開應用程序包」)。

您聲明您有編譯問題。爲了解決這些問題,有必要了解您如何構建項目和構建系統。

+0

尼爾非常感謝您回來。我真的用你的博客作爲指導。 – Slash 2012-01-11 10:01:05

+0

偉大的博客btw。我解決了編譯問題。我有3個項目引用包(包含Iquote接口),Consumer包(使用IQuote)和Launcher項目(模仿我的應用程序服務器(不是包)並以編程方式註冊服務IQuote的實現)。當我嘗試執行context.getServiceReference(IQuoteService.class.getName())時,我在consumer bundle中爲serviceReference獲得一個NULL; 我的問題是:當然,我錯過了一些東西。實施是否需要捆綁?啓動器在我啓動框架時註冊服務(不在Activator中) – Slash 2012-01-11 10:14:18

+0

'public static void main(String [] args){ \t .. \t FrameworkFactory frameworkFactory = ServiceLoader.load(FrameworkFactory.class).iterator()。next (); config.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA 「osgi.main」); 框架框架= frameworkFactory.newFramework(config); framework.start(); \t \t \t \t \t BundleContext context = framework.getBundleContext(); context.registerService(IQuoteService.class.getName(),new SimpleQuote(),null); \t} } – Slash 2012-01-11 11:06:15