跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

依赖关系的可视化

寻找缺失的环节

Nikhil Mayaskar, 软件工程师, IBM
Nikhil Mayaskar 照片
Nikhil Mayaskar 在 Pune 的 IBM India Software Labs 的 IBM Cognos 团队工作。他的专业和兴趣领域是 Java、J2EE、OSGi 和 Web 技术。他撰写了大量的 developerWorks 文章和 IBM Redpapers。在空闲时间,他喜欢听音乐。Nikhil 拥有印度 IT-BHU 的电子工程学士学位。
Amit Mittal, 技术团队负责人,问题管理, IBM
Amit Mittal 的照片
Amit Mittal 在 Pune 的 IBM India Software Labs 的 IBM Cognos 团队工作。他的专业领域涉及 Java、J2EE、OSGi 与各种其他的开发工具。Amit 在 2002 年获得了计算机应用的硕士学位,拥有 9 年以上的软件开发经验。在空闲时间,他喜欢看电影,听音乐,并努力在科学与技术方面寻求提高。

简介: 在 OSGi 框架中,bundle 清晰地指定了它们所提供和需要的依赖关系,但手动找出这些依赖关系却相当困难。此时,依赖关系可视化工具就派上了用场。

发布日期: 2011 年 12 月 22 日
级别: 初级 原创语言: 英文
访问情况 : 1668 次浏览
评论: 


缺失的环节,了解问题

有多少次在将您定制的 Eclipse 插件或功能导出至另一个基于 Eclipse 的应用程序之后,它们出现故障?

在新环境中找出并满足所有的插件依赖关系这一流程得到了简化。过去必须手动验证插件,但如今,Eclipse 的 Dependency Visualization 工具(属于 Eclipse Incubator 项目的一部分)可以消除或减少这种需求。我们将详细探讨问题,考察可用的解决方案,并考虑可能要进行的修改,从而让插件依赖关系分析任务变得更加简单。

OSGi 的优势

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 时。

没什么好害怕的(还没到时候),让我们继续看下一部分内容。

解决方案(不是很完善)

我们可以通过很多方式看似合理地解决这个问题:

  1. <Application Executable> -clean -console
    					

    运行 OSGi 控制台的同时启动应用程序
  2. 逐个搜索未解决插件的依赖关系

如果您足够幸运,可以看到一条简单的错误消息,比如 "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 或更高版本的依赖关系图。

设置与使用

  1. 使用 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 的视图
    屏幕截屏显示 Plug-in Dependencies 视图以及搜索窗口

  2. 导航至 Window>Preferences>Plug-in Development>Target Platform 并选择 Eclipse 目标平台为包括来自 <application_install>/dropins <application_install>/plugins 的插件,然后将它设置为激活。点击 Apply(参见 图 2)。

    图 2.
    屏幕截屏显示目标平台视图中选中的 AUT_dropins_plugins 选项

  3. 右键单击并选择 Focus On。在 dropins 下选择您想要查看其依赖关系图的插件。这里我们选择 org.eclipse.emf.core

    控制面板中已经添加了三种依赖关系分析工具。如果选择一个 bundle,可以突出显示此 bundle 的最短路径、所有路径与智能路径。最短路径与所有路径是自解释的。智能路径显示从直接需要的 bundle 到被选中插件的所有最短路径。图 3 显示了一个例子。



    图 3. 依赖关系的智能路径视图
    屏幕截图显示一系列带有各种不同依赖关系标签的彩色方框。红色箭头源于该突出显示的元素并指向所有的依赖关系和分支。

  4. 为了帮助插件开发人员跟踪并修复错误,增加一种错误报告功能,突出显示无法解析的 bundle 的路径(参见 图 4)。

    图 4. 可视化的错误报告
    屏幕截图显示了一个带有 'Unresolved Bundle: B' and 'Unresolved Bundle: D' 警告的对话框的错误示例。 该对话框视图上有带红色 X 错误框。

  5. 搜索文本框可用于突出显示与特定字符串相匹配的所有插件。在这个例子中,所有包含字符串 org.eclipse.mylyn 的 bundle 都会突出显示。图 5 显示了一个例子。

    图 5. 可视化搜索
    屏幕截图显示了一个带有许多依赖关系的复杂项目。在顶端的搜索框输入 'org.eclipse.mylyn',在视图中显示相匹配的一 些黄色高显方框。

  6. 屏幕截图工具可用于从插件依赖关系图中创建一个 PNG 文件(参见 图 6)。

    图 6. 插件依赖关系图的快照
    屏幕截图显示了依赖关系图快照的预览

  7. 已经预先定义好几种缩放水平,可通过视图的上下文菜单进行设定(参见 图 7)。

    图 7. 设置缩放水平
    屏幕截屏显示其中缩放水平器打开的依赖关系图。缩放水平的范围从页面大小到放大 400%。

  8. 可以使用版本号切换向插件开发人员显示哪个特定 bundle 已被解析(参见 图 8)。

    图 8. Bundle 版本号视图
    屏幕截屏显示了依赖关系图。每个元素均有一个显示名字的版本号。

  9. 查看选中插件的调用者与被调用者的选项,如 图 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 项目的基础上编写了一小段代码来实现这些功能,从而让插件依赖关系分析变得更加简单。相关细节如下:

