Java 在Eclipse插件中实现处理程序

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

我在Eclipse插件(在Indigo上开发)中有一个处理程序,每次保存(或者理想情况下打开)文本编辑器中的Java文件时,我都希望运行该处理程序。据我所知,实现这一目标有两种方法:

  • 通过
    CommandService
    API编程
  • 使用
    plugin.xml中的配置
  • 这两种我都试过了。方法1如下:

    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行即可使用此新方法。您尝试了此操作,但一定是做错了什么: