有多少次在将您定制的 Eclipse 插件或功能导出至另一个基于 Eclipse 的应用程序之后,它们出现故障?
在新环境中找出并满足所有的插件依赖关系这一流程得到了简化。过去必须手动验证插件,但如今,Eclipse 的 Dependency Visualization 工具(属于 Eclipse Incubator 项目的一部分)可以消除或减少这种需求。我们将详细探讨问题,考察可用的解决方案,并考虑可能要进行的修改,从而让插件依赖关系分析任务变得更加简单。
Eclipse 已经改变了 Java™ 以及其他语言程序员开发应用程序的方式,并逐步推动大应用程序的诞生。尽管并非新概念,在排列整齐的 bundle 中清晰地定义所有依赖关系对于众多开发人员而言是一个福音。
开放服务网关协议 (Open Services Gateway Initiative, OSGi),以及其通过替换/添加/删除 bundle 来更新应用程序的巧妙机制带来了新的可能性。现在,在客户端计算机上更新基于 Eclipse 的应用程序与更新基于 Web 的应用程序同样常见和简单。
我们应该记住,为了让整个更新机制正确工作,背后要完成大量艰难的工作。我们知道,只要将 bundle 放在正确的文件夹中便可更新基于 Eclipse 的应用程序,但对于依赖关系又怎么样呢?有多少次您找不到功能或者看到令人生畏的 Eclipse 加载错误,并未说明发生了什么状况?
在两种场景中可以发现问题:
- 安装第三方功能:丢失依赖关系的可能性减小。在最好的情况下,这些问题在发布之前就已解决,但我们知道情况并非总是这么理想。
- 创建新功能:Eclipse 提供大量的 API,而很多程序员无法使用目标平台。在导出 bundle 时,Eclipse 安装就会失败。
问题的症结在于无法识别和记录新功能的最小 bundle 集合(简称为依赖关系)。
最近,我们计划在其中一个项目中使用 SWTBot 测试工具时,面临过这种场景。与其他自动化测试工具一样,SWTBot 的一部分应该位于要测试的应用程序 (AUT) 中,以便能自动工作。如果将 SWTBot 功能安装到使用 Equinox P2 更新功能的应用程序中,它将会处理依赖关系问题。但是很多次这都是不可能的,例如当应用程序不支持 P2 时。
没什么好害怕的(还没到时候),让我们继续看下一部分内容。
我们可以通过很多方式看似合理地解决这个问题:
<Application Executable> -clean -console
运行 OSGi 控制台的同时启动应用程序- 逐个搜索未解决插件的依赖关系
如果您足够幸运,可以看到一条简单的错误消息,比如 "Could not resolve bundle ABC due to missing required bundle XYZ"。
如果运气不好,您会看到 "Could not resolve bundle ABC due to missing package XYZ",因为您必须识别哪个 bundle 导出了指定的包。
您不能使用 package<package name>
命令来发现 bundle,因为只有当对要发现的 bundle 进行解析之后,该命令才有效。如果它已被解析,您将不会看到任何错误。
控制台方法还有一个不利方面。考虑如下情形:在您的终端上一切正常,但在远程计算机上不正常,而该远程计算机的用户不具备使用控制台的技巧。即便用户悟性很高,您也不想他们为了了解开发人员的技巧而抓狂吧。
最后一点,基于 Eclipse 的应用程序通常使用一种定制的启动机制,例如当无法直接提供
-console 选项时使用的定制脚本。
记住这一点之后,让我们寻求一种更好的解决方案。
前面提及的背景工作并非始终是困难的。我们愿意聪明地工作,而 Eclipse Project 将帮助我们完成这些工作。
本文演示了 Eclipse 项目工具 Dependency Visualization 的用法,它可以在不启动目标应用程序的情况下显示插件的依赖关系。这有助于在运行应用程序之前找出未解析的插件。
Eclipse PDE 项目中的 Dependency Visualization
注意:Dependency Visualization 插件用于显示适用于 Eclipse 3.5.X 或更高版本的依赖关系图。
- 使用 Eclipse 更新库功能安装功能。导航至
Help>Install New Software并粘贴至 http://download.eclipse.org/eclipse/pde/incubator/visualization/site。取消选中的 Group items by category 复选框。然后导航至
Window>Show View>Other>Graph Plug-in Dependencies视图,或者按下 Ctrl+3 然后选择 Graph Plug-in Dependencies 视图,如 图 1 所示。
图 1. Graph Plug-in Dependencies 的视图
- 导航至
Window>Preferences>Plug-in Development>Target Platform并选择 Eclipse 目标平台为包括来自 <application_install>/dropins 与 <application_install>/plugins 的插件,然后将它设置为激活。点击 Apply(参见 图 2)。
图 2.
- 右键单击并选择 Focus On。在 dropins 下选择您想要查看其依赖关系图的插件。这里我们选择
org.eclipse.emf.core。
控制面板中已经添加了三种依赖关系分析工具。如果选择一个 bundle,可以突出显示此 bundle 的最短路径、所有路径与智能路径。最短路径与所有路径是自解释的。智能路径显示从直接需要的 bundle 到被选中插件的所有最短路径。图 3 显示了一个例子。
图 3. 依赖关系的智能路径视图
- 为了帮助插件开发人员跟踪并修复错误,增加一种错误报告功能,突出显示无法解析的 bundle 的路径(参见 图 4)。
图 4. 可视化的错误报告
- 搜索文本框可用于突出显示与特定字符串相匹配的所有插件。在这个例子中,所有包含字符串
org.eclipse.mylyn 的 bundle 都会突出显示。图 5 显示了一个例子。
图 5. 可视化搜索
- 屏幕截图工具可用于从插件依赖关系图中创建一个 PNG 文件(参见 图 6)。
图 6. 插件依赖关系图的快照
- 已经预先定义好几种缩放水平,可通过视图的上下文菜单进行设定(参见 图 7)。
图 7. 设置缩放水平
- 可以使用版本号切换向插件开发人员显示哪个特定 bundle 已被解析(参见 图 8)。
图 8. Bundle 版本号视图
- 查看选中插件的调用者与被调用者的选项,如 图 9 所示。
图 9. 显示调用者与被调用者
使用这些功能,可以借助 <application_install>/dropins 与 <application_install>/plugins 文件夹中的所有插件对在 <application_install>/dropins 文件夹中选择的插件(这里是 org.eclipse.emf.core)进行依赖关系检查,以报告错误。
Eclipse 团队所做的工作值得称赞,但这种功能还可以进一步扩展。工具每次显示一个插件的依赖关系,但正如我们在第一部分中讨论的那样,我们需要弄清楚我们功能中的所有插件与 bundle 是否均被完全解析。与逐个关注 bundle 相比,更有效的方式是给 Dependency Visualization 工具提供一个文件夹路径,并让它一次性检查该文件夹中所有 bundle 的依赖关系。
除此之外,该工具还会扫描在 MANIFEST.MF 的 必要的 Bundle 一节中所提及的插件的目标平台,然后报告缺少的插件。但是那些未解析的已导入包怎么办呢?
我们在 Eclipse PDE 项目的基础上编写了一小段代码来实现这些功能,从而让插件依赖关系分析变得更加简单。相关细节如下:
- 让我们重返至 2.1 节中完成的安装。要了解如何恢复到以前的 Eclipse 安装,请参考文档 http://help.eclipse.org/helios/index.jsp?topic=/org.eclipse.platform.doc.user/tasks/tasks-123.htm。
- 将本文提供的
org.eclipse.pde.visualization.dependency_1.0.0.jar文件复制到您的 Eclipse/plugins 目录中,然后重新启动 Eclipse(参见 下载)。
- 导航至
Window>Show View>;Other>Graph Plug-in Dependencies视图,或者按下 Ctrl+3,然后选择 Graph Plug-in Dependencies 视图以打开工具。
这允许验证指定文件中内的所有插件。这项功能可以节约时间,因为您不必右键单击然后再针对每个插件选择 Focus On…。未解析 bundle 的报告将被合并,并在一个位置集中显示。
注意:Plug-ins Location 下指定的文件夹中的插件也应该包含在活动的目标平台中(参见图 10)。
图 10. 设定插件位置
点击 Apply,超链接下应该会以红色显示一个未解析 bundle 的列表。图 11 显示检测出指定文件夹中最后一个 bundle 的依赖关系图存在 32 个错误。
图 11. 显示未解析 bundle 的数量
基本上,我们的代码是:
- 遍历了指定文件夹中的所有插件,
- 检查每个插件的依赖关系,并且
- 将所有未解析的依赖关系添加到 “检测出的错误” 内容中。
要查看每个插件的依赖关系图,使用右键菜单或工具栏上的 Back 和 Forward 选项(参见 图 12)。
图 12. 遍历元素树
其余的功能包括:
- 显示 bundle 版本
- 显示依赖关系路径
- 显示被调用者
- 显示调用者
工作方式与前面一样。
在 MANIFEST.MF 的 Dependencies 区域中的 Required
Plug-ins 或
Imported Packages 中均可指定一个 bundle 的依赖关系。只有当 "必需的插件" 与 “已导入包” 中提到的包均可用时,才能解析 bundle。Eclipse
PDE 项目只会报告缺少 “必需插件” 的错误,而会跳过报告未解析包的错误。
我们进一步进行修改,以便显示所选 bundle 的未解析导入包(带版本范围),请参见 图 13。
- 错误列表将首先显示所有缺少的 “必需插件”,然后显示未解析的包。
- 跳过可选导入。
图 13. 未解析的导入包错误
请注意,在使用 3.2 节中提及的功能时,指定文件夹中所有的插件错误报告仅包括缺少的 “必需插件”,而不包括未解析的导入包。
而缺少的导入细节则在单个插件层次上提供,可以通过使用右键菜单或工具栏上的 Back 与 Forward 选项进行查看。也可以做进一步的修改,将这种功能包括在文件夹层次上,并可将其扩展为生成一个全面的日志文件或者仅在控制台上显示。
在任何情况下,未解析的导入包只会显示在错误报告中(红色字样的链接),而不会显示在图中,因为工具不知道哪个插件将会导出这个未解析的包。
此外,其余的功能包括:
- 显示 bundle 版本,
- 显示依赖关系路径,
- 显示被调用者,以及
- 显示调用者,
工作方式与前面一样。
- 该工具只为插件而不为片段清单提供依赖关系分析。
- 它仅验证了一个特定插件和活动目标平台中提到的插件。工具不会建议解析缺少的必需插件或未解析导入。
- 代码已经经过 IBM JRE 1.5 版本的编译与测试。
本文展示了对 Eclipse PDE 提供的 Dependency Visualization 工具所做的一些修改,旨在提供一组视图来辅助完成插件依赖关系分析任务。特别是,当开发人员试图理解他们插件之间的依赖关系时,视图将为他们提供理论支持。
| 描述 | 名字 | 大小 | 下载方法 |
|---|---|---|---|
| org.eclipse.pde.visualization.dependency_1.0.0.jar | org.eclipse.pde.visualization.dependency_1.0.0.jar | 741KB | HTTP |
学习
- 所有 Eclipse IDE 项目相关的文章与指南:Eclipse IDE 开发的全面文章与教程列表。可以按照产品、标题、主题或关键字查看列表,并进行排序。
- 在 Twitter 上关注 developerWorks:关注我们的最新消息。
- developerWorks 演示中心:观看并了解 IBM 及开源技术和产品功能。
- 随时关注 developerWorks 技术活动和网络广播。
- 访问 developerWorks Open source 专区获得丰富的 how-to 信息、工具和项目更新以及最受欢迎的文章和教程,帮助您用开放源码技术进行开发,并将它们与 IBM 产品结合使用。
获得产品和技术
- Eclipse 的 Dependency Visualization 工具:从项目网页上下载工具。
- Eclipse
Marketplace:是一个便利门户,提供开放源码以及与 Eclipse 有关的商业性产品。如果通过程序包下载 Indigo 软件,则需要拥有通过 Eclipse Marketplace Client 访问。
- IBM 产品评估试用版软件 改进您的下一个开源开发项目,这些软件可以通过下载获取。
讨论
- 加入 developerWorks 中文社区,developerWorks 社区是一个面向全球 IT 专业人员,可以提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。
- 加入 IBM 软件下载与技术交流群组,参与在线交流。

