我创建了一个工作台应用程序插件而不是eclipse rcp应用程序。我没有为该工作台应用程序创建任何插件模板。 现在当我运行工作台应用程序时,Activator没有调用。我把 System.out.println(“Insided start()”)放在start方法的内部 的 Activator.java 即可。但它并没有调用start方法。我如何调用start方法?但是当我在运行配置插件中选择 Autostart = true 时, 它正在启动激活剂。但问题是当我调用 IWorkbenchWindow window = Workbench.getInstance()。getActiveWorkbenchWindow(); 它给出了错误消息,指出无法创建工作台窗口。仅当我将此插件设置为AutoStart = true时,才会显示此错误消息。可能是什么问题?
以下是我收到的错误消息..当我使用
时IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
java.lang.IllegalStateException:尚未创建Workbench。 在org.eclipse.ui.PlatformUI.getWorkbench(PlatformUI.java:92)at myworkbenchplugin.Activator.custom(Activator.java:43)at myworkbenchplugin.Activator.start(Activator.java:36)at org.eclipse.osgi.framework.internal.core.BundleContextImpl $ 1.run(BundleContextImpl.java:783) 在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) 在 org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:374) 在 org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1067) 在 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)
答案 0 :(得分:1)
如您所见,您需要管理 OSGi bundle manifest 以指定正确的激活政策。请注意:
Eclipse 3.4中已弃用
Eclipse-AutoStart
和Eclipse-LazyStart
标题 从OSGi R4.1规范开始,OSGi规范采用了延迟激活策略。新的OSGi捆绑包清单标题Bundle-ActivationPolicy
可用于指定延迟激活策略。Equinox Framework 3.4或更高版本将继续支持已弃用的
Eclipse-LazyStart
和Eclipse-AutoStart
标头。
希望捆绑包在其他OSGi Framework实现中工作的捆绑开发人员应将Bundle-ActivationPolicy
标头添加到其清单中。在大多数情况下,您只需添加以下标题:
Bundle-ActivationPolicy: lazy
见OSGi LazyStart design。
在您的情况下,如果您想确定您的插件无论如何都可以启动,您可以尝试Bundle-ActivationPolicy: lazy;exclude:="yourPluginId"
。
要获得有效WorkbenchWindow
,您可以使用How to get the project name in eclipse?中详述的PlatformUI.getWorkbench().getActiveWorkbenchWindow()
。
答案 1 :(得分:1)
如果在Eclipse启动时启动插件,将在工作台完全启动之前调用Activator.start()。您需要在Activator中的UIJob / WorkbenchJob中推送代码,以便在工作台窗口准备就绪后调用它。