Java 在插件启动时访问工作台

Java 在插件启动时访问工作台,java,eclipse-plugin,Java,Eclipse Plugin,我想在插件开始时访问IWorkbench,以连接IPartListener 最简单的解决方案是在插件的start()方法中添加侦听器: public class MyPlugin extends AbstractUIPlugin { private IPartListener partListener = new MyPartListener(); public void start(BundleContext context) throws PluginException {

我想在插件开始时访问
IWorkbench
,以连接
IPartListener

最简单的解决方案是在插件的
start()
方法中添加侦听器:

public class MyPlugin extends AbstractUIPlugin {

private IPartListener partListener = new MyPartListener();

public void start(BundleContext context) throws PluginException {
        super.start(context);

        Display.getDefault().asyncExec(() -> 
            PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
            .addPartListener(this.partListener));
}
}
说明:
Display#asyncExec
在下次UI线程空闲时运行,这是在创建工作台之后(因为在启动
AbstractUIPlugin
时,它已经在创建它的过程中)

该代码在一段时间内运行良好,但在发布后,使用它的其他项目有时会失败:

原因:java.lang.NullPointerException 位于org.acme.project.MyPlugin.lambda$0(MyPlugin.java:43) 位于org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) 位于org.eclipse.swt.widgets.Synchronizer.runasynchmessages(Synchronizer.java:135)

显然,在本例中,工作台尚未创建。我将代码移到了
IStartup
实现的
earlyStartup()
中,现在它适用于所有以前投诉过的项目


由于插件的开始和工作台的创建不是确定性的,我的问题是:这是正确的位置吗?或者这是另一个等待发生的NullPointerException(或任何其他异常)

类中
earlyStartup
方法的JavaDoc明确表示它是在工作台初始化后运行的,并描述了执行非常类似的操作,所以这应该是可以的

Javadoc:

将在工作台初始化后在单独的线程中调用

请注意,大多数工作台方法必须在UI线程中调用,因为 他们可以访问SWT。例如,获取当前工作台 窗口,使用:


从技术上讲,你在那条线上打的任何电话都可能是空的。仅仅因为有一个工作台并不意味着有一个活动窗口或活动页面。什么用户操作导致插件启动?@nit没有用户操作,而是应用程序启动的核心捆绑包。
 final IWorkbench workbench = PlatformUI.getWorkbench();
 workbench.getDisplay().asyncExec(new Runnable() {
   public void run() {
     IWorkbenchWindow window = workbench.getActiveWorkbenchWindow();
     if (window != null) {
       // do something
     }
   }
 });