我想在插件启动后立即显示消息。如果我将代码放在Activator.start()
方法的末尾,我会收到错误(可能是因为尚未加载所需的资源)。
错误如下所示:
!MESSAGE While loading class "de.stefansurkamp.package.ClassIWantToLoad", thread "Thread[main,6,main]" timed out waiting (5006ms) for thread "Thread[Worker-2,5,main]" to finish starting bundle "MyPlugin_1.0.0.qualifier [302]". To avoid deadlock, thread "Thread[main,6,main]" is proceeding but "de.stefansurkamp.package.ClassIWantToLoad" may not be fully initialized.
!STACK 0
org.osgi.framework.BundleException: State change in progress for bundle "reference:file:/C:/Users/Stefan/workspace/MyPlugin/" by thread "Worker-2".
at org.eclipse.osgi.framework.internal.core.AbstractBundle.beginStateChange(AbstractBundle.java:1088)
at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:298)
at org.eclipse.osgi.framework.util.SecureAction.start(SecureAction.java:478)
at org.eclipse.osgi.internal.loader.BundleLoader.setLazyTrigger(BundleLoader.java:263)
at org.eclipse.core.runtime.internal.adaptor.EclipseLazyStarter.postFindLocalClass(EclipseLazyStarter.java:109)
[...]
Caused by: org.eclipse.osgi.framework.internal.core.AbstractBundle$BundleStatusException
... 53 more
Root exception:
org.eclipse.osgi.framework.internal.core.AbstractBundle$BundleStatusException
[...]
如果需要,我可以提供完整的堆栈跟踪。
那么在start()
完成后是否有任何方法可以运行?
编辑:使用作业和org.eclipse.ui.startup
根据greg的建议,我在一个由org.eclipse.ui.startup
扩展点加载的类中创建了一个Job。
这就是我的earlyStartup()
方法的样子:
@Override
public void earlyStartup() {
Job clearPrefsJob = new Job("clearPrefsJob") {
@Override
protected IStatus run(IProgressMonitor monitor) {
try {
DataStorage dataStorage = new DataStorage();
dataStorage.clearPrefs();
System.out.println("Everything gone.");
}
catch (StorageException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
};
clearPrefsJob.addJobChangeListener(new IJobChangeListener() {
(All of the IchangeEvents here)
});
clearPrefsJob.setPriority(Job.BUILD);
clearPrefsJob.schedule();
我的控制台打印Everything gone.
和我正在完成作业的调试消息(由作业更改监听器完成)。
但在此之后我收到一条错误消息:
!ENTRY org.eclipse.core.jobs 4 2 2014-07-29 11:53:12.481
!MESSAGE An internal error occurred during: "clearPrefsJob".
!STACK 0
java.lang.NullPointerException
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:69)
此外,我的测试环境显示以下错误消息:
'clearPrefsJob' has encountered a problem.
An internal error occured during: "clearPrefsJob".
java.lang.NullPointerException
我不知道代码的这一部分中的NullPointerException应该来自哪里,因为在使用作业之前一切正常。
解决方案:
看起来问题是使用return null
。使用return Status.OK_STATUS
(或类似)时,一切都很顺利。
答案 0 :(得分:7)
您可以在Job
方法中创建org.eclipse.core.runtime.jobs.Job
(start
)并安排其投放。
如果您的代码需要与UI进行交互,请使用UIJob
。
或者你可以使用org.eclipse.ui.startup
扩展点在Eclipse启动时尽早运行类(但是这可能为你想做的事情还为时过早,因此可能仍然需要Job。)
您也可以为您的班级使用OSGi服务。