如何从Java中以编程方式动态加载OSGI片段?

时间:2013-01-18 22:49:58

标签: java osgi

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

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

1 个答案:

答案 0 :(得分:0)

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

使用Servlet挂钩到bundle上下文和ServiceTracker来监听osgi bundle出现的示例

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容器之外),那么没有那么多标准方法可以挂钩我知道的bundle上下文。在这种情况下,您可能需要求助BundleContextProvider hack来获取它。