设置与使用

  • 将本文提供的 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. 设定插件位置
屏幕截图显示将插件位置设定至 'c:\Program Files\IBM\AUT\dropins'

点击 Apply,超链接下应该会以红色显示一个未解析 bundle 的列表。图 11 显示检测出指定文件夹中最后一个 bundle 的依赖关系图存在 32 个错误。


图 11. 显示未解析 bundle 的数量
屏幕截图显示了依赖关系图。 在 org.hamcrest 名字旁边有红色链接显示 '检查出 32 个错误'

基本上,我们的代码是:

  1. 遍历了指定文件夹中的所有插件,
  2. 检查每个插件的依赖关系,并且
  3. 将所有未解析的依赖关系添加到 “检测出的错误” 内容中。

要查看每个插件的依赖关系图,使用右键菜单或工具栏上的 BackForward 选项(参见 图 12)。


图 12. 遍历元素树
屏幕截图显示了一个依赖关系树以及打开的文本菜单,可使用菜单上有 Back 和 Forward 选项来查看树

其余的功能包括:

  • 显示 bundle 版本
  • 显示依赖关系路径
  • 显示被调用者
  • 显示调用者

工作方式与前面一样。

报告未解析的导入包错误

在 MANIFEST.MF 的 Dependencies 区域中的 Required Plug-insImported Packages 中均可指定一个 bundle 的依赖关系。只有当 "必需的插件" 与 “已导入包” 中提到的包均可用时,才能解析 bundle。Eclipse PDE 项目只会报告缺少 “必需插件” 的错误,而会跳过报告未解析包的错误。

我们进一步进行修改,以便显示所选 bundle 的未解析导入包(带版本范围),请参见 图 13

  • 错误列表将首先显示所有缺少的 “必需插件”,然后显示未解析的包。
  • 跳过可选导入。

图 13. 未解析的导入包错误
屏幕截屏显示了一个依赖关系图和显示每个错误的扩展错误列表。

请注意,在使用 3.2 节中提及的功能时,指定文件夹中所有的插件错误报告仅包括缺少的 “必需插件”,而不包括未解析的导入包。

而缺少的导入细节则在单个插件层次上提供,可以通过使用右键菜单或工具栏上的 BackForward 选项进行查看。也可以做进一步的修改,将这种功能包括在文件夹层次上,并可将其扩展为生成一个全面的日志文件或者仅在控制台上显示。

在任何情况下,未解析的导入包只会显示在错误报告中(红色字样的链接),而不会显示在图中,因为工具不知道哪个插件将会导出这个未解析的包。

此外,其余的功能包括:

  • 显示 bundle 版本,
  • 显示依赖关系路径,
  • 显示被调用者,以及
  • 显示调用者,

工作方式与前面一样。


限制与常见错误

  • 该工具只为插件而不为片段清单提供依赖关系分析。
  • 它仅验证了一个特定插件和活动目标平台中提到的插件。工具不会建议解析缺少的必需插件或未解析导入。
  • 代码已经经过 IBM JRE 1.5 版本的编译与测试。

结束语

本文展示了对 Eclipse PDE 提供的 Dependency Visualization 工具所做的一些修改,旨在提供一组视图来辅助完成插件依赖关系分析任务。特别是,当开发人员试图理解他们插件之间的依赖关系时,视图将为他们提供理论支持。



下载

描述名字大小下载方法
org.eclipse.pde.visualization.dependency_1.0.0.jarorg.eclipse.pde.visualization.dependency_1.0.0.jar741KBHTTP

关于下载方法的信息


参考资料

学习

获得产品和技术

讨论

作者简介

Nikhil Mayaskar 照片

Nikhil Mayaskar 在 Pune 的 IBM India Software Labs 的 IBM Cognos 团队工作。他的专业和兴趣领域是 Java、J2EE、OSGi 和 Web 技术。他撰写了大量的 developerWorks 文章和 IBM Redpapers。在空闲时间,他喜欢听音乐。Nikhil 拥有印度 IT-BHU 的电子工程学士学位。

Amit Mittal 的照片

Amit Mittal 在 Pune 的 IBM India Software Labs 的 IBM Cognos 团队工作。他的专业领域涉及 Java、J2EE、OSGi 与各种其他的开发工具。Amit 在 2002 年获得了计算机应用的硕士学位,拥有 9 年以上的软件开发经验。在空闲时间,他喜欢看电影,听音乐,并努力在科学与技术方面寻求提高。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Open source
ArticleID=782421
ArticleTitle=依赖关系的可视化
publish-date=12222011

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。