执行OSGi包导入

时间:2016-05-18 21:16:36

标签: java dependencies osgi

TL;博士

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

更长的解释

我的团队正试图找到一种方法来强制执行某种安全模式"对于使用OSGi构建的产品。基本上我们拥有我们的核心产品,我们允许客户在顶部安装自己的组件以扩展我们的功能。显然,这是OSGi的用途。

但是,我们注意到,如果客户安装了一个捆绑包,该捆绑包恰好导出了我们的某个核心捆绑包使用的包,则核心捆绑包可能会连接到第三方安装的东西。虽然我理解语义版本控制意味着这不是引起关注的主要原因,但我们注意到,如果/当某些第三方软件包被刷新时,我们的大部分核心软件包都会重新启动。

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

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

1 个答案:

答案 0 :(得分:1)

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

然后有很多可能性:

  • 解决挂钩 - 使用这些挂钩,您可以隐藏捆绑包,并且很可能完全按照您的意愿控制事物。
  • 安全性 - 使用安全管理器,您可以限制包导入和导出
  • 属性 - 使用magic属性从核心导出包,并仅在设置该属性时导入。
  • 编织 - 拥有一个编织钩子,可以将不存在的包导入添加到每个非核心束。初始化核心,使用不存在的包合成一个包并安装/解析它。

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