2012-10-07 33 views
2

我正在編寫一個在OSGI環境中運行的應用程序。 現在我想提取一些代碼,並將其放在單獨的捆綁包/ jar文件中,以便在其他應用程序(OSGI或非OSGI)中重複使用它。什麼是構建可在OSGI和非OSGI環境中工作的庫的好方法?

我的目標是消除對OSGI環境類的任何依賴,因爲它也應該運行在其他沒有各種OSGI框架(例如Equinox)的jar的應用程序中。但同時我想在OSGI環境中註冊OSGI服務,前提是該應用程序是OSGI應用程序。

我已經分開的代碼和OSGI相關的代碼僅剩的一塊目前我的活化劑類註冊一些類如OSGi服務:

context.registerService(MyServiceInterface.class.getName(), new MyServiceImpl(), new Hashtable()); 

要刪除的依賴,我想想以下:

  • 我從我的bundle1卸下促動和OSGI依賴
  • 我創建另一個bundle2中,我移動激活

最後,我有我的bundle1.jar,它只有一個Manifest.mf文件以使它成爲OSGI就緒,但根據OSGI框架類,不再有任何代碼。 我有另一個bundle,它只屬於我當前的應用程序,它導入了bundle1.jar,並且具有使用激活器在OSGI容器上註冊MyService.class的唯一目的。

  1. 該方法是否正確或是否還有其他最佳實踐?
  2. 在OSGI環境良好實踐中註冊服務還是這是東道主應用程序應負責的東西?

回答

2

爲什麼不把激活器類放在你的包中。當在非OSGi環境中運行時,激活器類將不會被調用。當在OSGi環境中運行時,它會。將OSGi依賴關係隔離到激活器是一個很好的策略。

+0

該方法的問題在於Activator具有org.osgi.framework的import語句.BundleActivator和org.osgi.framework.BundleContext會導致在非OSGI環境下發生編譯錯誤。這就是我試圖避免 – Christoph

+0

你是說你甚至不想在你的構建路徑上有OSGi庫?爲什麼不,費用是多少?我明白從您的運行時依賴關係中刪除OSGi ... –

+0

好吧,我還沒有想過這件事。那麼這是否是有效的做法?我會很好,因爲我們的構建路徑確實有這些依賴關係(目前使用pde構建)。我打算在github上提供一個maven pom.xml的庫,這就是爲什麼我想讓它對於非osgi應用程序儘可能輕量級的原因。但這是我的第一個開源版本,我首次想到了這種事情。 – Christoph

1

在大多數情況下,您可以在沒有Activator的情況下發布您的服務。看看OSGI Comunity WikiEquinox example

+0

是的聲明式服務方法可能是最好的方法。在我的情況下,我不想切換到DS,所以我會從我的服務包中刪除激活器,並擁有另一個包含激活器的包。這樣,我的Service Bundle完全獨立於OSGI,除了Manifest.MF和一些包導入和導出定義。 – Christoph

+0

如果您使用maven,您可以將osgi框架依賴關係的範圍設置爲提供。 – white

+1

聽起來很不好,因爲它需要導出服務實現類(MyServiceImpl)? 我的選擇是使用DS XML文件... –

1

另一種方法是使用藍圖。至少在簡單情況下,它完全不依賴於OSGi。對於真實世界的情況,您通常至少需要一些OSGi API,但在非OSGi情況下將它們保持非活動狀態並不成問題。您也可以嘗試PojoSR。它允許在OSGi之外使用Activators和OSGi服務。我們開始在Apache Camel中使用它來測試OSGi代碼。

1

使用Spring-DM將幫助將代碼依賴關係移除到OSGi。你的bundle不需要激活器,服務可以從spring-dm config xml中導出。但是,這確實會增加更多的運行時依賴關係,但不需要編譯依賴關係。