0

如何从 Java 以编程方式加载 OSGI 片段及其捆绑包中的所有资源(配置文件等)?

我想通过 getResource() 访问资源,就好像它们在内部 Jar 中一样。

4

1 回答 1

0

首先,您需要一个句柄来捆绑上下文。从那里你可以收听包引用,得到一个 Bundle 实例并使用它的类加载器来做你想做的事。

使用 Servlet 连接到包上下文和ServiceTracker来侦听出现的 osgi 包的示例

public class AnotherHelloWorldServlet extends HttpServlet {

  private MessageService service = null;
  private BundleContext context;

  @Override
  public void init(final ServletConfig config) throws ServletException {
    super.init(config);

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

    final AnotherHelloWorldServlet servlet = this;

    ServiceTracker tracker = new ServiceTracker(context,
        MessageService.class.getName(), null) {

      @Override
      public Object addingService(final ServiceReference sref) {
        log.infof("Adding service: %s to %s", sref, servlet);
        service = (MessageService) super.addingService(sref);
        return service;
      }

      @Override
      public void removedService(final ServiceReference sref, final Object sinst) {
        super.removedService(sref, service);
        log.infof("Removing service: %s from %s", sref, servlet);
        service = null;
      }
    };
    tracker.open();
  }
}

使用 ServiceReference,您可以调用getBundle()来获取捆绑实例,为此,getResource()可以获取您所要求的内容。

如果您不能使用 servlet 或类似的东西(=如果您在 Java EE/servlet 容器之外),那么我所知道的挂钩到捆绑上下文的标准方法并不多。在这种情况下,您可能需要求助于BundleContextProvider hack来获取它。

于 2013-01-19T00:36:50.163 回答