0

バンドル内のすべてのリソース (構成ファイルなど) とともに OSGI フラグメントを Java からプログラムでロードするにはどうすればよいですか?

内部 Jar にあるかのように getResource() を介してリソースにアクセスしたいと思います。

4

1 に答える 1

0

まず、コンテキストをバンドルするためのハンドルが必要です。そこから、バンドル参照をリッスンし、バンドル インスタンスを取得し、そのクラスローダーを使用して必要なことを行うことができます。

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()を呼び出して、要求したものを取得できます。

サーブレットなどを使用できない場合 (= Java EE/サーブレット コンテナーの外にいる場合)、バンドル コンテキストにフックする標準的な方法はあまりありません。その場合、BundleContextProvider ハックに頼って取得する必要があるかもしれません。

于 2013-01-19T00:36:50.163 に答える