如果您想开发插件共享给其他人,那么学习如何有效地使用功能部件是最基本的。本文就如何组织功能部件和优化使用插件开发环境来开 发功能部件和插件提出了一些建议,同时介绍了定制 Eclipse 行为的高级技术。即便您只是想学习如何设置 Eclipse,以使您可以自定义任何工作空间的初始化属性值,或者是学习如何使用链接文件来管理您添加到 Eclipse 的组件,本文对您来说也将有所帮助。
构建一个插件是很有趣的:您开始编写代码并创建您想要的工具。把插件拷贝到 Eclipse 或一个基于 Eclipse 的产品中的 plupgins 目录下,这个插件在 Eclipse 运行期环境中就可以使用了。当再一次使用 Eclipse 的时候,插件将被找到,而且经过平台的启动处理,它在运行期配置中将是可用的。
但是谁知道或者关心您的插件加入了进来?用户可以明白您提供的是什么工具吗?他们可以通过 Eclipse 来禁用、修补或者管理您的组件吗?答案显然是否定的。插件本身仅仅是一个插件,而不是与
Eclipse 平台完全集成的组件。
虽然功能部件很多,但是当您启动 Eclipse 的时候,只有一个功能部件处于控制之下。这个主要功能部件决定了产品的标识和其他运行期行为,包括确定名字和与运行期平台相关联的图示,以及对所有插件默认属性值的重新定义选项。在后面的 定义您自己的全局属性中可以看到,这个功能强大的选项使您可以定制您自己的 Eclipse 设置。
|
插件开发环境(PDE)可以自动完成为完整的运行期环境准备功能部件和插件的大部分工作。参见 Eclipse.org 中文章的讨论 "PDE 生成插件"(在后面的 参考资料中有相关链接)。这些基本的步骤在The Java Developer's Guide to Eclipse(同样参阅后面 参考资料中的链接)中也曾作为一个练习涉及到,遵循那个练习您可以构建并标识您已有的插件。可以说如果您有一个功能部件,并且了解 PDE 如何帮助您构建插件和功能部件,您就可以构建一个功能部件,然后让它去同时构建所有相关的插件。构建控制策略(bin.excludes 与 bin.includes)将在后面的 使用 PDE 构建功能部件的策略中讨论。这些策略是对 Eclipse.org 文章以及The Java Developer's Guide to Eclipse一书的补充。
|
理解功能部件所需要条件有助于理解它们如何对活动配置中可用的内容进行管理。
如果是一个刚解压缩的 Eclipse 平台,那么当您启动 eclipse.exe 的时候将会发生:
|
一旦 Eclipse 启动,活动配置定义将包含在 .metadata.configplatform.cfg 文件中。
如果您已经使用了一段时间的 Eclipse 或者在您的配置中添加了哪怕只是一个新的插件,您肯定知道 Eclipse 是到 eclipsefeatures 目录和 eclipseplugins 目录下去查找功能部件和插件的。不过您是否知道,Eclipse 也会到文件系统的其他位置去查找功能部件和插件?如果在 eclipselinks 目录下存在格式正确的链接文件,那么这些文件会被处理,相关联的功能部件和插件(包括没有相关功能部件的插件)在运行期配置中都会是可用的。
一个链接文件只是一个命名为 id.link 的任意文件,在这里 id 通常是正在被引用的根功能部件的 id。您可以在链接文件目标中定义不只一个功能部件,并且名字命名为
foo.link 也是可以接受的。给出一个包含如下内容的链接文件:
path=E:/Eclipse-2.1.1/installedFeatures/Examples
Eclipse 将会到指定的目录下去查找 eclipsefeatures 目录和 eclipseplugins 目录,看是否有合法的功能部件和(或)插件。也就是说,目标目录必须包含一个 eclipse 目录。如果找到,附加的功能部件和插件在运行期配置是将是可用的,如果链接文件是在工作区创建之后添加的,附加的功能部件和插件会作为新的 配置变更 来处理。
使用链接文件来定制您自己的 Eclipse 安装设置的策略将在本文稍后的 使用链接文件管理 Eclipse 安装设置中进行讨论。
如果一个新的功能部件及所用到的插件已经添加到已有的 features 目录和 plugins 目录下,或者通过一个链接文件注册到 Eclipse,校验和的变化将触发配置处理过程。这个处理在一个简单的 splash-flash之后进行。新的功能部件作为一个配置变更来处理,并且显示出一个配置变更的对话框。
例如,如果您打开一个标准的 Eclipse 解压缩环境的工作区,而后找到了 Eclipse Examples,您把它解压缩到与 Eclipse
同样的目录树中或者添加了一个链接文件来指明这个例子解压缩到了何处,将会出现一个如图1所示的对话框。
所以,如果您看到类似于这样的一个对话框,那是因为在您运行一个安装配置程序的时,您自己或者其他人修改了 Eclipse 的配置,而平台发现了新的或者更新过的可用功能部件。如果条目可以被选中,您可以将这个变化添加到您当前的配置中。如果条目被禁用,说明存在配置上的问 题,这个功能部件不能被添加进来。按下 Error Details 按钮可以查看有关配置问题的信息。
配置管理注解:
|
Eclipse 允许标识活动产品,也可以选择标识运行期配置中的每一个功能部件。功能部件不是必须要标识出来,您可以不标识您所有的功能部件,但是您应该至少标识一个。
添加标识的关键问题是要明白把标识的定义在哪里。您定义标识的是功能部件,但是标识的内容是来自于插件。或者插件与功能部件的 id 相同(默认的情形),或者插件在功能部件的定义中被明确标识(这是 Eclipse 2.1.1 的新增功能)。在 Eclipse 2.1 中,一个功能部件定义可以通过在 feature.xml 文件中指定属性 plugin=… 来定义其他插件。
插件包含了用于定义和提供标识内容的文件。
about.ini 控制文件定义了产品级和功能部件级的标识。产品标识必须正确包含以下两方面内容:
理解功能部件标识的最简单的办法是去查看在 about.ini 控制文件中定义了哪些元素,以及它们在一个被标识的产品或功能部件中如何起作用。
以下几条仅用于产品标识:
其余条目在产品及功能部件标识过程中使用。
以百分号(%)开头的值在 about.properties 文件中解析。当一个功能部件是主要功能部件时,用 abouText 关键字定义的文本会在 About product 对话框中显示。当用户点击 Feature Details 按钮时,随后弹出的 About Features 对话框中也会显示这些本文内容。
功能部件被加入到运行期配置时,会打开 welcomePage 条目指定的欢迎页面,其后还可以通过选择 Eclipse 菜单选项 Help > Welcome... 打开的 Welcome 选择对话框打开这个欢迎页面。
构建一个可行的有标识的功能部件的最快速方法是克隆一个在 Eclipse 本身中可以找到的一个现有的功能部件。具有 org.eclipse.platform id 的功能部件和插件会提供功能部件标识和插件标识。在The Java Developer's Guide to Eclipse一书第34章练习7中有一个步骤详尽的指导说明。
在 Eclipse.org 的更新管理器子工程的开发资源中,您可以找到另外一些关于标识的详细说明(参见 参考资料中的链接)。
|
在The Java Developer's Guide to Eclipse一书中关于功能部件开发的章节和 Eclipse.org 的文章 "PDE 生成插件"中都对构建功能部件的过程进行了介绍,但是也还有一些其他的途径。当您理解了如何使用 PDE 来构建功能部件和相关联的插件之后,您可以让这些步骤自动完成。
让我们从对 PDE 所提供功能概要介绍开始讲起。PDE 将为一个 plugin.xml 或 feature.xml 文件生成 build.xml 文件。Build.xml是一个 Ant 脚本,可以完成运行期平台的功能部件和插件所需要的不同任务。PDE 构建过程允许您生成下列构建目标中的一个或多个。
重要的功能部件构建目标:
重要的插件构建目标:
注意:在功能部件和插件的Ant 处理过程中,更新 JAR 或生成压缩包的处理过程中打包的文件,是运行期环境所需要的那些文件。这些内容在功能部件或插件的 build.properties 文件和在 plugin.xml 中定义的每一个插件的运行期 JAR 文件中,通过 bin.includes 或者 bin.excludes 条目来描述。
为
了构建一个插件,您可能会指定
clean,build.sources,build.jars,zip.plugin,refresh。为了构建一个功能部件,您可能会指定
clean,build.sources,build.jars,zip.distribution,refresh。您或许会想要在开始时使用
clean 来强制重新生成所有结果,经常会有这种情况。尽管 Ant
处理过程将基于输入的变化重新执行所需要的步骤,但是有一些变化不会触发所有需要的处理过程。测试结果表明如果您改变了一个
Java 源文件,相应的源文件压缩包将会更新,但是类不会被重新编译,运行期 JAR
也不会被更新。所以安全起见,建议您先将输出结果清空,以保证您在重新构建后所使用的是对应于当前源文件的运行期版本。
为了进行讨论,我们先描述一下只有一个功能部件和插件时在运行期配置中需要的内容。
组件结构示例
| 组件类型 | 文件 |
| 功能部件 | feature.xml |
| feature_image.jpg | |
| /license/license.html | |
| /license/license.pdf | |
| /plan/project-plan.doc | |
| 插件 | plugin.xml |
| /images/action.gif | |
| /images/editor.gif | |
| /src/co/pkg/id/action.java | |
| /src/co/pkg/id/editor.java | |
| /design-docs/plug-in.doc | |
| /design-docs/editor.doc |
至少到刚开始时,最简单的方法是,在构建过程中将您要打包的部分作为在运行期配置中功能部件或插件的一部分而列出来。相应的 build.properties 文件分别如下所示:
build.properties 内容
| 组件 | build.properties 文件内容 |
| 功能部件 | bin.includes = feature.xml,
license/ |
| 插件 | source.runtime.jar = src/
bin.includes = plugin.xml, images/ |
另一种方法是把您不想打包的部分在构建过程中作为功能部件或插件的一部分列出来。这不仅要包括您不想共享的文件,还要包括构建过程中创建的文件和目录(有一些是临时的)。这种方法用到的 build.properties 文件如下:
build.properties 内容
| 组件 | build.properties 文件内容 |
| 功能部件 | bin.excludes = temp.folder/,
com.ibm.master.lab.core_1.0.0.bin.dist.zip, .classpath, .project, build.xml, build.properties |
| 插件 | bin.excludes = temp.folder/,
bin/, .classpath, .project, build.xml, build.properties, makesrczip.xml, src/ |
如果给定功能部件或插件的 id 值为 com.your.feature.id 或者 com.your.plugin.id,那么您在使用排斥策略的时候还需要在文件中包括以下条目:
com.your.feature.id_1.0.0.bin.dist.zip,
com.your.feature.id_1.0.0.jar,
com.your.plugin.id_1.0.0.jar,
zip 条目将使生成的组件压缩包不被 update JAR 或者组件压缩包自己所包含。JAR 条目将使生成的功能部件或插件的 update JAR 不被组件压缩包或者 update JAR 自己所包含。
当您的组件压缩包或者 update JAR 看起来比它应该的大小要大,或者在每次您进行编译时包的大小呈跳跃式增长,说明您应该执行以上步骤了。您需要在适当的功能部件或者插件的
build.properties 文件中加入以上条目来解决这个问题。
除了以上提到的之外,当一个新的文件或目录添加到功能部件或者插件时,还有必需的响应需要考虑。我们的意思是您得让您的功能部件和插件能应付可能的改变,也就是说它们分别需要一个 feature.properties 文件和一个 plugin.properties 文件。当您用包含策略时,您需要给 .properties 文件添加一个适当的属性,如果是使用排斥策略的话就不用这样做了。
不 论哪种方法,如果您把一个文件添加到一个目录,那么不需要做任何其他的改动。对于新添加的文件,如果使用的是包含策略,它会被发送处理,如果使用的是排斥 策略,它将不会被发送处理。这实际上是您可能应该要考虑使用不同的目录来存放不同的文件的原因。例如,您的插件所用到的所有图片所在的目录应该被包含在 内,而一个开发过程中存放插件的设计讨论或文档的目录则不然。
最坏的情形是当您忘记对
build.properties
进行更新时:会发生运行期失败或生成内容存在差错的产品。如果您使用包含策略,新加入的文件或目录在打包后是不可用的,这有可能会导致您的插件不能用或者
显示出
Eclipse
默认的图标(红盒子)。如果是使用排斥策略添加新文件或目录,这些文件或目录的内容在打包过程中会被包含进来。根据您的风格选择适当的方法,从而把您忘记
执行更新时的风险降到最低。这将取决于您所面临的主要问题:是功能部件或插件不能运行,还是其他人本不应该看到运行期目录下的文件。
当您在开发您的工具时,您是否考虑到了需要多少个插件?答案是至少三个:一个是您的模型,也就是非 UI 的核心部分,一个是您的 UI 内容,还有一个或多个是用于提供帮助内容。如果您注意过,您会发现这是 Eclipse 本身的基本模式(jdt.core, jdt.ui, jdt.doc; debug.core, debug.ui;等等)。
这样划分的原因之一是,相对于不用于 UI 的插件来说,用于 UI 的插件在运行期需要不同的 Eclipse 组件的支持(org.eclipse.ui)。
|
功能部件如果没有被其他功能部件包含,那么在 Eclipse 配置中都会被配置为根功能部件。默认情况下,根功能部件可以由用户在 Install/Update 透视图中禁用或启用,并且可以在 feature.xml 文件中确定一个更新 URL。当包含一个功能部件时,只有在根功能部件中的更新 URL 会被处理,否则只能通过 search-location 定义特别许可才可以。
通过包含功能部件,您可以管理包的组织结构。您可能会有多个功能部件,但只有一个做过标识,其余的或者是用来构成结构,或者是用来管理组件。请记住是根功能部件来定义更新的站点,尽管这个角色可以由功能部件委派给它所包含的功能部件,通过设置 search-location 属性值为 selfboth。
如果您正在构建一个基于 Eclipse 的产品,您可能希望您的一个功能部件来包含 Eclipse 功能部件树。对于标识这个产品来说这并不需要,但是您可以指定另外的更新站点(Eclipse
自己用的是 http://update.eclipse.org/updates),或者根本不指定更新站点,禁用基于 Web 的更新。
当将一个功能部件包含到另一个功能部件时,您可以选择是否把它设置为可选的。主要原因是创建这样的结构可以让用户根据他自己的需要来禁用您提供的组件的一部分。
当
新的功能部件包含有可选功能部件,但那些可选功能部件并不存在时,Eclipse
的配置逻辑不允许添加这个新的功能部件。也就是说,如果适当的先决条件成立,可以使用可选功能部件来创建层结构。不过需要将这些层存贮在不同的目录树下,
并且每层使用单独的链接文件。您可以添加到
Eclipse 配置以增加其功能的链接文件的没有数目上的限制。
|
让 Eclipse (或者任何基于 Eclipse 的产品)以您的方式工作
现在向您讲明了两点:指定的主要功能部件控制整个产品的标识和默认属性,Eclipse 可以在安装配置目录下或者任何一个链接的 Eclipse 目录结构下找到组件。这意味着您可以改变 Eclipse (存在相关风险,不过仅仅意味着您修改时需要小心!)。这些改变可以帮助您管理基于 Eclipse 的安装配置,并使之支持您个人所喜好的属性规则。
您可能会希望能对环境进行更多的管理,而不是毫无选择地将所有的插件(我希望是引用到的功能部件)全部安装到您的 Eclipse 目录树下。如果您需要更新 Eclipse,实际上您并不想要另外再装一个新的 Eclipse 或者在列表中去查找您所想要的功能部件和插件。
下面是一种借助链接文件来组织您的 Eclipse 或者基于 Eclipse 的产品和构件的方法:
例如,假定您将 Eclipse 解压缩到一个名为 Eclipse-2.1.1 的目录下,然后创建一个名为 CoolTools 的 add-ons 目录,也放在 Eclipse-2.1.1 目录下。在 CoolTools 目录下,您可以有多个目录,每个目录用于一个或一族您要添加到 Eclipse 的工具。您的目录结构可能会如图3所示。
EditorList.link 文件要包含下面其中一条(不能是全部)
path=D:/Eclipse-2.1.1/CoolTools/EditorList
path=D:\Eclipse-2.1.1\CoolTools\EditorList
斜杠是一条(/)还是两条(\)取决于目录结构。
确认条目不要以空格结尾,因为这样 Eclipse 会忽略它――我第一次用链接文件时用了好几个小时才弄明白这一点。
如果您使用一个新的工作区来启动 Eclipse,所有 Eclipse 自带的以及通过链接文件找到的功能部件和插件都是可用的。如果您要添加一个链接文件,并使用现有的工作区重新启动 Eclipse,Configuration Changes 对话框就会弹出。如果您删除了一个链接文件(很简单,只是把它移到 links-out 目录下),配置的变化也会被 Eclipse 注意到,但您能看到的仅仅是 splash-flash。
实际上您不是必须将链接文件移入移出来控制配置,更好的办法是用 Install/Update 透视图来调整配置。当然,可以这样做的前提是您的插件都属于功能部件(看,这是另外一个需要功能部件的理由)。使用
Eclipse 进行配置的调整将以后面讨论。
根功能部件,以及任何定义为可选择的功能部件,都可以在当前配置中禁用。被禁用后,功能部件仍然可以被平台认出;它们只是不再包含在当前的运行期配置中。
前面我们谈及了将 Eclipse Examples 添加到活动配置中。添加后,我们可以使用 Install/Update 透视图来禁用它。如果您正打开一个包含有
Eclipse Examples 的 Eclipse 配置的 Install/Update 透视图,您看到的将如图4 所示。
图 4. 在 Install/Update 透视图中的 Eclipse Examples 功能部件
在 Preview 视图中点击 Disable Now 按钮,您就可以将 Eclipse Examples 功能部件从运行期配置中临时移除。点击后,Eclipse 将提示您重新启动平台来使配置的修改生效。
Eclipse Examples 功能部件在当前配置中将不再可见(或者说不是活动的)。为了能再次看到这个功能部件并启用之,您需要在 Install
Configuration 视图中点击
Show Disabled Features开关按钮(见图5)。
图 5. 在Install/Update 透视图中禁用 Eclipse Examples 功能部件
由于 Eclipse Examples 功能部件是一个根功能部件,所以可以这样做。如果您在 Eclipse SDK 中浏览其他功能部件,您将发现它们在 Preview 视图中没有相应的 Disable Now按钮,这是因为它们被定义为必需的。
如果您用的是 Eclipse SDK,您应该会有默认配置的平台、JDT 和 PDE。如果您正在做一些插件的开发,但是您不需要 PDE——或者在一些情况下,您不是总需要
JDT——您只要对 Eclipse 做一个小的修改就可以禁用这些功能部件。打开 org.eclipse.platform.sdk.win32
功能部件的 feature.xml 文件,将以下几行修改为包含 optional="true" 属性。
|
现在您可以在 Install Configuration 视图中选择这些功能部件并禁用它们。如果所有前面提到那些定义为可选择的功能部件都被禁用,平台依然可以运行。并且,您随时可以重新启用它们。图6 是 Install Configuration 视图中显示的被禁用的功能部件。
这些禁用/启用的设置都是仅对于当前工作区有效。您可以有另外的活动工作区,其中包含有部分或全部在当前工作区中被禁用的功能部件。
这个简单的例子说明了使用功能部件的优势(它们可以被禁用)和使用链接文件来将所有可能的功能部件添加到您的配置的意义所在。在一个给定的工作区中将您所不需要的功能部件禁用,这样就可以优化当前配置。
|
Eclipse 是一个优秀的工具,但是同任何工具一样,您得对它进行定制,它才能是完美的。工具提供了属性页面来让您改变工具的行为或可视化显示。最新统计,在 Eclipse 中有 62 个属性页面。几乎每次您使用到一个新工具,您都会发现有些选项您想要修改。但是当您使用多个工作空间时,或者是在一个团队的环境中工作,有一些选项需要与他人协调,这样就出现了如何在跨工作空间以及与他人协调工作时对选项进行最佳管理的问题。
Eclipse 提供了导入/导出属性的功能。在任何一个属性对话框中,您都可以将属性导出到一个 .epf 文件中。当使用其他工作区或与他人共享时,可以再次导入这个文件。您甚至可以将它添加到工程中与团队成员共享,以便每个人都可以得到标准的属性。
但是这样做会变得单调而乏味,并且如果您忘记了就麻烦了。在使用 Eclipse 或任何基于 Eclipse 的产品时,您应该意识到还有另外一种方法可以定义全局属性。您可以通过修改主要功能部件的 plugin_customization.ini 文件来定制属性的默认值。
您可以在 eclipse 目录下的 install.ini 文件中找到主要功能部件。例如,在标准的 Eclipse 解压缩中的 install.ini
的内容如下:
# install.ini |
feature.default.id=… 指定了默认的主要功能部件。要注意的是,通过在启动 Eclipse 时使用 -feature 选项,可以把其他功能部件声明为是主要的。
同大部分功能部件控制和标识一样,实际的工作都是在功能部件相关联的插件中完成的。对于 Eclipse来说,这是一个 id 与功能部件相同的插件,org.eclipse.platform
插件。如果您仔细查看这个作为主要功能部件标识的插件,您将发现一个名为 plugin_customization.ini 的文件。这个文件的内容与导出属性的文件类似。当
Eclipse 启动时会读取这个文件,并用来指定所有默认的属性值,而不是去使用插件本身定义的那些值。这就使得产品,或者说是您,可以改变插件的行为。默认的
plugin_customization.ini 文件的内容只有一条:
# plugin_customization.ini |
这一条目指定了打开新的工作区时以及当您关掉所有的透视图后关闭 Eclipse 时打开的透视图。如果您使用的基于 Eclipse 的产品,这个条目可能有所不同。
指定要包含的属性的过程比较费事,但至少您应该做如下步骤:
注意:如果您不习惯于去更新产品的 plugin_customization.ini 文件,您可以在其他位置创建一个这个文件的拷贝,在启动 Eclipse 或基于 Eclipse 的产品时使用参数来指定它。
eclipse -plugincustomization myCustomDefaults.ini |
|
前面提到了一些相关技术的描述,并提出了对您可能希望包含到您定制的 plugin_customization.ini 文件中的一些值的建议,这里给出了示例属性重写,作为对前面两方面的内容的说明。
我们将把它们根据我定制的目的在逻辑上分为的几部分来介绍。您可以下载完全的 插件 customization.ini 文件。
# View tabs at the bottom |
# No welcome dialog at open and no confirm on close |
# Never change to perspective required by new project wizard (no prompt) |
# Default text font (leaks into Java editor) |
# Add to the default JDT task tags (TODO should probably be left) |
|
有一些没有定义属性页面的选项也是可以定制的。在完成对 UI 的标准设置后导出的 .epf 文件中,我发现有一些 JDT 的选项值是作为属性来保存的。
# Tells JDT it does have some prefs to use (forces a read of these values) |
# Package Explorer filter - standard JDT defaults + library filter |
# Outline view GoInto Toggle when using JDT editor |
您可能会想要尝试为更多的属性指定新的默认值,使用前面描述的方法然后核对一下结果即可。您或许会希望在一个临时的工作区中做这些事情,达到修改的目的后,您可以按此去修改活动的主要功能部件的 plugin_customization.ini 文件(不要告诉任何人是我教您这样做的!)。并且要注意的是,您可能会发现其他一些键被忽略了,这种情况我也曾遇到过,因为字体是用于 JDT 的,因此这一条目加入到 plugin_customization.ini 文件后,在属性页中根本就不会体现出这种变化。
|
功能部件是 Eclipse 的幕后英雄--它们很重要,因为它们是 Eclipse 配置管理的组成部分,支持产品标识,并且它们是在 Eclipse 平台上构建定制解决方案的产品的一部分。使用功能部件您可以:
所以,使用功能部件吧,它可以帮助您自动完成构建插件的一些步骤,使用文中提到的自定义 install/link 文件组织方法,可以使您的 Eclipse 环境更加好用。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/374079/viewspace-130674/ ,如需转载,请注明出处,否则将追究法律责任。