我一直在寻找一种创建模块化Web应用程序的解决方案,它是模块化的,用户可以以简单的jar形式提供自己的插件,然后将自己的数据提供给我的Web应用程序和我的webapp将负责显示它。
现在问题是,我希望我的网络应用程序尽可能通用,而不依赖于j2ee Web容器来支持任何内容。即我不能依赖我的Web容器来提供osgi支持并将Web应用程序部署为osgi包本身(这对于例如glassfish和WAS来说真的很简单)。
我打算使用equinox并且只有解决方案,我目前看到的是他们在官方网站上提供的servlet桥接器,但对我而言,将所有内容委托给servlet真的很痛苦,而servlet又会解释请求并找到一个适当的bundle Class然后再以某种方式仅将数据传回Web应用程序。
对我来说,如果我的网络应用程序也是一个捆绑包那就太棒了。 我能尝试的理想解决方案有什么接近的吗?或osgi和web应用程序(容器)的两个关系之间的任何其他通信方法?
答案 0 :(得分:5)
OSGi spec详细说明了WAB(Web存档包)格式。
并且Pax Web为WAB / WAR webapps提供了很好的支持(PAX Web在Equinox,Felix等上运行良好)
使用pax web,您可以通过ServletContext获取BundleContext,例如:
BundleContext bundleContext = (BundleContext) getServletContext().getAttribute("osgi-bundlecontext");
对于您提到的用户驱动的可插拔性,我建议您为插件包提供一些服务接口来实现,并且在您的webapp中使用ServiceTracker来监听他们的注册(除非您使用声明式服务)。您也可以轻松地从上传servlet install bundles。
我猜测上传插件的用户必须登录并获得授权,因此此时会遇到安全问题。
编辑:在评论栏中回复评论
道歉,我想我误解了你的问题 - 你有一个现有的webapp容器,你想部署一个带OSGi功能的WAR吗?如果是这种情况,那么要么像其他人提到的那样使用ServletBridge,要么将OSGi框架嵌入到WAR中(这相对容易,例如参见this)。
您甚至可以通过尝试从ServletContext获取BundleContext来使其成为可选项,如果这返回null,则启动您自己的嵌入式框架。这样它将在本机OSGi容器(例如Glassfish)或Java EE应用服务器中运行。
否则,PaxWeb是HttpService和WebApp OSGi规范的一个实现,但是有很多扩展可以让生活更轻松 - 但是你可以将它部署到OSGi容器中。
答案 1 :(得分:2)
您可能需要查看Apache Sling。它是一个具有嵌入式OSGi容器的Web框架。 OSGi容器名为Apache Felix,非常好。
答案 2 :(得分:1)
ServletBridge用于在Web容器中嵌入OSGI contianer。另一种选择是在OSGI容器中嵌入一个Web容器(作为一个包)。以下文章详细介绍了如何实现这一目标。
答案 3 :(得分:1)
您可能想尝试 ChonCMS - http://www.choncms.com
它的架构完全基于您的要求,它带有很少的插件来启用基本CMS功能,它是模块化平台,带有使用felix的小型Web应用程序容器,并且插件也可以在运行时添加/删除。 / p>
缺点可能是它缺乏文档,但你可能会问,它是开源的,我相信他们会很乐意回答问题,甚至更好的你可以贡献 - 它仍处于孵化阶段。< / p>