在构建包含多个插件和一个功能的Eclipse插件( lato sensu )时,我有两种指定依赖关系的方法:
Require-Bundle
中的Import-Package
和META-INF/MANIFEST.MF
; feature.xml
文件中的在我的理解中,应该足够在插件中声明较低级别的依赖关系 ie。。为什么我们仍然拥有feature.xml
requires
机制?
答案 0 :(得分:6)
将功能到功能的依赖关系机制归类为旧版是不正确的。虽然随着p2的出现确实存在,但是将安装通过bundle manifest Require-Bundle或Import-Package指定的依赖关系,结果可能不是您所期望的。
考虑您正在构建JDT扩展的情况。假设您只依赖于JDT核心API(没有UI扩展)。如果您只依赖OSGi依赖项,那么在安装插件时,p2将尽职尽责地安装JDT核心软件包,而不是UI软件包。从OSGi的角度来看非常好,但可能不是你想要的。
我建议坚持使用功能导入来描述您的高级依赖项,以确保它们已完整安装。仅依赖于OSGi依赖项最适合自由浮动的bundle,这些bundle不属于应该作为一个整体安装的更大的东西。
答案 1 :(得分:3)
Eclipse功能是管理插件以提供更高摘要的概念。
例如,C / C ++开发工具有二十多个插件,因此CDT有几个功能可以用更高级别的抽象,核心功能,ui,构建等来组织这些插件。
它还有助于简化安装过程,用户只需要知道CDT的顶级功能(带有友好名称)。 P2 API或经典安装管理可以找到插件和子功能,包括顶部功能,然后安装它们。
但是功能无法帮助您创建高模块系统,因为它本身不提供任何功能。它不是OSGi规范的一部分,它继承自Eclipse 2.x甚至旧版本。
捆绑是OSGi必不可少的。根据规范,除了使用类包声明电线之外,任何包都不能使用其他类。 Require-Bundle和Import-Package是创建连线的方法。
简而言之,功能和插件是完全不同的概念。与包的Import-Package相比,包含插件的功能正在做不同的事情。
<强>更新强>
feature.xml的requires标签是遗留的。打算定义此功能与其他插件/功能的依赖关系,以帮助更新管理器在安装或更新该功能时查找损坏的依赖项。它确实定义了该功能与其他插件的依赖关系,但更新管理器使用它来安装或更新。 Import-Package of bundle声明捆绑包与OSGi系统中另一个模块之间的实际和真实依赖关系。
由于eclipse使用p2作为配置管理器,因此没有必要在feature.xml中声明'requires'标记。 P2将识别您的包与“Import-Package”或“Require-Bundle”声明的其他模块之间的依赖关系。如果不满足任何依赖性,P2将不会安装或更新您的功能。