2010-09-16 34 views
1

我创建了一个工作台应用程序插件而不是eclipse rcp应用程序。我还没有为该工作台应用程序创建任何插件模板。 现在当我运行工作台应用程序Activator没有调用。我把System.out.println(“Insided start()”)里面的 Activator.java的启动方法里面。但它没有调用启动方法。我如何打电话给开始方法?但是当我做出选择时,Autostart = true在运行配置中,插件, 它正在启动激活器。但问题是当我打电话给IWorkbenchWindow窗口= Workbench.getInstance()。getActiveWorkbenchWindow(); 它给出的错误消息说不能创建工作台窗口。只有当我将此插件作为AutoStart = true时,才会显示此错误消息。可能是什么问题呢?Eclipse工作台应用程序启动问题


以下是错误消息我get..When我用

IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); 

java.lang.IllegalStateException:工作台还没有被创建。 在org.eclipse.ui.PlatformUI.getWorkbench(PlatformUI.java:92)在 myworkbenchplugin.Activator.custom(Activator.java:43)处 有机 myworkbenchplugin.Activator.start(Activator.java:36)。 eclipse.osgi.framework.internal.core.BundleContextImpl $ 1.run(BundleContextImpl.java:783) at java.security.AccessController.doPrivileged(Native Method)at org.eclipse.osgi.framework.internal.core.BundleContextImpl。 startActivator(BundleContextImpl.java:774) 在 org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:755) 在 org.eclipse.osgi.framework.internal.core.BundleHost。 startWorker(BundleHost.java:370) at org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:374) at org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1067) at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:561) 在 org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:546) 在 org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:459) 在 org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:243) 在 org。 eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:440) 在 org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:227) 在 org.eclipse。 osgi.framework.eventmgr.EventManager $ EventThread.run(EventManager.java:337)

回答

1

正如你已经看到的,你需要管理你的OSGi bundle manifest指定正确的激活策略。请注意:

Eclipse-AutoStartEclipse-LazyStart标题在Eclipse 3.4中已被弃用。
从OSGi R4.1规范开始,OSGi规范采用了惰性激活策略。可以使用新的OSGi捆绑包清单标头Bundle-ActivationPolicy指定惰性激活策略。

Equinox Framework 3.4或更高版本将继续支持已弃用的Eclipse-LazyStartEclipse-AutoStart标题。
捆绑的开发人员希望他们的捆绑包能够跨越其他OSGi框架实现工作,应该将其头文件添加到他们的清单中。在大多数情况下,你可以简单地添加以下标题:

Bundle-ActivationPolicy: lazy 

OSGi LazyStart design。 对于你的情况,如果你想确保你的插件无论如何启动,你可以尝试Bundle-ActivationPolicy: lazy;exclude:="yourPluginId"

要获得有效的WorkbenchWindow,您可以使用PlatformUI.getWorkbench().getActiveWorkbenchWindow(),详见How to get the project name in eclipse?

+0

感谢您的信息。 我仍然遇到同样的问题。当我使用PlatformUI.getWorkbench()。getActiveWorkbenchWindow()时,它显示Workbench尚未创建的异常。但是当我Workbench.getInstance()。getActiveWorkbenchWindow()时,它显示的是 窗口,IWorkbenchWindow为null。 还有一件事我调试时​​得到了所有这些例外。它不是在控制台中。任何想法为什么它不显示在 控制台?它在控制台中显示的一些例外情况。 – Bhanu 2010-09-16 07:32:50

+0

@Bhanu:你有确切的错误信息? – VonC 2010-09-16 07:51:55

+0

不,我没有确切的错误信息。当我调试只知道它是抛出异常..并且该异常是Workebnch未创建。但是当我使用代码Workench.getInstance()。getActiveWorkebenchWindow()时,它返回null。 – Bhanu 2010-09-16 09:13:09

1

如果您在Eclipse启动时启动插件,将在工作台完全启动之前调用Activator.start()。您需要将激活器中的UIJob/WorkbenchJob中的代码推入,以便在工作台窗口准备就绪后调用它。