java – Eclipse插件:启动后立即运行代码
我想在插件启动后立即显示一条消息.如果我将我的代码放在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,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(); 我的控制台打印一切都没了.和我正在完成的工作的调试消息(由作业更改侦听器). 但就在那之后我收到一条错误消息: !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.当使用返回Status.OK_STATUS(或类似)时,一切都很顺利. 解决方法
您可以在start方法中创建一个Job(org.eclipse.core.runtime.jobs.Job)并安排它运行.
如果您的代码需要与UI交互,请使用UIJob. 或者,您可以使用org.eclipse.ui.startup扩展点在Eclipse启动时尽早运行类(但这对于您想要执行的操作可能为时尚早,因此可能仍需要Job). 您也可以为您的班级使用OSGi服务. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |