OSGI创建模块化Web应用程序

我一直在寻找一种创建模块化Web应用程序的解决方案,它是模块化的,用户可以以简单的jarforms提供自己的插件,然后将自己的数据提供给我的Web应用程序,我的webapp将负责用于显示它。

现在问题是我希望我的网络应用程序尽可能通用,而不依赖于j2ee Web容器来支持任何事情。 即我不能依赖我的Web容器来提供osgi支持并将Web应用程序部署为osgi bundle本身(这对于例如glassfish和WAS来说真的很简单)。

我打算使用equinox并且只有解决方案,我目前看到的是他们在官方网站上提供的servlet桥,但对我而言,将所有内容委托给servlet真的很痛苦,而servlet又会解释请求并找到合适的bundle类然后再以某种方式仅将数据传回Web应用程序。

对我而言,如果我的网络应用程序也是一个包,那将是很棒的。 有什么接近这个理想的解决方案,我可以尝试? 或osgi和web应用程序(容器)的两个相关之间的任何其他通信方法?

OSGi规范详细介绍了WAB(Web Archive Bundle)格式。

Pax Web为WAB / WAR webapps提供了很好的支持(PAX Web在Equinox,Felix等上运行良好)

使用pax web,您可以通过ServletContext获取BundleContext,例如:

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

对于您提到的用户驱动的可插拔性,我建议您为插件包提供一些服务接口来实现,并且在您的webapp中使用ServiceTracker来监听他们的注册(除非您使用声明式服务)。 您还可以轻松地从上载servlet 安装捆绑包 。

我猜测用户上传插件必须登录并获得授权,因此此时已经满足安全问题。


编辑:回复评论此处评论字段中的空间不足

道歉,我想我误解了你的问题 – 你有一个现有的webapp容器,你想部署一个带OSGifunction的WAR吗? 如果是这种情况,那么要么像其他人提到的那样使用ServletBridge,要么将OSGi框架嵌入到WAR中(这相对容易,请参阅此示例)。

您甚至可以通过尝试从ServletContext获取BundleContext来使其成为可选项,如果这返回null,则启动您自己的嵌入式框架。 这样它将在本机OSGi容器(例如Glassfish)或Java EE应用服务器中运行。

否则,PaxWeb是HttpService和WebApp OSGi规范的实现,但是有许多扩展可以使生活更轻松 – 但是将它部署到OSGi容器中。

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

ServletBridge用于在Web容器中嵌入OSGI contianer。 另一种选择是在OSGI容器中嵌入一个Web容器(作为一个包)。 以下文章详细介绍了如何实现这一目标。

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

您可能想尝试使用ChonCMShttp://www.choncms.com

它的架构完全基于您的要求,它带有几个插件来启用基本CMSfunction,它是模块化平台,带有使用felix的小型Web应用程序容器,并且可以在运行时添加/删除插件。

缺点可能是它缺乏文档,但你可能会问,它是开源的,我相信他们会很乐意回答问题,甚至更好的你可以贡献 – 它仍处于孵化阶段。