0

我正在尝试在我的 OSGi 容器中添加一个 BundleWatcher 挂钩,以便我可以在加载捆绑包时对其进行监控。我在 config.ini 中做了以下更改,

  1. 在 osgi.bundles 属性中添加了对我的 jar 的引用,如下所示, osgi.bundles = ,reference\:file\:../lib/my.jar@2:start

  2. 设置属性 osgi.framework.extensions = mybundle

  3. 在 osgi.hook.configurators.include 中添加 MyBundleWatcher 作为钩子

此外,我的 jar 文件与 OSGi 包位于同一目录中。

当我运行我的应用程序时,我的 BundleWatcher 会出现 ClassNotFoundException。

但是,我可以确认我的包(其中包含 BundleWatcher)确实已启动,因为我的包中的 Activator 的 start 方法被调用。

我究竟做错了什么?

作为背景,这里有几篇我关注的文章,

http://wiki.eclipse.org/index.php/Adaptor_Hooks

http://eclipsesource.com/blogs/2013/01/23/how-to-track-lifecycle-changes-of-osgi-bundles/

4

2 回答 2

1

为什么要使用 Equinox 特定的BundleWatcher——它需要对 Equinox 内部结构和配置的特殊访问——而不是 OSGi 标准BundleTracker,后者可以由任何包实现并且适用于任何框架实现?

于 2013-10-02T21:32:49.573 回答
1

你似乎正在竭尽全力让它变得复杂。您将其作为扩展(如设备驱动程序)并使用专有代码。如果您想查看所有已安装的捆绑包,可能会有一些理由,但是当您重新启动时,无论如何您都不会看到已安装的捆绑包的安装事件。因此,如果您可以忍受只看到所有的捆绑包,那么迄今为止最简单的跟踪安装了哪些捆绑包的解决方案是:

package tracker;
public class Watch implements BundleActivator {
  BundleTracker<Bundle> tracker;

  public void start(BundleContext context) {
    tracker = new BundleTracker<Bundle>( context, -1, null ) {
       public Bundle addingBundle( Bundle b, BundleEvent e) {
          System.out.println("Tracking bundle " + b.getSymbolicName());
          return b;
       }
    };
    tracker.open();
  }

  public void stop(BundleContext context) {}
}

显现:

Bundle-Activator: tracker.Watch
于 2013-10-03T09:00:35.090 回答