Eclipse RCP 教程:从零开始构建企业级桌面应用
目录
-
第一部分:初识 Eclipse RCP
(图片来源网络,侵删)- 1 什么是 Eclipse RCP?
- 2 为什么要学习 Eclipse RCP?
- 3 RCP 应用的核心构成
- 4 开发环境准备
-
第二部分:你的第一个 RCP 应用 (Hello World)
- 1 创建 RCP 项目
- 2 理解项目结构
- 3 运行和调试你的第一个应用
- 4 自定义欢迎界面
-
第三部分:深入 RCP 核心概念
- 1 扩展点 - RCP 的灵魂
- 2 视图 和 编辑器 - 工作区的核心
- 3 透视器 - 视图的布局管理器
- 4 菜单、工具栏和快捷键
- 5 视图和编辑器间的通信
-
第四部分:实战项目:简易任务管理器
- 1 项目需求分析
- 2 创建任务模型
- 3 实现任务列表视图
- 4 实现任务编辑器
- 5 实现数据持久化
- 6 整合与部署
-
第五部分:进阶主题
(图片来源网络,侵删)- 1 插件化架构
- 2 使用 OSGi 服务
- 3 使用依赖注入框架 (如 Guice)
- 4 测试 RCP 应用
- 5 打包和产品化
-
第六部分:学习资源与最佳实践
第一部分:初识 Eclipse RCP
1 什么是 Eclipse RCP?
Eclipse Rich Client Platform (RCP) 是一个用于构建独立桌面应用程序的框架,它基于 OSGi (Open Service Gateway initiative) 标准,将 Eclipse SDK 中用于构建集成开发环境 的核心组件抽取出来,让开发者可以利用这些成熟、稳定、可扩展的组件来创建自己的功能丰富的桌面应用。
你可以把 Eclipse RCP 理解为一个“乐高积木平台”,它提供了构建桌面应用所需的各种基础模块(如窗口、菜单、视图、编辑器等),你可以专注于实现自己的业务逻辑,并将这些模块像搭积木一样组合起来。
2 为什么要学习 Eclipse RCP?
- 高度可定制和可扩展:基于插件架构,应用的功能可以动态扩展,用户可以按需安装或卸载功能模块。
- 丰富的 UI 组件:继承了 Eclipse 强大的 SWT (Standard Widget Toolkit) 和 JFace 框架,提供了比 Swing/AWT 更原生、更美观的界面。
- 成熟的框架:处理了窗口管理、菜单、工具栏、帮助系统、更新机制等复杂问题,开发者可以专注于业务逻辑。
- 多平台支持:一次编写,到处运行(Windows, Linux, macOS)。
- 大型社区和生态系统:拥有大量文档、插件和活跃的开发者社区。
3 RCP 应用的核心构成
一个典型的 RCP 应用由以下几个关键部分组成:

