Require-Bundle和Import-Package与feature.xml需要

Rob*_*anu 7 eclipse eclipse-plugin eclipse-rcp

在构建包含多个插件和一个功能的Eclipse插件(lato sensu)时,我有两种指定依赖关系的方法:

  • 在插件本身,使用Require-BundleImport-PackageMETA-INF/MANIFEST.MF;
  • feature.xml该功能的文件中.

在我的理解中,应该足够在较低级别,在插件中声明依赖项.为什么我们仍然有这个feature.xml requires机制?


更新:Eclipse帮助中的feature.xml描述

Kon*_*hik 6

将特征到特征的依赖性机制归类为遗留是不正确的.虽然随着p2的出现确实存在,但是将安装通过bundle manifest Require-Bundle或Import-Package指定的依赖关系,结果可能不是您所期望的.

考虑您正在构建JDT扩展的情况.假设您只依赖于JDT核心API(没有UI扩展).如果您只依赖OSGi依赖项,那么在安装插件时,p2将尽职尽责地安装JDT核心软件包,而不是UI软件包.从OSGi的角度来看非常好,但可能不是你想要的.

我建议坚持使用功能导入来描述您的高级依赖项,以确保它们已完整安装.仅依赖于OSGi依赖项最适合自由浮动的bundle,这些bundle不是应该作为一个单元安装的更大的东西的一部分.


Kan*_*ane 5

Eclipse 特性是管理插件的概念,以提供更高的抽象。

例如,C/C++ 开发工具有二十多个插件,因此 CDT 有几个功能可以将这些插件组织在更高级别的抽象中,用于核心功能、ui、构建等。

它还有助于简化安装过程,用户只需要知道 CDT 的顶级功能(带有友好名称)即可。P2 API 或经典安装管理器可以找到顶级功能包括的插件和子功能,然后安装它们。

但是功能不能帮助您创建高模块系统,因为它本身不提供任何功能。它不是 OSGi 规范的一部分,它继承自 Eclipse 2.x 甚至更旧的版本。

Bundle是 OSGi 的基本要素。根据规范,除了用类包声明连线外,任何包都不能使用其他类。Require-Bundle 和 Import-Package 是创建连线的方法。

总之一句话,特性和插件是完全不同的概念。与捆绑包的导入包相比,包括插件在内的功能正在做不同的事情。

更新:

feature.xml 的 requires 标签是遗留的。目的是定义此功能与其他插件/功能的依赖项,以帮助更新管理器在安装或更新该功能时找到损坏的依赖项。它确实定义了该功能与其他插件的依赖关系,但它被更新管理器用于安装或更新。包的导入包声明了你的包和 OSGi 系统中的另一个模块之间的实际和真实的依赖关系。

由于 Eclipse 使用 p2 作为配置管理器,因此没有必要在您的 feature.xml 中声明“requires”标签。P2 会识别你的包和其他由“Import-Package”或“Require-Bundle”声明的模块之间的依赖关系。如果不满足任何依赖项,P2 将不会安装或更新您的功能。