从servlet访问osgi bundle类

时间:2013-12-27 01:29:34

标签: java tomcat osgi

我有两个项目。

  1. osgi bundle(eclipse插件项目)。
  2. 一个简单的Web应用程序(可在tomcat中部署)。
  3. 我已经从tomcat启动了felix容器,没有问题,请点击下面的链接

    http://felix.apache.org/documentation/subprojects/apache-felix-http-service.html#using-the-servlet-bridge

    现在我遇到了如何从servlet调用bundle(已经安装在felix容器中)的类。由于bundle项目不在classpath中,而是在以下位置,因此抛出class not found错误 /WEB-IN/bundles.(我必须使用此位置为捆绑)。那怎么可能实现呢?

1 个答案:

答案 0 :(得分:0)

框架包的BundleContext被放入ProvisionActivator中的servlet上下文中:

servletContext.setAttribute(BundleContext.class.getName(), context);

这意味着您可以通过servletContext(在所有普通servlet中都可用)访问BundleContext,如下所示:

BundleContext context = servletContext.getAttribute(BundleContext.class.getName());

您可以通过以下方式访问嵌入式OSGi容器中的类:

  • 通过bundleContext
  • 请求包含该类的包
  • 使用bundle.loadClass(“myClass”)方法获取类。只有在转换为普通WAR或反射
  • 提供的接口时,才能使用该类

这是这样做的方法,但是你不应该使用这种方法:)。以您在捆绑包中注册实现来自WAR类路径的接口的OSGi服务的方式设计您的解决方案。之后,您应该使用bundleContext对象来检索OSGi服务对象。

其他好的解决方案是,如果您在bundle中实现所需的逻辑,而不是来自WAR的类。