- 产品:定义了最终应用程序的入口点、启动配置、品牌信息(图标、启动画面)以及包含哪些插件,它是应用的“打包蓝图”。
- 插件:RCP 应用的基本单元,每个插件负责一部分功能,可以是 UI(视图、编辑器)、业务逻辑、数据访问等,插件通过 扩展点 来声明自己能提供什么,通过 扩展 来使用其他插件提供的能力。
- 工作台:RCP 应用的 UI 容器,包含了窗口、菜单栏、工具栏、状态栏以及最重要的 透视器。
- 视图:通常显示辅助性信息,如文件列表、大纲、属性等,可以同时存在多个。
- 编辑器:用于打开和编辑文档或数据对象,是工作区的焦点,一次只能打开一个编辑器实例。
- 透视器:一组视图和编辑器的布局组合,用户可以在不同的透视器之间切换以适应不同的任务(Java 透视图和调试透视图)。
4 开发环境准备
-
下载 Eclipse IDE for RCP and RAP Developers:
- 这是专门为 RCP 开发定制的 Eclipse IDE,包含了所有必需的工具和插件。
- 官方下载地址:https://www.eclipse.org/downloads/,选择 "Eclipse IDE for RCP and RAP Developers"。
-
安装必要的插件:
- 新版 Eclipse IDE for RCP and RAP Developers 通常已经包含了所需的大部分工具。
- 你可能还需要安装
Buildship(Gradle Integration) 用于现代构建工具,或PDE (Plug-in Development Environment)相关工具。
第二部分:你的第一个 RCP 应用
1 创建 RCP 项目
- 打开 Eclipse IDE for RCP and RAP Developers。
- 选择
File->New->Project...。 - 在弹出的对话框中,展开
Plug-in Development,选择RCP Application Project,然后点击Next。 - 项目名称:输入
com.example.helloworld。 - 模板:选择
Hello, RCP,这是一个最基础的模板,能让你快速跑起来。 - 点击
Finish。
2 理解项目结构
Eclipse 会为你生成一个完整的项目结构,请花点时间浏览一下:
com.example.helloworld:这是你的主插件项目。META-INF/MANIFEST.MF:插件清单文件,是 RCP 应用的核心,它定义了插件的基本信息、依赖关系、以及最重要的扩展点和扩展,你的应用扩展了org.eclipse.ui.application来启动自己。Application.java:应用程序类,负责创建和配置工作台窗口。createInitialWindowContents方法用于设置窗口的初始内容(通常是一个WorkbenchWindowAdvisor)。ActionBarAdvisor.java:动作栏顾问,用于配置菜单栏、工具栏和状态栏。Perspective.java:透视器,定义了应用的初始布局(即打开哪些视图)。
com.example.helloworld.product:产品配置项目,定义了如何将你的应用打包成一个可执行的程序。
3 运行和调试你的第一个应用
- 在
com.example.helloworld.product项目中,找到.product文件(HelloWorld.product)。 - 右键点击该文件,选择
Run As->Eclipse Application。 - 几秒钟后,一个带有 "Sample View" 的窗口就会出现,恭喜你,你的第一个 RCP 应用运行成功了!
4 自定义欢迎界面
让我们把默认的 "Sample View" 换成一个更友好的欢迎页面。
-
创建一个欢迎页面类:
- 在
com.example.helloworld插件中,新建一个 Java 类WelcomePage。 - 让它继承自
ViewPart,并实现createPartControl方法。
package com.example.helloworld; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.part.ViewPart; public class WelcomePage extends ViewPart { public static final String ID = "com.example.helloworld.welcomePage"; @Override public void createPartControl(Composite parent) { parent.setText("欢迎使用我的第一个 RCP 应用!"); // 创建一个简单的标签 new org.eclipse.swt.widgets.Label(parent, SWT.CENTER).setText("Hello, RCP World!"); } @Override public void setFocus() { // 视图获得焦点时的操作 } } - 在
-
在
plugin.xml中注册视图:- 打开
com.example.helloworld项目的plugin.xml文件。 - 切换到
Extensions标签页。 - 点击
Add...,找到并扩展org.eclipse.ui.views。 - 选择
view,点击Finish。 - 在右侧的视图中进行配置:
- id:
com.example.helloworld.welcomePage(与 WelcomePage 类中的 ID 一致) - name:
欢迎页面 - class:
com.example.helloworld.WelcomePage - allowMultiple: 取消勾选
- id:
- 打开
-
修改透视器以显示新视图:
- 打开
Perspective.java文件。 - 修改
createInitialLayout方法,将默认的视图替换成我们的欢迎页面。
@Override public void createInitialLayout(IPageLayout layout) { String editorArea = layout.getEditorArea(); layout.setEditorAreaVisible(false); // 不显示编辑器区域 layout.addView(WelcomePage.ID, IPageLayout.LEFT, 1.0f, editorArea); } - 打开
-
重新运行应用,现在你应该能看到一个标题为 "欢迎页面" 的视图了。
第三部分:深入 RCP 核心概念
1 扩展点 - RCP 的灵魂
这是理解 RCP 的关键,RCP 应用不是通过硬编码来组合的,而是通过一个“约定”机制。
- 扩展点:一个插件可以声明一个“扩展点”,相当于发布了一个“接口”或“插槽”,告诉其他插件:“我可以在这里插入功能”。
org.eclipse.ui.views就是一个扩展点,意思是“我可以接收一个视图定义”。
- 扩展:另一个插件可以“扩展”这个扩展点,相当于实现了这个“接口”或“插入了功能”。
- 我们在
plugin.xml中为org.eclipse.ui.views添加了一个view扩展,就是向系统声明:“我提供了一个视图,请把它显示出来”。
- 我们在
所有 UI 组件(菜单、视图、编辑器等)都是通过这种方式动态加载的。
2 视图 和 编辑器
- 视图:
- 用途:展示信息,提供导航,显示属性等。
- 特点:轻量级,可以同时存在多个,可以堆叠、平铺。
- 通信:通过
IViewPart获取实例,调用其公共方法,更推荐使用ISelectionService和IWorkbenchPage进行基于事件的松耦合通信。
- 编辑器:
- 用途:打开和编辑一个具体的“输入”,如一个文件、一个数据对象。
- 特点:重量级,是编辑焦点,一次只能打开一个(针对同一输入)。
- 生命周期:有
init,createPartControl,setInput,doSave等明确的生命周期方法。
3 透视器 - 视图的布局管理器
透视器定义了一组视图和编辑器的布局,用户可以在不同的透视器之间切换,以适应不同的工作流,IDE 可能有一个用于编码的“Java 透视图”和一个用于调试的“调试透视图”。
4 菜单、工具栏和快捷键
这些都是在 ActionBarAdvisor 中配置的,你可以通过添加 IContributionItem(如 Action)来定义菜单项和工具栏按钮,并为其设置 handler 来处理点击事件,以及绑定 command 和 keyBinding 来定义快捷键。
5 视图和编辑器间的通信
这是 RCP 开发的常见需求,推荐使用 Eclipse Services 和 Events 机制。
- 服务:一个插件可以向服务注册中心注册一个服务(如
ITaskService),其他插件可以通过服务注册中心获取并使用它,实现解耦。 - 事件:使用
org.eclipse.ui.services中的IEventBroker,一个组件可以发布事件,另一个组件可以订阅该事件,这是实现组件间松耦合通信的强大方式。
第四部分:实战项目:简易任务管理器
让我们动手构建一个功能更完整的应用。
1 项目需求分析
一个简单的任务管理器,需要:
- 显示一个任务列表(视图)。
- 点击任务,可以在一个编辑器中查看和修改任务的详细信息。
- 任务数据需要被保存,下次打开应用时能加载出来。
2 创建任务模型
创建一个 Task 类作为数据模型。
// com.example.taskmanager.model.Task.java
package com.example.taskmanager.model;
public class Task {
private String id;
private String title;
private String description;
private boolean completed;
// Constructor, Getters and Setters
public Task(String id, String title) {
this.id = id;
this.title = title;
}
// ... 省略其他 getter/setter
}
3 实现任务列表视图
- 创建一个新的视图
TaskListView,继承ViewPart。 - 在 UI 中使用
TableViewer来显示任务列表。 - 在
plugin.xml中注册这个视图。 - 透视器中添加这个视图。
4 实现任务编辑器
- 创建一个新的编辑器
TaskEditor,继承EditorPart。 - 实现
init,createPartControl,setInput等方法。 - 在 UI 中使用
Composite和Text等控件来显示和编辑任务信息。 - 在
plugin.xml中注册这个编辑器,扩展org.eclipse.ui.editors。
5 实现数据持久化
- 创建服务接口:定义一个
ITaskService接口,提供saveTask,loadAllTasks等方法。 - 实现服务:创建
TaskServiceImpl实现ITaskService,使用 Java 的序列化或 XML/JSON 文件来保存任务数据。 - 注册服务:在
Activator类中(插件的生命周期类),使用BundleContext将TaskServiceImpl注册为 OSGi 服务。 - 在视图中使用服务:在
TaskListView中,通过IWorkbench.getService(ITaskService.class)获取服务实例,并加载任务列表。
6 整合与部署
- 在产品配置文件中,确保你的主插件和所有依赖插件都被包含。
- 右键点击
.product文件,选择Product Export...。 - 选择
Directory或Product File (p2)格式进行导出。 - 导出后,你会得到一个可运行的目录,包含启动脚本和所有必要的库。
第五部分:进阶主题
1 插件化架构
将你的应用功能拆分成多个插件,将 Task 模型放在一个 model 插件,UI 视图放在 ui 插件,数据持久化放在 persistence 插件,插件之间通过接口和服务通信,而不是直接引用。
2 使用 OSGi 服务
这是实现插件间解耦的核心,深入理解 @Component (来自 org.eclipse.e4.core.di.annotations) 和 @Inject 注解,它们可以简化服务的获取和注入。
3 使用依赖注入框架
Eclipse 4.x 引入了 DI 支持,你可以使用 Guice 或 Eclipse自身的 DI 来管理对象的生命周期和依赖关系,使代码更清晰、更易于测试。
4 测试 RCP 应用
- JUnit:用于测试纯 Java 逻辑(如模型、服务)。
- SWTBot:一个基于 SWT 的 UI 自动化测试框架,可以模拟用户操作(点击、输入文本等)来测试你的 UI 功能。
5 打包和产品化
学习如何使用 p2 (Provisioning) 和 Tycho (Maven/Tycho) 来构建和发布你的 RCP 产品。Tycho 是现代 RCP 构建的事实标准,它允许你使用 Maven 来管理依赖和构建流程。
第六部分:学习资源与最佳实践
推荐资源
- 官方文档:
- Eclipse RCP Tutorial (官方):虽然稍旧,但概念讲解非常经典。
- Eclipse Platform Developer Guide:最新的官方开发指南。
- 书籍:
- Eclipse 4 RCP Development by R.J. Lorimer:非常全面和现代的 RCP 书籍。
- 博客与社区:
- Eclipse Blog: https://www.eclipse.org/blogs/
- Vogella Tutorials (Lars Vogel): https://www.vogella.com/tutorials/EclipseRCP/article.html - 内容详实,更新及时。
- Stack Overflow: 搜索标签
eclipse-rcp。
最佳实践
- 拥抱插件化:尽早将应用拆分为多个小插件。
- 优先使用服务和事件:避免在插件之间直接调用类,尽量通过服务进行通信。
- 分离 UI 和逻辑:将业务逻辑放在服务或非 UI 的插件中,UI 插件只负责展示。
- 使用 DI:在 Eclipse 4.x 项目中,强烈推荐使用依赖注入来管理组件。
- 编写测试:为你的核心逻辑编写单元测试,为你的 UI 编写自动化测试。
- 善用模板和向导:Eclipse 提供了创建各种 RCP 组件的向导,善用它们可以提高效率。
希望这份详细的教程能帮助你顺利入门并精通 Eclipse RCP 开发!祝你编码愉快!
