2012-07-01 51 views
6

我知道已經有一些與此主題相關的問題,但我還找不到真正的解決方案。如何使用OSGi和EE6模塊化企業應用程序?

目前我正在開發應用程序與EE6,使用JPA,CDI,JSF。我想採取更加模塊化的方法,而不是將所有東西都打包成WAR或EAR,並將所有東西部署到應用服務器上。

我試圖通過分離模塊來設計我的應用程序儘可能模塊化到3個Maven項目:

  • API - 包含(無狀態)服務接口
  • 模型 - 包含JPA實體具體模塊
  • 默認地將Impl - 包含了API的實現,主要是CDI豆

每一個模塊的視圖邏輯正在內的大bundeled網絡項目,這是醜陋的。我已經想到了網頁片段,但是如果我將我的bean類和xhtml文件傳播到jar文件中,我將不得不實現一個鉤子,以便可以通過父級Web應用程序查找資源。這種解決方案至少可以讓我爲每個模塊創建第四個項目,其中包含與模塊相關的所有視圖邏輯,這是一個好的開始。

我想要的不僅是我可以擁有這4種項目,而且每個項目都是可熱插拔的。這導致我開始使用OSGi,在我意識到EE6技術在OSGi容器中得不到很好的支持之前,OSGi一開始真的很酷。

JPA

讓我們來看看JPA第一。有一些教程[1]解釋瞭如何創建JPA啓用的OSGi Bundle,但是這些教程都沒有展示如何將實體分散到不同的bundle(模塊的模型項目)中。我想有例如三個不同的模塊

  • 核心
  • 用戶
  • 博客

的博客模塊的示範項目對模型項目(編譯時)的依賴的用戶。 用戶模塊的模型項目對核心的模型項目具有(編譯時)依賴性。

如何讓JPA在這種情況下工作,而無需爲模塊的每個模型項目創建持久性單元?我想要一個知道所有實體在運行時可用的持久化單元。實體所在的示範項目當然應該是可熱插拔的。也許我需要爲每個導入項目所需的所有實體的客戶端創建一個單獨的項目,並且包含一個包含所有必要配置項的persistence.xml。是否有任何可用的Maven插件來構建這樣的項目,甚至有其他方法來解決這個問題?

CDI

CDI是非常好的。我真的很喜歡它,我不想再想念它了!我使用CDI擴展,如MyFaces CODI和DeltaSpike,它們非常棒! 我注入我的(無狀態)服務到其他服務或視圖層,這是非常好的。由於我的服務是無狀態的,因此將它們用作OSGi服務應該不成問題,但是如何將CDI集成到OSGi中呢?我找到了Glassfish CDI Extension [2],將OSGi Services注入CDI bean,但我也希望OSGi Services可以成爲CDI beans。我不完全確定如何實現,可能我不得不使用BeanManager實例化實現,然後在BundleActivator中的ServiceRegistry中爲其接口註冊每個實現。有沒有標準的方法來做到這一點?我想避免對OSGi框架的任何(編譯時)依賴。

我也想使用我的服務,就像我現在使用它們一樣,沒有改變任何東西(實現沒有註釋和注入點不合格)。 有一個JBoss焊接擴展/子項目[3],似乎是針對這個問題,但似乎是無效的,我找不到任何最佳實踐或方法。 我該如何離開我的實施,但仍然能夠使用OSGi?我的意思是,爲實現添加註釋並不是什麼大問題,因爲每個實現都已經使用了構造型註解進行了註釋,無論如何我都想阻止這種註釋。

JSF

正如之前提到的,我想能夠明智傳播我的觀點的邏輯模塊。據我所知,這是不可能的。 Pax Web [4]應該以某種方式解決這個問題,但我並不熟悉它。

我想在包含Facelet模板的模塊「核心」中有一個項目「CoreWeb」,我們稱之爲「template.xhtml」。然後,模塊「博客」中名爲「BlogWeb」的項目中的JSF頁面應該能夠引用該模板並應用合成。

爲了能夠擴展視圖,我將引入一個可以通過特定類別的模塊實現的java接口「擴展」。然後,視圖的控制器將注入擴展的所有實現。例如,一個擴展會提供一個子視圖列表,這些子視圖將包含在主視圖中。

所描述的擴展機制可以很容易實現,但下列條件必須滿足:

  • 當增加新的OSGi包到應用服務器,一組可用的擴展可能會改變的,擴展必須是可用爲視圖的控制器。
  • 應該可以訪問應包含在主視圖中的子視圖(來自單獨的包)。

Spring Slices單個主機但多個切片應用程序的概念非常有趣,但似乎僅限於Spring DM Server,該項目似乎也處於非活動狀態。

摘要

我描述我希望你知道,我想才達到什麼的所有例子和行爲之後。它只是一個非常動態和模塊化的EE6應用程序。

最後我期待的至少是關於如何讓所有的東西都能像我期望的那樣運行,甚至是更好的工作解決方案!

[1] http://jaxenter.com/tutorial-using-jpa-in-an-osgi-environment-36661.html

[2] https://blogs.oracle.com/sivakumart/entry/typesafe_injection_of_dynamic_osgi

[3] http://www.slideshare.net/TrevorReznik/weldosgi-injecting-easiness-in-osgi

[4] http://team.ops4j.org/wiki//display/paxweb/Pax+Web

[5] https://jira.springsource.org/browse/SLICE

回答

1

爲了回答您的一些問題,使用一個單一的持久性單元,但將你的實體分散到多個單元中ple bundles is not recommended, but may occasionally work。但是,如果您的實體密切相關以至於需要共享一個持久性單元,則將它們跨模塊分割可能沒有意義。另外,不要忘記你可以通過分離每個實體的實現和接口來處理編譯時依賴性 - 接口和實現不需要在同一個bundle中。

對於依賴注入,您可能會喜歡Blueprint。 有幾種實現方式可供使用,並且大多數具有企業OSGi支持的應用程序服務器支持Blueprint開箱即用。它使用XML來添加元數據,所以類本身不需要任何修改。

+0

核心模塊還包含對可用實體的通用訪問權限,因此我必須只有一個PU,但如果我不必將它們打包到一個jar文件中,那將會很好。可能有一些Maven插件可以完成包裝,但是IMO不知道怎麼樣,不像OSGi。我已經看過一些Blueprint的例子,我不喜歡xml配置的非類型安全。如果沒有其他選擇,那麼我可能不得不使用它或自行實施CDI解決方案。 –

+0

基督徒,你是否發現任何完美的解決方案爲您的模塊化應用程序。你可以和我分享嗎?我有同樣的問題? – Suraj

+0

我找不到任何直接的解決方案。我正在等待Java 9(Jigsaw)和一個使用模塊的EE版本。 JPA項目的當前解決方案:使用一個包含子模塊的orm.xml文件的持久性項目。 CDI項目的當前解決方案:將項目分開,並在添加依賴關係時小心。 Web項目的當前解決方案:將可能的東西分離到子項目中,並將所有內容組合在一起。如果要添加新模塊或將所有模塊放入應用程序但只顯示子集,請重新部署。 –

相關問題