我正在尝试使用 OSGI 包使我的 servlet 可扩展:新添加的包也必须是 servlet。Felix http://felix.apache.org/documentation/subprojects/apache-felix-http-service.html提供了一个 Servlet Bridge 功能,对我来说看起来很不错,但我在设置过程中遇到了一些问题。正如 Felix 网页所说,为了设置 servlet 桥,我们需要做:
- 在 Web 应用程序(WEB-INF/lib)中部署 org.apache.felix.http.proxy jar 文件;[完毕]
- 在启动侦听器(如 ServletContextListener)中,将 BundleContext 设置为 servlet 上下文属性[DONE]
- 在您的 web.xml 中定义 org.apache.felix.http.proxy.ProxyServlet 并注册它以服务于所有请求[完成]
- 在您的 web.xml 中定义 org.apache.felix.http.proxy.ProxyListener 以允许转发与 HTTP 会话相关的事件[DONE]
- 确保将 javax.servlet;javax.servlet.http;version=2.6 添加到 OSGi 系统包[非强制性]
- 在 OSGi 框架内部署 org.apache.felix.http.bridge(或 org.apache.felix.http.bundle)[????]
第 6 步似乎不足以使 servlet 桥在我的情况下工作。我为我的 bundle servlet 做了所有步骤 1-5。我的主 servlet 具有 OSGI 嵌入式机制,所以我从 java 代码部署我的包。这是一段 OSGI 启动器的代码:
Map m = new HashMap();
m.putAll(System.getProperties());
m.put(Constants.FRAMEWORK_STORAGE_CLEAN, "onFirstInit");
m.put(Constants.FRAMEWORK_SYSTEMPACKAGES, "org.osgi.service.http");
fwk = getFrameworkFactory().newFramework(m);
fwk.start();
// Install bundle JAR files and remember the bundle objects.
BundleContext ctxt = fwk.getBundleContext();
for (int i = 0; i < jars.size(); i++) {
Bundle b = ctxt.installBundle(((File) jars.get(i)).toURI().toString());
bundleList.add(b);
}
// Start all installed non-fragment bundles.
for (int i = 0; i < bundleList.size(); i++) {
if (!isFragment((Bundle) bundleList.get(i))) {
((Bundle) bundleList.get(i)).start();
}
}
从主 servlet 代码中,我安装了所需org.apache.felix.http.bridge
的包、我的 servlet 包(slf4j、javax.servlet...)的一些依赖项以及我按照步骤 1-5 制作的 servlet 包。部署结果:没有可用于 Servlet Bundle 的 HttpService - 这意味着我无法在我的应用程序中使用它,导致无法在我的 servlet 包中注册任何 Servlet 实例。
查看 MANIFEST.MF 的org.apache.felix.http.bridge
我没有发现任何提及Export-Service: org.osgi.service.http.HttpService
我需要如何使用这个捆绑包?我需要如何设置 servlet 桥接器?