You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于org.eclipse.ui.commands实现Eclipse RCP 3.x切换工作区方案咨询

我之前在维护Eclipse RCP 3.x项目时也碰到过这个问题,废弃的ActionBarAdvisor方式确实不够规范,用org.eclipse.ui.commands扩展点的方式更符合3.x的组件化设计,下面是具体的实现步骤和依赖说明:

实现切换工作区的步骤(基于org.eclipse.ui.commands扩展点)

1. 定义命令扩展

在你的插件plugin.xml中添加org.eclipse.ui.commands扩展,定义一个唯一的命令ID:

<extension
      point="org.eclipse.ui.commands">
   <command
         id="com.your.plugin.id.commands.switchWorkspace"
         name="Switch Workspace">
   </command>
</extension>

2. 实现命令处理类

创建一个继承自AbstractHandler的处理类,在execute方法里完成切换工作区的核心逻辑。这里可以直接复用Eclipse IDE内置的工作区选择逻辑,不用自己从头写对话框:

import org.eclipse.core.runtime.Platform;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.handlers.AbstractHandler;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;

public class SwitchWorkspaceHandler extends AbstractHandler {

    @Override
    public Object execute(ExecutionEvent event) throws ExecutionException {
        // 获取当前激活的工作台窗口
        var window = HandlerUtil.getActiveWorkbenchWindow(event);
        if (window == null) {
            return null;
        }

        // 弹出确认对话框(可选,提升用户体验)
        boolean confirm = MessageDialog.openConfirm(
                window.getShell(),
                "Switch Workspace",
                "Restart is required to switch workspace. Proceed?"
        );
        if (!confirm) {
            return null;
        }

        try {
            // 调用IDE内置的工作区选择器,获取用户选中的新路径
            String newWorkspacePath = IDE.promptForWorkspace(window.getShell(), Platform.getInstanceLocation().getURL().getPath());
            if (newWorkspacePath != null && !newWorkspacePath.isEmpty()) {
                // 设置新工作区路径并重启工作台
                Platform.getInstanceLocation().setURL(new java.net.URL("file:" + newWorkspacePath));
                window.getWorkbench().restart();
            }
        } catch (Exception e) {
            MessageDialog.openError(window.getShell(), "Error", "Failed to switch workspace: " + e.getMessage());
        }
        return null;
    }
}

3. 绑定命令与处理类

在plugin.xml中添加org.eclipse.ui.handlers扩展,把刚才的处理类和命令绑定起来:

<extension
      point="org.eclipse.ui.handlers">
   <handler
         commandId="com.your.plugin.id.commands.switchWorkspace"
         class="com.your.plugin.id.handlers.SwitchWorkspaceHandler">
   </handler>
</extension>

4. 可选:将命令添加到菜单/工具栏

如果需要把这个功能放到菜单或工具栏里,可以用org.eclipse.ui.menus扩展点,比如添加到窗口菜单的末尾:

<extension
      point="org.eclipse.ui.menus">
   <menuContribution
         locationURI="menu:window?after=additions">
      <command
            commandId="com.your.plugin.id.commands.switchWorkspace"
            label="Switch Workspace"
            style="push">
      </command>
   </menuContribution>
</extension>
需要依赖的插件

在插件的MANIFEST.MF中添加以下依赖项:

  • org.eclipse.ui:提供命令、Handler等核心UI组件API
  • org.eclipse.ui.ide:包含IDE相关的工作区操作工具(比如IDE.promptForWorkspace)
  • org.eclipse.core.runtime:提供平台实例位置、URL处理等底层核心功能
  • org.eclipse.jface:提供对话框等基础UI组件支持

内容的提问来源于stack exchange,提问作者781227

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:11:10