java - 强制导入 OSGi 包

标签 java dependencies osgi

tl;博士

我们有两组 bundle 。称它们为A 组B 组A 组 中的 bundle 必须仅从 A 组 中的其他 bundle 导入包,无论 B 组 中的某些 bundle 是否导出满足以下要求的包:的依赖性。 B 组 中的 bundle 可以解析来自任何 bundle 的包导入,无论它是在 A 组 还是 B 组 中。

更长的解释

我的团队正在尝试找到一种方法来为使用 OSGi 构建的产品强制执行一种“安全模式”。本质上,我们拥有自己的核心产品,并且我们允许客户在其上安装自己的组件来扩展我们的功能。显然,这就是 OSGi 的用途。

但是,我们注意到,如果客户安装的 bundle 恰好导出了我们的核心 bundle 之一使用的包,则核心 bundle 有可能会连接到第三方安装的某些东西。虽然我知道语义版本控制意味着这不是令人担忧的主要原因,但我们注意到,如果/当刷新某些第三方 bundle 时,我们的核心 bundle 的很大一部分会重新启动。

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

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

最佳答案

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

那么有多种可能性:

  • Resolve Hooks - 使用这些钩子(Hook),您可以隐藏 bundle ,并且很可能完全按照您想要的方式控制事物。
  • 安全性 - 通过安全管理器,您可以限制软件包导入和导出
  • 属性 – 使用魔法属性从核心导出包,并仅在设置该属性时导入。
  • 编织 – 有一个编织钩子(Hook),可以将不存在的包导入添加到每个非核心包中。初始化核心,用不存在的包合成一个 bundle 并安装/解决它。

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

关于java - 强制导入 OSGi 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37310236/

相关文章:

java - JNI 错误 : A class has been compiled by a more recent version of the Java Runtime

java - jdo/OSGi : error building JDO PersistenceManagerFactory after bundle update

java - 如何从非组件类中使用 OSGI 服务

java - hbm2ddl 模式导出不会导致使用 Spring Security 创建实体

java - 在不同的类中使用一个类的变量 : Java

windows - 为什么我的应用程序在另一台电脑上启动时崩溃?

java - 为什么要从 java.awt 中删除依赖项?

java - ActiveMQ 与 Apache Karaf 2.3.1

java - 将 Java 类转换为 Android

header - 处理 biicode 中 Unresolved 平台相关依赖项