2011-09-01 61 views
9

我一直在尋找一種解決方案來創建一個模塊化的Web應用程序,它是模塊化的,用戶可以通過簡單的jar提供自己的插件,然後將自己的數據提供給我web應用程序和我的webapp將負責顯示它。OSGI創建模塊化Web應用程序

現在,捕獲是我希望我的web應用盡可能通用,而不依賴於j2ee web容器來支持任何東西。即我不能依靠我的web容器來提供osgi支持,並將web應用程序部署爲osgi bundle本身(這對於egfishfish和WAS來說確實非常簡單)。

我打算使用equinox,並且目前唯一的解決方案是他們在官方網站上提供的servlet橋,但對我來說,將所有東西委託給一個servlet是一件非常痛苦的事,而servlet又會解釋請求並發現一個適當的bundle類,然後再次以某種方式傳回數據到Web應用程序。

對我來說,如果我的網絡應用程序也是一個包,那將是美好的。 有什麼東西接近這個理想的解決方案,我可以嘗試?或者osgi和web appliction(容器)的兩個繼承關係之間的任何其他通信方法?

回答

5

OSGi spec詳細說明了WAB(Web Archive Bundle)格式。

而且Pax Web提供了WAB /戰爭的webapps大力支持(PAX網絡運行在春分,菲利克斯等精細)

使用PAX網您通過ServletContext中獲得的BundleContext,例如:

BundleContext bundleContext = (BundleContext) getServletContext().getAttribute("osgi-bundlecontext"); 

對於您提到的用戶驅動可插拔性,我建議您提供一些服務接口供插件包實現,並在您的Web應用程序中使用ServiceTracker來偵聽其註冊(除非您使用聲明式服務)。您還可以輕鬆地從上傳servlet中獲得install bundles

我猜測用戶上傳插件需要登錄並獲得授權,所以安全問題將在此時實現。


編輯:回覆此評論,因爲在註釋字段

道歉沒有足夠的空間,想我誤解你的問題 - 你有一個現有的Web應用程序容器(S)和要部署一個WAR與OSGi功能?如果是這樣的話,可以像其他人提到的那樣使用ServletBridge,或者將OSGi框架嵌入到WAR中(這很簡單,例如參見this)。

您甚至可以通過嘗試從ServletContext獲取BundleContext來實現此選項,並且如果返回null,則啓動您自己的嵌入式框架。這樣它將在本機OSGi容器(例如Glassfish)或Java EE應用服務器中運行。

否則,PaxWeb是HttpService和WebApp OSGi規範的實現,但有很多擴展使生活更輕鬆 - 但是您將其部署到OSGi容器。

+0

嗨你的回覆很有趣我知道WABs,這就是我在我的問題中提到的「我不能依靠我的Web容器來提供osgi支持,並將它部署爲一個osgi bundle本身」。但是我沒有意識到pax web,你給出的官方鏈接暗示它將碼頭作爲wabs部署的延伸?你能進一步解釋嗎? – FUD

+0

謝謝,我會評估你在鏈接中建議的方法。 – FUD

1

ServletBridge用於在Web容器中嵌入OSGI contianer。另一種選擇是將Web容器(作爲包)嵌入到OSGI容器中。以下文章詳細介紹瞭如何實現這一點。

http://java.dzone.com/articles/osgi-and-embedded-jetty

+0

謝謝我知道這一點,但我不想限制到任何特定的Web容器和afaik嵌入大多數服務器不是一個選項。 – FUD

2

你可能想看看Apache Sling。它是一個具有嵌入式OSGi容器的Web框架。 OSGi容器被稱爲Apache Felix,非常好。

+0

這看起來不錯,但我不想受框架支持的限制,例如我想爲我的web應用程序使用JSF。也許我應該在我的問題中提到這一點。 – FUD

1

你可能想嘗試ChonCMS - http://www.choncms.com

它的架構是基於究竟是什麼你問,它帶有一些插件,使基地CMS功能,它是與未成年人網絡應用程序容器的模塊化平臺使用felix和插件也可以在運行時添加/刪除。

缺點可能是因爲它有沒有證件,但你可能會問,它是開源的,我敢肯定他們會很樂意回答問題,甚至你可以更好的貢獻 - 它仍處於孵化階段。