强制执行 OSGi 包导入

Enforcing OSGi package imports

tl;dr

我们有两组捆绑包。称他们为 Group AGroup BGroup A 中的包必须仅从 Group A 中的其他包导入包,无论 Group B 中的某些包是否导出可以满足依赖性的包。 Group B 中的包可以从任何包中解析它们的包导入,无论它是在 Group A 还是 Group B.

更长的解释

我的团队正试图找到一种方法来为使用 OSGi 构建的产品强制执行某种 "safe mode"。本质上我们有我们的核心产品,我们允许客户在上面安装他们自己的组件来扩展我们的功能。显然,这就是 OSGi 的用途。

但是,我们注意到,如果客户安装的捆绑包恰好导出我们的核心捆绑包之一使用的软件包,则核心捆绑包有可能连接到第三方安装的东西.虽然我知道语义版本控制意味着这不是引起关注的主要原因,但我们注意到我们的核心捆绑包的很大一部分已重新启动 if/when 一些第三方捆绑包已刷新。

我们想要做的是确保我们核心产品中的捆绑包不会连接到第三方安装的任何捆绑包。我们正在使用捆绑包启动级别将我们的核心捆绑包设置为第三方捆绑包之前的开始级别。这让我们可以设置框架启动级别,以在我们需要调试第三方代码问题时排除核心之后的所有包。但是,仅启动级别不足以阻止包级依赖项连接到我们的核心组件。

我能想到的唯一方法(我不认为这是一个好的解决方案,我们也没有计划实施)是在我们的核心之后维护一个添加到运行时的所有第三方包的列表产品已设置。然后,当框架关闭时,卸载此列表中的所有包(备份实际的包文件)。在启动时,核心产品会启动并正确连接,然后我们会自动重新安装所有已安装的第三方捆绑包。这对我来说就像是一种 非常 脆弱、笨拙且完全错误的实现我们想要的方法,但我想不出任何其他方法。所以我转向 SO 社区寻求帮助!

如果您围绕服务开发了系统,那么有时最好的方法是启动另一个框架,运行 另一个框架中的客户代码。如果您更偏向于经典 Java,那么这通常工作量太大了。

那么有几种可能:

  • Resolve Hooks – 使用这些 hooks,您可以隐藏捆绑包,并且很可能完全按照您的意愿控制事情。
  • 安全 – 使用安全管理器,您可以限制包的导入和导出
  • 属性 – 从具有魔法属性的核心导出包,仅在设置该属性时导入。
  • Weaving – 有一个 weaving 钩子,可以将不存在的包导入添加到每个非核心包中。初始化核心,用不存在的包和 install/resolve 合成一个包。

显然,Resolve Hooks 和 Weaving 都要求您的包很早就 运行。如果您使用 Bndtools 启动器,那么有一种方法可以做到这一点。