OSGI创建模块化Web应用程序

FUD*_*FUD 9 java osgi web-applications java-ee

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

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

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

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

ear*_*cam 5

OSGi的规范详细介绍了WAB(Web存档包)格式.

大同的Web提供了WAB /战争的webapps(PAX网络运行正常春分,菲利克斯等)的大力支持

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

BundleContext bundleContext = (BundleContext) getServletContext().getAttribute("osgi-bundlecontext");
Run Code Online (Sandbox Code Playgroud)

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

我猜测上传插件的用户必须登录并获得授权,因此此时会遇到安全问题.


编辑:在评论栏中回复评论时没有足够的空间

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

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

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