如何在自定义Eclipse插件中访问Servers插件并触发启停操作
Eclipse插件调用Servers视图功能的实现方案
问题梳理
我正在用Java开发Eclipse插件,需要调用Eclipse Java EE自带Servers插件的「启动/终止」功能,目前有三个核心问题需要明确;同时通过Plugin Selection Spy已获取相关类和包信息,但发现ServersView2未提供TreeSelection的公共访问权限。
1. 如何获取Servers视图的ID
Servers视图的标准ID为 org.eclipse.wst.server.ui.ServersView,你也可以通过Plugin Selection Spy直接查看视图的ID信息(对应截图中ServersView2所属的视图ID)。
2. 需要导入的插件/包
在插件的MANIFEST.MF中添加以下依赖插件:
org.eclipse.wst.server.ui:Servers视图的UI实现插件org.eclipse.wst.server.core:服务器核心功能包,包含IServer等核心接口org.eclipse.ui:Eclipse UI基础插件,用于视图、选择服务的获取org.eclipse.jface:JFace组件包,处理结构化选择等逻辑
按需导入对应的包:
import org.eclipse.wst.server.core.IServer; import org.eclipse.wst.server.core.ServerCore; import org.eclipse.ui.ISelectionService; import org.eclipse.jface.viewers.IStructuredSelection;
3. IViewPart转换的实现类
ServersView2(全类名org.eclipse.wst.server.ui.internal.view.ServersView2)是Servers视图的内部实现类,不属于公共API,直接强转依赖它会导致插件兼容性问题(Eclipse版本更新可能会改动内部类)。
推荐通过公共API实现需求,而非直接调用视图内部方法:
方案1:直接操作服务器实例
无需依赖视图,通过ServerCore获取服务器并执行启动/终止:
// 获取所有已配置的服务器 IServer[] servers = ServerCore.getServers(); for (IServer server : servers) { // 启动服务器(传入null表示无进度监控) try { server.start(null); // 终止服务器可替换为:server.stop(null); } catch (CoreException e) { // 处理异常 e.printStackTrace(); } }
方案2:获取视图中的选中服务器
通过ISelectionService获取Servers视图的选中内容,无需访问视图内部树:
// 获取当前工作台窗口 IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow(); if (window != null) { ISelectionService selectionService = window.getSelectionService(); // 获取Servers视图的选中内容 ISelection selection = selectionService.getSelection("org.eclipse.wst.server.ui.ServersView"); if (selection instanceof IStructuredSelection) { IStructuredSelection structuredSel = (IStructuredSelection) selection; Object selectedObj = structuredSel.getFirstElement(); if (selectedObj instanceof IServer) { IServer selectedServer = (IServer) selectedObj; // 执行启动/终止操作 try { selectedServer.start(null); } catch (CoreException e) { e.printStackTrace(); } } } }
内容的提问来源于stack exchange,提问作者paragon
相关产品推荐
相关产品推荐

