Java 在Eclipse插件中实现处理程序
我在Eclipse插件(在Indigo上开发)中有一个处理程序,每次保存(或者理想情况下打开)文本编辑器中的Java文件时,我都希望运行该处理程序。据我所知,实现这一目标有两种方法:Java 在Eclipse插件中实现处理程序,java,eclipse,eclipse-plugin,eclipse-indigo,Java,Eclipse,Eclipse Plugin,Eclipse Indigo,我在Eclipse插件(在Indigo上开发)中有一个处理程序,每次保存(或者理想情况下打开)文本编辑器中的Java文件时,我都希望运行该处理程序。据我所知,实现这一目标有两种方法: 通过CommandServiceAPI编程 使用plugin.xml中的配置 这两种我都试过了。方法1如下: public class Activator extends AbstractUIPlugin { @Override public void start(final BundleConte
CommandService
API编程plugin.xml中的配置
public class Activator extends AbstractUIPlugin {
@Override
public void start(final BundleContext context) throws Exception {
super.start(context);
ICommandService commandService = (ICommandService) PlatformUI
.getWorkbench().getService(ICommandService.class);
commandService.addExecutionListener(new MyListener());
plugin = this;
}
...
}
public class MyListener implements IExecutionListener {
@Override
public void postExecuteSuccess(final String commandId, final Object returnValue) {
System.out.println("PostEventSuccess:" + commandId);
}
@Override
public void preExecute(final String commandId, final ExecutionEvent event) {}
@Override
public void notHandled(String commandId, NotHandledException exception) {}
@Override
public void postExecuteFailure(String commandId, ExecutionException exception) {}
}
<extension point="org.eclipse.ui.handlers">
<handler
commandId="org.eclipse.ui.file.save"
class="mypackage.MyHandler">
<activeWhen>
<with variable="activeWorkbenchWindow">
<instanceof value="org.eclipse.ui.IWorkbenchWindow"/>
</with>
</activeWhen>
</handler>
</extension>
方法2。像这样:
public class Activator extends AbstractUIPlugin {
@Override
public void start(final BundleContext context) throws Exception {
super.start(context);
ICommandService commandService = (ICommandService) PlatformUI
.getWorkbench().getService(ICommandService.class);
commandService.addExecutionListener(new MyListener());
plugin = this;
}
...
}
public class MyListener implements IExecutionListener {
@Override
public void postExecuteSuccess(final String commandId, final Object returnValue) {
System.out.println("PostEventSuccess:" + commandId);
}
@Override
public void preExecute(final String commandId, final ExecutionEvent event) {}
@Override
public void notHandled(String commandId, NotHandledException exception) {}
@Override
public void postExecuteFailure(String commandId, ExecutionException exception) {}
}
<extension point="org.eclipse.ui.handlers">
<handler
commandId="org.eclipse.ui.file.save"
class="mypackage.MyHandler">
<activeWhen>
<with variable="activeWorkbenchWindow">
<instanceof value="org.eclipse.ui.IWorkbenchWindow"/>
</with>
</activeWhen>
</handler>
</extension>
方法1。根本不运行我的侦听器。方法2。可以工作,因为处理程序已执行,但我的处理程序似乎替换了默认处理程序。当用户试图保存文件时,我的处理程序运行,但文件未保存。处理程序本身似乎很好(我通过创建一个运行它的菜单项对其进行了测试)
这是方法1。现在已弃用,或者我是否错误地实现了该服务?如何获得方法2。保存文件?默认处理程序可以从我的处理程序运行吗?这两个处理程序的区别仅仅在于一个是编程的,另一个是声明的。我认为定义命令处理程序是错误的,因为它处理命令的执行,而不是仅仅被通知命令已执行。您的第一种方法似乎很好,但是在插件被激活之前,您的代码不会被执行,而当您的bundle中的第一个类被加载时,插件就会被激活,这是一种惰性的情况。Eclipse中有一个变通方法:贡献到
org.Eclipse.ui.startup
扩展点。例如,让您的Activator
类实现IStartup
,您可以使用空实现——唯一的一点是让框架从您的捆绑包中加载任何类。这两个类的区别不仅仅在于一个是编程性的,另一个是声明性的。我认为定义命令处理程序是错误的,因为它处理命令的执行,而不是仅仅被通知命令已执行。也许我在第一个方法上发现了一些东西,从外观上看似乎还可以。你确定你的插件被激活了吗,换句话说,start
中的代码是否真的运行了?好问题。当我在Activator和Listener中放入一些println
语句时,代码似乎没有运行。但是,配置指向右侧的Activator
类。非常奇怪。让插件急切地启动。这是在MANIFEST.MF中配置的。我将把它重新整理成一个答案。谢谢。我已经从清单中删除了它,但是Activator
似乎仍然没有加载侦听器,甚至没有运行start()
方法。编辑了答案。您不需要删除ActivationPolicy行即可使用此新方法。您尝试了此操作,但一定是做错了什么: