使用EclipseGanymede进行桌面、Web和移动设备开发,第1部分(一

第1部分: 采用Ganymede进行富客户机平台开发

Eclipse 的 Ganymede 发行版包括 24 个独立项目,涵盖各种各样的技术。这些项目 大部分都十分成熟,而此发行版将提供对这些项目的增量改进。但是 Ganymede 还包括把 新技术引入到 Eclipse 平台中的许多新项目。在这个 “使用 Eclipse Ganymede 进行桌 面、Web 和移动设备开发” 三部分系列教程中,我们将介绍以下新 Ganymede 特性:RCP 、RAP 和 eRCP,这些特性将允许用一个通用代码库分别为桌面、Web 和移动平台开发软 件;使用 Subversion 进行版本控制;以及使用 p2 进行更新和安装。

开始之前

本教程既适用于想要了解 Ganymede 中提供的一些令人兴奋的新功能的所有 Eclipse 开发人员,也适用于有兴趣使用这些功能开发可以部署到拥有通用代码库的多个平台中的 应用程序的任何人。您应当了解如何使用 Java 编程语言编程,并且应当熟悉 Eclipse 平台及其使用插件的模型。

关于本系列

第 1 部分(“采用 Ganymede 进行富客户机平台开发”)将提供 RCP 的新特性、新 Subversion Eclipse 集成及 p2 打包和分发系统简介。第 2 部分(“应用到 Web 中” )将引入 Rich Ajax Platform(RAP)编写 Web 应用程序。而第 3 部分(“应用到移动 设备中”)将讨论如何使用嵌入式 Rich Client Platform(eRCP)开发移动设备的应用 程序。

关于本教程

RCP 是允许开发人员挑选和选择所需 Eclipse 插件 — 并且 只包括所需插件 — 构建客户机桌面应用程序的 Eclipse 架构。为了演示 Ganymede 的一些新特性,您将开发一个简单的 RCP 应用程序 —— 一个备忘 记事本(personal organizer)。在此过程中,您将看到 Ganymede 中对 RCP 的一些更 改,并且您将使用此应用程序研究新 Subversion 源代码控制和 p2 打包和分发系统。

主题包括:

如何下载和安装 Ganymede 软件包。

如何设置 Subversion 客户机并将您的源代码存储在 Subversion 中。

如何设置目标平台并 从一个操作系统切换到另一个操作系统(即,从 Mac OS X 到 Microsoft® Windows® Vista)。

如何创建应用程序模型和用户插件。

如何使用 p2 创建产品定义以及打包和分 发应用程序。

系统要求

您需要以下技术才能继续本教程:

Eclipse Ganymede 位于 Eclipse Foundation。

从 Sun Microsystems 可以获得 Java 2 Standard Edition V5 或更高版本。

开始使用 Ganymede

在开始开发备忘 记事本应用程序之前,需要下载并安装 Eclipse 的 Ganymede 软件包。在本节中,您将 了解从哪里获得下载及如何设置它以开始使用。

下载 Ganymede

Ganymede 软件包代表 Eclipse 的下一个增量版本,并且同样地,意味 Eclipse 平台的全新安装。 连同所有 Eclipse 发行版一起,有许多可以选择的软件包,这取决于开发需求。Eclipse Web 站点将提供 比较图表,如图 1 所示:

图 1. Eclipse 软件包的比较

鉴于本系列的目的,您可以下载 RCP/插件版本,因为该版本包含开发和部署 RCP 应 用程序的一切(参见图 2)。选择适用于您的操作系统的版本,选择适当的镜像,然后下 载(该文件非常大 — 将近 200 MB,这取决于您的平台 — 因此请耐心一些)。

图 2. Eclipse Ganymede 的 RCP/插件软件包的下载页面

安装和运行

下载完成时,将软件包解压缩到 Eclipse 的所需安装位置,然后双击 Eclipse 按钮 运行。选择一个工作空间,然后 Eclipse 将显示欢迎页面。在其中选择 Workbench 图标 (位于欢迎屏幕最右侧的箭头,如图 3 所示)。

图 3. Eclipse 安装的欢迎屏幕

到目前为止,这些内容与先前版本的 Eclipse 没有多大区别,可是在下一小节中,您 将看到对 Eclipse 开发的核心组件之一 Rich Client Platform. 的一些增量改进。

现在已经安装了 Ganymede 发行版。但是,您可能会惊讶地意识到自己尚未安装属于 Ganymede 的每一个软件包。接下来,在研究 Subversion 时,您必须单独下载并安装相 关软件包。虽然 Subversion 被视为 Ganymede 发行版的一部分,但是许可限制将阻止它 随软件包的其余部分自动分发,这要求您从 Eclipse 中执行单独下载。

使用 Subversive 插件的 Subversion 控件

源代码控制是所有重要软件开发工作的主要部分,尤其是支持跨多个地域的分布式团 队开发(例如,本教程的合著者都位于大陆的另一端)。这样的系统允许不一致地更改代 码库,而不必担心一名程序员所做的更改会对其他程序员有不利影响 — 但是没有一个管 理中心控制整个流程或关闭需求以及程序员之间的仔细协调。

Subversion 是一个开源的版本控制系统,类似于 CVS,但是被普遍认为是它的最终接 替者。Eclipse 的 Subversion 支持多年来一直可以使用第三方插件,其中最流行的被称 为 Subversive。Ganymede 项目承担了 Subversive 的开发并将其添加为 Eclipse 的核 心库。但是,未解决的法律问题阻止它随 Ganymede 的其余部分一起分发,因此至少到现 在为止,您仍然必须从 Ganymede 中单独安装 Subversive 插件。

继续阅读以查看如何安装 Subversive 并使用它管理备忘记事本应用程序的源代码。

安装 Subversive

Subversive 由两个部分组成,每个部分都必须单独安装。第一个部分是 Subversive 插件本身,该插件将提供用于将 Subversion 支持集成到 Eclipse 中的 UI 元素。第二 个部分是连接器库,并且这些库都是单独开发和授权的。要从 Eclipse 中安装 Subversive 插件,请浏览到 Help > Software Updates。

图 4. Help 菜单中的 Software Updates

选择 Available Software 屏幕,然后单击 Add Site。对于 Location,输入 http://download.eclipse.org/technology/subversive/0.7/update-site/ 并单击 OK。

图 5. Subversive 的 Add Site

这将添加一列相关插件,但是在安装这些插件之前,请再次单击 Add Site,然后添加 Subversive 连接器的位置。在位置字段中输入 http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/ 并单击 OK。

图 6. Subversive 连接器的 Add Site

您将看到两个更新站点已经添加了许多不同的插件。您可以选择全部这些插件,但是 目前至少要选择带有 SVN Team Provider 和 Subversive SVN ConnecTors 标签的插件。 从列表中选择并单击 Install。

图 7. Subversive 插件

Eclipse 将引导您完成一组标准的安装插件屏幕,包括要求您查阅并接受许可条款的 屏幕。执行完这些屏幕,然后在系统提示时,重新启动 Eclipse 工作区。Subversive 插 件现已安装。

设置库

Subversion 像 CVS 一样是基于服务器的源代码库,这使得它成为跨分布式团队协作 进行软件开发的优秀选择。服务器部分不属于 Eclipse,并且安装和设置 Subversion 服 务器超出本教程的范围。但是,有很多种方法可以运行一个 Subversion 服务器,包括使 用 Apache。

在拥有可以使用的 Subversion 服务器后,您可以设置项目以使用 Subversive 插件 存储源代码和配置。在 Package Explorer 中高亮显示项目名称并显示其上下文菜单。在 其中选择 Team > Share Projects。Eclipse 将显示提供版本控制系统选项的屏幕: CVS(有时已经可以作为 Eclipse 的核心特性获得)和 SVN(这是 Subversion 的缩写符 号,在添加 Subclipse 时启用)。

图 8. 通过 SVN 共享项目

选择 SVN 并选择 Next。系统将显示一个屏幕(如图 9 所示),请在其中输入服务器 URL 和 Subversion 服务器的凭证。输入服务器的信息。然后,可以接受后几个屏幕中设 置的命名库的默认值,并单击 Finish。

图 9. Share Project 向导

Eclipse 将显示项目的提交屏幕(参见图 10)。属于我们的项目的所有文件都将被默 认选中,但是如果需要,您也可以选择不要签入某些文件。系统还将提示输入初始签入注 释。在每次签入时输入注释是一种优秀的实践。输入注释并单击 OK。对于备忘记事本应 用程序代码,需要选中所有文件。

图 10. Subversion 签入框

Eclipse 现在已经把备忘记事本的所有文件添加到 Subversion 库中。如果要使用 Subversion 的 WebDAV 版本(例如像我们一样通过 Apache),则可以使用 Web 浏览器 研究库的结构。只需输入在 Subversive 中用于设置库的相同 URL 和凭证,然后通过每 个文件或目录的超级链接的方式浏览目录树。

图 11. 通过 Web 查看 Subversion 库

您可以在 Package Explorer 中看到我们的项目现在已经与 Subversion 绑定在一起 。Subversion 控件下的每个文件旁边都有一个修订编号,并且项目本身的名称旁边都有 库名称。

图 12. 通过 Subversion 共享后的 Package Explorer

使用库中的代码

像 CVS 一样,我们现在可以从 Team 上下文菜单中访问 Subversion 源代码控制功能 。要在 Package Explorer 中选择需要在库中更新的文件,请打开其上下文菜单并选择 Team。现在将在此上下文菜单中显示所有 Subversion 特性。

下面是我们将使用的更加常用命令列表(参见图 13):

Commit保存库更改Update用库中的最新内容刷新本地副本Revert放弃更改并用库中的 最新内容替换更改Add to Version Control在库中标记新创建的本地文件(然后必须单击 Commit 提交文件才能将它添加到服务器中)。

图 13. Subversion 上下文菜单

要从库中删除文件,请像在正常情况下一样从 Package Explorer 中将其删除(该文 件的上下文菜单中的 Delete 项)。然后提交(commit)该文件的父目录。在对服务器执 行任何一次 commit 之前,您可以检查所有更改;对于删除操作,您将看到被删除文件的 名称和位置。

Subversion 也像 CVS 一样使用乐观锁定 — 即,并没有签出文件、进行编辑并锁定 它,而是可以随意在本地编辑代码,完成后再签入。签入时,所有冲突随之解决。

在 Ganymede 中创建 RCP 应用程序

在本节中,您将通过使用 Eclipse 向导创建 RCP 框架,添加逻辑代码并运行来创建 备忘录应用程序 — 一个简单的只有一个视图的 RCP 应用程序。

创建 RCP 应用程序框架

首先,通过选择 File > New > Project 创建一个新项目。Eclipse 将显示 New Project 向导,如下所示:

图 14. New Project 向导

选择 Plug-in Project 并选择 Next。下一个屏幕将允许您输入项目的详细信息。由 于要创建备忘记事本应用程序,因此将项目命名为 com.devworks.tuTorial.po(用于 “ 备忘记事本”)。使用项目的默认位置(Eclipse 将在按项目命名的工作区下创建一个文 件夹)。一定要选中 Project Settings 下的 Create a Java Project 复选框,并保留 默认值 src 和 bin 作为文件夹名称。对于目标平台,选择 Eclipse version 单选按钮 并从下拉菜单中选择 3.4。请将 Add project to working sets 的复选框留空并选择 Next。

图 15 中所示的 New Plug-in Project 向导将继续 Plug-in Content 屏幕,您可以 在其中输入关于插件的信息,这些信息将被添加到描述插件并允许设置插件选项的清单文 件中。

图 15. New Plug-in Project 向导屏幕

对于插件 ID,选择先前使用的项目名称(com.devworks.tuTorial.po)。由于这是第 一版插件,因此将插件版本值保留为默认值 1.0.0。同样地,您可以保留默认值 Po Plug-in 用于插件名称,以及 DEVWORKS 用于插件提供商。

Execution Environment 下拉菜单允许选择 Eclipse 已知的环境,从而设定插件的特 定运行时环境。对于本教程,选择 JavaSE-1.6。

下一部分将设置插件选项。一定要选中 Generate an activaTor, a Java class that controls the plug-in’s life cycle 框并将默认 ActivaTor 类名 com.devworks.tuTorial.po.ActivaTor 更改为 com.devworks.tuTorial.po.ActivaTor。

由于此插件将有可视组件,因此一定要选择 This plug-in will make contributions to the UI 复选框。请将 Enable API Analysis 的复选框留空。这超出本教程的范围。 最后,由于这将是 RCP 应用程序,因此在系统提示 Would you like to create a rich client application? 的问题时选择 Yes 单选按钮,然后选择 Next 以继续向导。

图 16. New Plug-in Project 向导中的 Plug-in Content 屏幕

图 17 将询问需要使用哪一类 RCP 模板。由于我们的项目将有可视组件, 请选择 RCP Application with a View,然后选择 Next。

图 17. New Plug-in Project 向导的 Templates 屏幕

在图 18 中所示的最后一个向导屏幕 Single View RCP application 中,您可以输入与刚选择 的模板相关的信息。将应用程序窗口标题命名为 Personal Organizer。将 Java™ 软件包名称保留为默认值 com.devworks.tuTorial.po 并将应用程序类命名为 TaskOrganizerApplication。最后,选择 Add branding 标记,这将在应用程序启动时显 示闪屏。单击 Finish。

图 18. New Project 向导中的 Single-view RCP 属性屏 幕

Eclipse 将询问是否需要将工作区视图切换到 Plug-in Development 透视图。 此透视图将包含需要查看的所有视图,因此选择 Yes。向导完成时将在工作区的项目目录 中生成与单视图 RCP 应用程序相关的模板文件,以及在插件开发中十分有用的标准目录 结构。然后将在 Plug-in Development 透视图中呈现工作区屏幕。

图 19. 完成 New Project 向导后的插件工作区透视图

Eclipse 所创建的模板文件列在 Package Explorer 的 src 下。简要地说 ,下面是它们的函数:

ActivaTor插件的启动点TaskOrganizerApplication实现 Application 和定义 应用程序的生命周期的 Application ActivaTorApplicationActionBarAdvisor该类负责 管理添加到窗口中的操作的生命周期ApplicationWorkbenchAdvisor该类用于初始化透视 图ApplicationWorkbenchWindowAdvisor该类负责窗口的许多可视方面(大小、状态行、 菜单栏等)Perspective在应用程序中可见的视图和编辑器View带有三个元素的简单 Table 浏览器

此外,icons 文件夹包含与应用程序相关的图标的位图资源;并且 splash.bpm 是应用程序的闪屏使用的图形。

这些模板文件是创建 RCP 插件的优秀起点,并且您将基于这些模板创建备忘记 事本。但是实际上,它们形成了自己的完整应用程序(虽然不是可以完成很多操作的应用 程序),您可以立即运行。

要查看这些模板同时工作,请转到 Package Explorer 窗口并高亮显示位于树 视图最顶部的项目名称,然后打开上下文菜单(右键单击 Windows;按 control 并单击 Mac OS X 等)。选择 Run As > Eclipse Application。您应当会看到短暂的闪屏, 然后看到带有三个元素的树视图。

图 20. 来自模板的备忘记事本默认树视图

此时,您已经拥有构建带有单个列表视图的简单备忘记事本所需的一切。

编写备忘记事本应用程序的代码

从这里开始,您已经准备好编写备忘记事本应用程序的代码。该备忘记事本将 给一个屏幕提供一张任务列表。每项任务将包含描述、优先级、所有者和记录完成百分比 的位置。将有添加或删除这些任务的按钮,以及关闭整个应用程序的按钮。为了确保有马 上可以使用的内容,该应用程序将用带有各种设置的十个样例任务预先填充任务管理器。 为了保持简单,您输入的数据将不会存储在会话之间的任何位置。

这段代码的详细信息与尝试在本教程中演示的内容不是特别相关,因此鼓励您 下载 这段代码。事实上,许多模板版本的文件不需要更改,但是需要对视图做一些更改 。

在名为 View 的项目下创建新软件包。在此处下,您将创建与应用程序的可视 元素相关的文件。首先,将当前模板创建的 View 类移到该新软件包下,并且将其重命名 为 PersonalTaskView。

由于已经更改 View 类名,因此必须更改其主 View 类的插件定义。因此,在 编辑器中打开 META-INF/MANIFEST.MF 文件并切换到 Extensions 选项卡,如图 21 所示 。展开列表视图中的 org.eclipse.ui.views 扩展并高亮显示 View 类。Eclipse 将在屏 幕右侧显示该类的属性。将该类更改为新软件包并命名为: com.devworks.tuTorial.po.view.PersonalTaskView。将该类的名称更改为 PersonalTaskView。一定要保存更改。

图 21. 更改 View 类

由于备忘记事本实际上是任务集合,因此模型对象被称为 PersonalTaskModel (参见清单 1)。

清单 1. 表示单项任务的 PersonalTaskModel 类

package  com.devworks.tuTorial.po.view;import java.util.ArrayList;import java.util.HashSet;import java.util.IteraTor;import java.util.List;import java.util.Set;import java.util.VecTor;public class PersonalTaskModel {   private final int COUNT = 10;   private List tasks = new  ArrayList(COUNT);   private Set changeListeners = new HashSet();   static final String[] OWNERS_ARRAY = { "-", "Bill", "Larry",  "Jo", "Harry","Hulk" };   static final String[] PRIO_ARRAY = { "-", "Low", "Medium",  "High" };   public PersonalTaskModel() {     super();     this.initData();   }   private void initData() {     PersonalTask personalTask;     for (int i = 0; i < COUNT; i++) {       personalTask = new PersonalTask("Sample Task " +  (i+1));       personalTask.setTaskOwner(OWNERS_ARRAY[i % 5]);       personalTask.setTaskPrio(PRIO_ARRAY[i % 3]);       tasks.add(personalTask);     }   };   public String[] getOwners() {     return OWNERS_ARRAY;   }   public String[] getPrios() {     return PRIO_ARRAY;   }   public List getTasks() {     return tasks;   }   public void addTask() {     PersonalTask task = new PersonalTask("New Sample Task");     tasks.add(tasks.size(), task);     IteraTor iteraTor = changeListeners.iteraTor();     while (iteraTor.hasNext())       ((IPersonalTaskViewer) iteraTor.next()).addTask(task);   }   public void removeTask(PersonalTask task) {     tasks.remove(task);     IteraTor iteraTor = changeListeners.iteraTor();     while (iteraTor.hasNext())       ((IPersonalTaskViewer) iteraTor.next()).removeTask(task);   }   public void taskChanged(PersonalTask task) {     IteraTor iteraTor = changeListeners.iteraTor();     while (iteraTor.hasNext())       ((IPersonalTaskViewer) iteraTor.next()).updateTask(task);   }   public void removeChangeListener(IPersonalTaskViewer viewer) {     changeListeners.remove(viewer);   }   public void addChangeListener(IPersonalTaskViewer viewer) {     changeListeners.add(viewer);   }

您可以看到清单 1 定义了任务结构以及运行方法。在本例中,它也定义了用于 初始填充的样例数据。

PersonalTaskViewer 类将定义 TableViewer,后者是用于保存任务列表的构建 块。创建 PersonalTaskViewer 涉及创建 TableViewer,添加 Content and Label Provider,最后初始化 PersonalTaskModel 并将此模型设为 TableViewer 的输入。

清单 2. PersonalTaskViewer 中的 addChildControls() 方法片段

tableViewer = new TableViewer(table);tableViewer.setUseHashlookup(true);tableViewer.setColumnProperties(columnNames);// Create the cell ediTorsCellEdiTor[] ediTors = new CellEdiTor[columnNames.length];// Column 1 : Completed (Checkbox)ediTors[0] = new CheckboxCellEdiTor(table);// Column 2 : Description (Free text)TextCellEdiTor textEdiTor = new TextCellEdiTor(table);((Text) textEdiTor.getControl()).setTextLimit(60);ediTors[1] = textEdiTor;// Column 3 : Priority (Combo Box)ediTors[2] = new ComboBoxCellEdiTor(table, taskList.getPrios(),  SWT.READ_ONLY);// Column 4 : Owner (Combo Box)ediTors[3] = new ComboBoxCellEdiTor(table, taskList.getOwners(),  SWT.READ_ONLY);// Column 5 : Percent complete (Text with digits only)textEdiTor = new TextCellEdiTor(table);((Text) textEdiTor.getControl()).addVerifyListener(   new VerifyListener() {     public void verifyText(VerifyEvent e) {       e.doit = "0123456789".indexOf(e.text) >= 0 ;     }   });ediTors[4] = textEdiTor;// Assign the cell ediTors to the viewertableViewer.setCellEdiTors(ediTors);// Set the cell modifier for the viewertableViewer.setCellModifier(new TaskCellModifier(this));// Set the default sorter for the viewertableViewer.setSorter(new PersonalTaskSorter (PersonalTaskSorter.TASK_DESC));// Create and setup the TableViewertableViewer.setContentProvider(new PersonalTaskContentProvider());tableViewer.setLabelProvider(new TaskLabelProvider());// The input for the table viewer is the instance of  PersonalTaskModeltaskList = new PersonalTaskModel();tableViewer.setInput(taskList);

当 PersonalTaskContentProvider 类的输入被设为特定元素时,该类包含一些 方法,可以返回显示在 TableViewer 中的元素。该类还定义对 PersonalTask 的基本操 作,如来自 IPersonalTaskViewer 的 addTask()、removeTask() 和 updateTask()。

PersonalTaskLabelProvider 类将为该表的列数据提供标签和图像。

清单 3. PersonalTaskLabelProvider 中的 getColumnText()

public  String getColumnText(Object element, int columnIndex) {   String result = "";   PersonalTask task = (PersonalTask) element;   switch (columnIndex) {     case 0:       break;     case 1 :       result = task.getTaskDesc();       break;     case 2 :       result = task.getTaskPrio();       break;     case 3 :       result = task.getTaskOwner();       break;     case 4 :       result = task.getPercentComplete() + "";       break;     default :       break;   }   return result;}

TaskCellModifier 将用作以抽象方式从单元格编辑器访问数据模型的单元格修 饰符。它提供的方法将检查是否可以编辑 TaskModel 元素的属性,检索 TaskModel 元素 的属性值以及将单元格编辑器的值存储回模型元素的属性中。

PersonalTaskSorter 类将获取 PersonalTaskContentProvider 所提供的元素 并将它们按给定顺序排序。compare() 方法将根据 SortType 对元素排序。

清单 4. PersonalTaskSorter 中的 compare()

public int  compare(Viewer viewer, Object o1, Object o2) {   PersonalTask task1 = (PersonalTask) o1;   PersonalTask task2 = (PersonalTask) o2;   switch (sortType) {     case TASK_DESC :       return compareDescriptions(task1, task2);     case TASK_PRIO :       return comparePrios(task1, task2);     case TASK_OWNER :       return compareOwners(task1, task2);     case TASK_COMPLETE :       return comparePercentComplete(task1, task2);     default:       return 0;   }}

PersonalTaskView 是扩展 ViewPart 的 View 类。

清单 5. PersonalTaskView 中的 createPartControl()

public  void createPartControl(Composite parent) {   viewer = new PersonalTaskViewer(parent);   viewer.getCloseButton().addSelectionListener(new SelectionAdapter()  {     public void widgetSelected(SelectionEvent e) {       handleDispose();     }   });}

PersonalTaskOrganizer 应用程序的透视图将把此 View 显示在透视图中(参 见清单 6)。在此过程中,您已经建立了 RCP 应用程序向导所生成的代码模板与 PersonalTaskView 之间的连接。

清单 6. 透视图中的 createInitialLayout()

public void  createInitialLayout(IPageLayout layout) {   String ediTorArea = layout.getEdiTorArea();   layout.setEdiTorAreaVisible(false);   layout.setFixed(true);   layout.addStandaloneView(PersonalTaskView.ID, false,  IPageLayout.LEFT, 1.0f,ediTorArea);

按照以前的做法运行应用程序,请在 Package Explorer 中的项目的上下文菜 单中选择 Run > Eclipse Application。在闪屏后,您将看到预先填充一些样例任务 的任务管理器。

图 22. 备忘记事本任务管理器视图

祝贺您!您已经创建了现在可以在所选桌面环境中运行的简单 RCP 插件。

创建产品定义

在先前版本的 RCP in Eclipse 中,分发的应用程序中附带的插件限于目标目 录中可用的那些插件。使用 Ganymede,您现在可以确切指定所需的插件,从而得到更精 确的分发版。在本节中,您将打包应用程序,以便可以使用更紧凑的软件包分发,其中仅 包含运行所需的内容。

设置目标环境

要设置目标环境,请在 Package Explorer 中高亮显示项目名称并在上下文菜 单中选择 New > Product Configuration。

图 23. 上下文菜单中的 Product Configuration

这将启动允许编辑 RCP 应用程序配置的向导(参见图 24)。在向导的第一个 屏幕中,请将父文件夹设为 com.devworks.tuTorial.po 并将文件命名为 TaskOrganizer.product。请将 Initialize the file content 的单选按钮选择为 Create a configuration file with basic settings,然后选择 Finish。

图 24. New Product Configuration 向导

Eclipse 已经创建了名为 TaskOrganizer.product 的文件,该文件包含默认显 示在编辑器中的 Overview 选项卡的配置模板定义。

请将显示在应用程序标题栏中的名称指定为 Personal Organizer,并将产品标 识符指定为 com.devworks.tuTorial.po.product。产品版本编号为 1.0.0,而应用程序 为 com.devworks.tuTorial.po.application。这后两个值是从下拉列表中选择的。最后 ,应用程序的产品配置将基于插件,因此将该配置选择为单选按钮。由于编辑的是属性文 件,因此请一定要通过文件菜单或者使用操作系统相应的快捷键保存工作。

现在选择 Configuration 选项卡,您可以在该选项卡中添加所需插件且仅限于 所需插件(参见图 25)。首先通过单击 Add 添加刚编写的插件。显示所有已知插件的对 话框将出现;选择 com.devworks.tuTorial.po 并单击 OK。

图 25. 选择用于配置的插件

您的插件现在将显示在 TaskOranizer.product 编辑器的 Configuration 选项 卡的列表中(参见图 26)。

图 26. Taskorganizer.product 编辑器视图

在告诉 Eclipse 这是分发版所需的一个插件后,它现在可以直接判断并自动添 加所有从属插件。单击 Add required plug-ins,然后 Eclipse 将把所需的附加插件添 加到列表中。

图 27. 附加插件

上帝助自助者。

使用EclipseGanymede进行桌面、Web和移动设备开发,第1部分(一

相关文章:

你感兴趣的文章:

标签云: