12

我刚刚开始使用 Eclipse RCP 应用程序,它基本上只是提供的“hello world”示例之一。

当应用程序启动时,我想查看我的命令行参数并根据它们启动一些服务。我可以在IApplication.start中获取命令行参数:

public Object start(IApplicationContext context) {
   String[] argv = (String[]) 
       context.getArguments().get(IApplicationContext.APPLICATION_ARGS)));
}

但是如何获取 BundleContext,以便注册服务?它似乎不在 IApplicationContext 中。

4

2 回答 2

14

刚刚在进行网络搜索时遇到了这个问题,并认为我会推广新的标准 OSGi R4.2 方式(由 Eclipse 3.5 附带的 Equinox 提供)。如果您没有激活器,并且不想创建一个只是为了缓存包上下文,则可以使用 FrameworkUtil.getBundle。修改前面的例子:

import org.osgi.framework.FrameworkUtil;

public class ExportClassDigestApplication implements IApplication {
    public Object start(IApplicationContext context) throws Exception {
        context.applicationRunning();
        BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass())
                                                   .getBundleContext();
    }
}
于 2009-08-16T05:06:47.290 回答
13

棘手的内部方式:

InternalPlatform.getDefault().getBundleContext()

能做到这。

你会在这个类中找到一个例子

public class ExportClassDigestApplication implements IApplication {

    public Object start(IApplicationContext context) throws Exception {
        context.applicationRunning();

        List<ExtensionBean> extensionBeans = ImpCoreUtil.loadExtensionBeans(&quot;com.xab.core.containerlaunchers&quot;);
        for (ExtensionBean bean : extensionBeans) {
            ILauncher launcher = (ILauncher) bean.getInstance();
            launcher.start();
        }
        ClassFilter classFilter = new ClassFilter() {
            public boolean isClassAccepted(Class clz) {
                return true;
            }
        };
        
        PrintWriter writer = new PrintWriter( new File( "C:/classes.csv"));
        
        Bundle[] bundles = InternalPlatform.getDefault().getBundleContext().getBundles();

正确的方法

每个插件都可以访问自己的包上下文。

只需确保您的插件类覆盖start(BundleContext)方法。然后您可以将其保存到您的插件中可以轻松访问的地方类

请注意,提供给插件的包上下文是特定于它的,并且永远不应与其他插件共享。

于 2009-02-18T07:49:47.320 回答