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

如何从Java中以编程方式动态加载OSGI片段?,java,osgi,Java,Osgi,如何从Java以编程方式加载OSGI片段及其包中的所有资源(配置文件等) 我想通过getResource()访问资源,就像它们在内部Jar中一样。首先,您需要一个句柄来绑定上下文。在此基础上,您可以监听bundle引用,获得一个bundle实例并使用它的类加载器来执行您想要的操作 使用Servlet连接到捆绑包上下文并侦听出现的osgi捆绑包的示例 public class AnotherHelloWorldServlet extends HttpServlet { private Mes

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


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

首先,您需要一个句柄来绑定上下文。在此基础上,您可以监听bundle引用,获得一个bundle实例并使用它的类加载器来执行您想要的操作

使用Servlet连接到捆绑包上下文并侦听出现的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,您可以调用以获取捆绑包实例,并为此获取所需的内容

如果您不能使用servlet或类似的工具(=如果您不在JavaEE/servlet容器中),那么就没有我所知的那么多标准方法来连接到bundle上下文中。在这种情况下,你可能需要求助于获得它