gpt4 book ai didi

java - Eclipse 插件 : Run code right after startup

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:26:09 25 4
gpt4 key购买 nike

我想在插件启动后立即显示一条消息。如果我将我的代码放在 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(或类似的)时一切正常。

最佳答案

您可以在 start 方法中创建一个 Job (org.eclipse.core.runtime.jobs.Job) 并将其安排到跑。

如果您的代码需要与 UI 交互,请使用 UIJob

或者,您可以使用 org.eclipse.ui.startup 扩展点让类在 Eclipse 启动的早期运行(但这对于您想要执行的操作来说可能太早,因此作业可能仍然是必要的)。

您还可以为您的类(class)使用 OSGi 服务。

关于java - Eclipse 插件 : Run code right after startup,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25005882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com