我一直在寻找创建模块化Web应用程序的解决方案,该模块是模块化的,即用户可以以简单jar的形式提供自己的插件,然后将其自身的数据提供给我的Web应用程序,而我的webapp将负责用于显示它。
现在的问题是,我希望我的Web应用程序尽可能通用,而不依赖于j2ee Web容器来支持任何内容。即,我不能依靠我的Web容器来提供osgi支持并将Web应用程序作为osgi捆绑包本身部署(这确实使事情变得非常简单,例如glassfish和WAS)。
我打算使用Equinox,而我目前看到的唯一解决方案是他们在其官方站点上提供的servlet桥,但是对我来说,将所有内容委派给servlet确实很痛苦,而servlet将反过来解释请求并找到合适的bundle类然后再次以某种方式仅将数据传递回Web应用程序。
对我来说,如果我的网络应用程序也捆绑在一起,那就太好了。有什么可以尝试的理想解决方案附近的东西吗?还是在osgi和Web应用程序(容器)这两个方面之间有任何其他通信方法?
在OSGi的规范详细介绍了WAB(Web存档包)格式。
而大同的Web提供了WAB / WAR大力支持的webapps(PAX Web上的春分,菲利克斯等运行正常)
使用pax web,您可以通过ServletContext获得BundleContext,例如:
BundleContext bundleContext = (BundleContext) getServletContext().getAttribute("osgi-bundlecontext");
对于您提到的用户驱动的可插拔性,建议您为插件包提供一些服务接口,以使其实现,并在您的Web应用程序中使用ServiceTracker监听其注册(除非您使用的是声明式服务)。您还可以轻松地从上载servlet 安装捆绑软件。
我猜上载插件的用户必须先登录并获得授权,所以此时会解决安全问题。
编辑:由于评论字段中的空间不足,因此在此处回复评论
抱歉,我误解了您的问题- 您有一个现有的webapp容器,并且想部署具有OSGi功能的WAR?如果是这样的话,那么既可以使用ServletBridge如其他人所说的或嵌入OSGi框架到你的战争(这是比较容易的,看到这个为例)。
您甚至可以通过尝试从ServletContext获取BundleContext来使其成为可选对象,如果返回的结果为null,则启动您自己的嵌入式框架。这样,它将在本机OSGi容器(例如Glassfish)或Java EE应用服务器中运行。
否则,PaxWeb是HttpService和WebApp OSGi规范的实现,但是具有许多扩展使生活变得更轻松-但您可以将其部署到OSGi容器中。