2011-09-01 60 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和插件也可以在运行时添加/删除。

缺点可能是因为它有没有证件,但你可能会问,它是开源的,我敢肯定他们会很乐意回答问题,甚至你可以更好的贡献 - 它仍处于孵化阶段。