java - OSGI 创建模块化 Web 应用程序

标签 java web-applications jakarta-ee osgi

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

现在的问题是我希望我的 Web 应用程序尽可能通用,而不依赖于 j2ee Web 容器来支持任何东西。即我不能依赖我的 Web 容器来提供 osgi 支持并将 Web 应用程序部署为 osgi 包本身(这确实使事情变得非常简单,例如 glassfish 和 WAS)。

我计划使用 Equinox,目前我看到的唯一解决方案是他们在其官方网站上提供的 servlet 桥,但对我来说,将所有内容委托(delegate)给 servlet 真的很痛苦,而 servlet 又会解释请求并找到一个适当的捆绑类,然后再次以某种方式仅将数据传回 Web 应用程序。

对我来说,如果我的网络应用程序也是一个包,那就太好了。 有什么接近我可以尝试的理想解决方案吗?或者osgi和web应用(容器)这两个relams之间的任何其他通信方式?

最佳答案

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

Pax Web为 WAB/WAR 网络应用程序提供强大的支持(PAX Web 在 Equinox、Felix 等平台上运行良好)

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

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

对于您提到的用户驱动的可插拔性,我建议您为插件包提供一些服务接口(interface)来实现,并在您的 webapp 中使用 ServiceTracker收听他们的注册(除非您使用的是声明式服务)。您也可以轻松地install bundles来自上传 servlet。

我猜想上传插件的用户必须登录并授权,所以此时会遇到安全问题。


编辑:由于评论字段空间不足而在此处回复评论

抱歉,我想我误解了你的问题 - 你有一个现有的 webapp 容器并且你想部署一个具有 OSGi 功能的 WAR?如果是这种情况,那么要么像其他人提到的那样使用 ServletBridge,要么将 OSGi 框架嵌入到您的 WAR 中(这相对容易,例如参见 this)。

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

否则,PaxWeb 是 HttpService 和 WebApp OSGi 规范的实现,但有很多扩展以使生活更轻松 - 但您将其部署到 OSGi 容器。

关于java - OSGI 创建模块化 Web 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7266412/

相关文章:

java - 与 WebSphere 和 Spring 集成进行 SSH 配置

spring-mvc - @scope ("request") 不起作用,spring mvc 仍然返回一个单例

java - oracle 11g xe 的本地主机是什么?

java - session.getAttribute 在禁用 cookie 时返回 null

java - 如何在java中将整个第二个数组 append 到第一个数组

html - 有没有办法设置 Netbeans HTML5 和 Web 应用程序项目?

java - 如何以编程方式关闭 WAR/EAR

java - 无限循环 + Thread.sleep 替换 cron 作业

java - 如何隐藏或删除 Android HoneyComb 中的状态栏?

java - 为 HeaderView 禁用 JTable 行排序器