Eclipse 4迁移:如何通过编程方式保存workbench.xmi?
Eclipse 4 RCP 透视图状态保存至 workbench.xmi 解决方案
1. 定位 workbench.xmi 文件路径
Eclipse 4 中,workbench.xmi 默认存储在工作区的 .metadata/.plugins/org.eclipse.e4.workbench/ 目录下。可以通过 Eclipse Platform API 获取工作区根路径,拼接得到完整路径:
import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.Platform; // 获取工作区根路径 IPath workspaceRoot = Platform.getInstanceLocation().getURL().getPath(); // 拼接得到 workbench.xmi 完整路径 IPath workbenchXmiPath = workspaceRoot.append(".metadata") .append(".plugins") .append("org.eclipse.e4.workbench") .append("workbench.xmi");
2. 保存透视图状态到 workbench.xmi
Eclipse 4 采用 EMF(Eclipse Modeling Framework)管理工作台模型,需通过操作 EMF 模型来保存透视图状态:
方式一:通过 E4 服务上下文获取模型并保存
如果在 E4 组件(如 Handler、Part 等)中,可以直接获取 MApplication 实例并操作:
import org.eclipse.e4.ui.internal.workbench.E4Workbench; import org.eclipse.e4.ui.model.application.MApplication; import org.eclipse.e4.ui.model.application.ui.basic.MPerspective; import org.eclipse.e4.ui.model.application.ui.basic.MWindow; import org.eclipse.emf.ecore.resource.Resource; import java.io.IOException; import java.util.Collections; // 获取 MApplication 实例 MApplication app = E4Workbench.getServiceContext().get(MApplication.class); // 获取当前活动窗口与透视图 MWindow activeWindow = app.getActiveWindow(); MPerspective activePerspective = activeWindow.getActivePerspective(); // 此处可对透视图状态进行自定义修改(如布局、部件状态等) // ... // 获取模型对应的 Resource 并保存 Resource resource = app.eResource(); try { // 保存模型到 workbench.xmi resource.save(Collections.emptyMap()); } catch (IOException e) { // 处理保存异常 e.printStackTrace(); }
方式二:手动加载并操作 EMF 模型
如果不在 E4 组件上下文环境中,可通过 EMF 的 ResourceSet 手动加载 workbench.xmi 文件:
import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; import org.eclipse.emf.common.util.URI; import org.eclipse.e4.ui.model.application.MApplication; import java.io.IOException; // 构建 workbench.xmi 的文件 URI URI xmiUri = URI.createFileURI(workbenchXmiPath.toOSString()); // 创建 ResourceSet 并加载模型 ResourceSet resourceSet = new ResourceSetImpl(); Resource resource = resourceSet.getResource(xmiUri, true); // 获取 MApplication 实例 MApplication app = (MApplication) resource.getContents().get(0); // 操作透视图模型(如修改状态、保存布局) // ... // 保存模型 try { resource.save(null); } catch (IOException e) { e.printStackTrace(); }
注意事项
- 操作 EMF 模型需确保在 UI 线程中执行,避免并发修改导致的异常。
- 直接修改
workbench.xmi后,若需即时生效,可能需要触发工作台模型的刷新(如通过EModelService相关方法)。
内容的提问来源于stack exchange,提问作者Kildary Klein
相关产品推荐
相关产品推荐

