1

我正在尝试使用 OSGI 包使我的 servlet 可扩展:新添加的包也必须是 servlet。Felix http://felix.apache.org/documentation/subprojects/apache-felix-http-service.html提供了一个 Servlet Bridge 功能,对我来说看起来很不错,但我在设置过程中遇到了一些问题。正如 Felix 网页所说,为了设置 servlet 桥,我们需要做:

  1. 在 Web 应用程序(WEB-INF/lib)中部署 org.apache.felix.http.proxy jar 文件;[完毕]
  2. 在启动侦听器(如 ServletContextListener)中,将 BundleContext 设置为 servlet 上下文属性[DONE]
  3. 在您的 web.xml 中定义 org.apache.felix.http.proxy.ProxyServlet 并注册它以服务于所有请求[完成]
  4. 在您的 web.xml 中定义 org.apache.felix.http.proxy.ProxyListener 以允许转发与 HTTP 会话相关的事件[DONE]
  5. 确保将 javax.servlet;javax.servlet.http;version=2.6 添加到 OSGi 系统包[非强制性]
  6. 在 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 桥接器?

4

1 回答 1

2

看起来我在配置嵌入式 OSGI 时犯了一个错误。现在我开始工作了,如果有人需要一个 felix servlet 桥的样本,请看一下:http: //vbashur.blogspot.kr/2014/07/osgi-servlet-bridge-sample.html

于 2014-07-08T06:23:42.253 回答