2013-03-04 75 views
5

當我剛開始在OSGi的樣子,我的印象是,你可以只建立一個JAR和,只要它有一個清單文件,你可以在一個OSGi容器部署下。我想像一個經典的方式構建我的模塊(maven),也許使用某種插件或類似的東西來編寫清單,然後我可以讓我的模塊基本上是一個獨立的應用程序,通過OSGi與其他模塊進行通信。的OSGi模塊/捆綁粒度

進一步閱讀關於OSGi,我開始看到一個更低水平正在使用它的更多的例子,基本上取代依賴注入和如日誌提供橫切關注點服務。似乎使用諸如hibernate或其他的東西,是一個問題...(或者我只是錯過了一些東西)。

至少對我而言,我並沒有真正看到如此精細的模塊化和整合到OSGi的水平,我寧願有一個單獨的模塊,每個模塊都有自己的一套技術和框架,以及可能的Web資源和持久層。這是OSGi可以實現的嗎?如果是的話,你能指出我正確的方向,例子等嗎?

編輯,加入我如何嘗試使用OSGi的一些細節:

我只是設想有一個以上級模塊的可能性,這可能有一個更higher-層級責任。

好比說議程模塊。在這種情況下,我希望擁有諸如事件的持久性,添加事件,使用過濾器列出事件等等。 此議程可能有幾個內部類,甚至可能需要持久層。所以我想用Guice這樣的東西去DI這些類,還有一些JPA來堅持我的數據。

我能理解一些X切關注像服務器或記錄可以有一個包,但數據模型是特定議程束。所以我認爲我的問題到底是什麼?什麼是不可能在捆綁內做的?作爲一種慣例,應該做什麼和不應該做什麼?

謝謝! 毛

回答

2

您可以使用OSGi的不強迫任何依賴基於OSGi的應用程序代碼。然而,由於OSGi提供模塊化,中間件(你的層)需要有一些OSGi的知識。問題是,在模塊化的世界中,你想隱藏實現細節,這是完整的目的。然而,像Spring和Hibernate這樣的東西傾向於認爲類路徑沒有邊界,並且它們會跑到圍欄中。幸運的是,越來越多的中間件正在爲此做好準備,我聽說Hibernate現在已經付出了努力,並且JPA也可以在OSGi中使用。

+0

因此,如果我使用OSGi就緒框架(guice?),我可以繼續使用它們在我的包內? – Mauricio 2013-03-04 16:26:06

+0

是的,這將起作用然而,我的(相當廣泛的)經驗是,當你編寫像Spring這樣的非常模塊化的代碼框架時,Guice等往往會失去其主要價值,因爲問題變得如此之小以至於這些框架感覺相當超重。一個好的包是一致的,然後你通常不需要這些框架的開銷。然而,在OSGi世界中沒有任何東西禁止你加入這個重量:-) – 2013-03-04 17:42:03

1

關於使用maven構建,您可以使用Maven-Bundle-Plugin它幫助您構建OSGi包,而無需自行編寫清單。所有必需的元信息將在您的POM中。

依賴注入可以在模塊層的頂部來實現。一種可能的解決方案是聲明式服務,它使您能夠通過XML描述或代碼註釋進行注入。它強烈地反映了OSGi服務的動態性質(動態綁定解綁定服務)。 另一種方法是Blueprint它基於Spring並具有非常類似的語法。其中一個關鍵特徵是它可以抽象綁定和解除綁定服務的性質。如果您考慮使用Spring,請使用藍圖。

OSGi只暗示你如何構建你的模塊。你可以得到一個明確定義的模塊交互圖(誰導入/導出一個包?誰導出服務和誰使用它?) 因此,您可以通過爲每個任務構建內聚捆綁包來構建企業體系結構。

1

OSGi有時被稱爲面向服務的JVM架構。將捆綁包看作提供服務的模塊化單元有助於定義正確的粒度:通常會有API捆綁包,它們只是提供定義API的Java包,提供這些API實現的服務捆綁包以及提供實用程序/輔助捆綁包你提到的交叉服務。

您可以在OSGi之上使用一些依賴注入框架,但從我的經驗(使用Apache Sling和Adobe CQ5)保持簡單的情況往往會更好。 OSGi服務組件運行時和配置管理提供了管理服務,依賴性和配置所需的全部功能,特別是如果您從一開始就爲此設計系統。

您可以在我的「OSGi戰壕傳說」幻燈片http://www.slideshare.net/bdelacretaz/tales-from-the-osgi-trenches-2012-short-form-edition上設計Adobe CQ5的設計經驗,這可能有助於更好地感受OSGi如何用於構建複雜系統。

+0

謝謝, 我只是想象擁有一個以上的一流模塊,可能有更高層次的責任。就像說議程模塊一樣。 在這種情況下,我想擁有諸如事件的持續性,添加事件,使用過濾器列出事件等等。 此議程可能有幾個內部類,甚至可能需要持久層。所以我想用Guice這樣的東西去DI這些類,還有一些JPA來堅持我的數據。 我可以理解,像服務器這樣的X切割問題可以有一個包,但數據模型是特定於議程包的。 – Mauricio 2013-03-05 13:01:45

+0

請注意,您也可以在捆綁包中使用內部服務,使用的捆綁包不是從包中導出的接口,也不是捆綁包本身的實現 - 這適用於在本地更好地模塊化您的議程捆綁包的「本地服務」,而仍然只使用OSGi的服務運行時。 – 2013-03-05 16:46:48

2

OSGi是很多事情很多人,你幾乎可以挑選你想用什麼部位的吧:

  1. 你有沒有使用任何其他依賴一個普通的圖書館嗎?甜心,只要提供一個最小化的MANIFEST.MF列出公共包,使用maven來構建你的JAR,就完成了。
  2. 你有依賴嗎?與(1)相同,您只需在清單中添加導入的包。
  3. 你需要執行一些初始化嗎?寫一個Activator,並在清單中提及它。
  4. 服務?只需將它們的依賴關係和描述放在XML文件中,並將它們添加到清單中即可。

依此類推 - 只需使用舒適的水平即可。另一方面,如果你想做web應用程序,你真的需要考慮OSGi,你使用的庫,你的應用程序管理器和servlet/jee /任何容器之間的架構相互作用。 OSGi居住在什麼級別?一般來說,OSGi-> container-> app,container-> OSGi-> app和container-> app-> OSGi解決方案,每個都有自己的特性。