2

我正在编写一个在 OSGI 环境中运行的应用程序。现在我想提取一些代码并将其放在单独的 bundle/jar 文件中,以便在其他应用程序(OSGI 或非 OSGI)中重用它。

我的目标是删除对 OSGI 环境类的任何依赖项,因为它还应该在其他应用程序中运行,这些应用程序没有各种 OSGI 框架的所有 jar(例如 Equinox)。但同时,如果应用程序是 OSGI 应用程序,我想在 OSGI 环境中注册一个 OSGI 服务。

我已经分离了代码,目前唯一剩下的依赖于 OSGI 的代码是我的 Activator 类,它将一些类注册为 OSGI 服务:

context.registerService(MyServiceInterface.class.getName(), new MyServiceImpl(), new Hashtable());

为了消除依赖,我考虑了以下几点:

  • 我从 bundle1 中删除了 Activator 和 OSGI 依赖项
  • 我创建了另一个 bundle2,我在其中移动了 Activator

最后,我得到了我的 bundle1.jar,它只有一个 Manifest.mf 文件以使其支持 OSGI,但根据 OSGI 框架类,不再有代码。我有另一个包,它只属于我当前的应用程序,它导入 bundle1.jar 并且唯一的目的是使用激活器在 OSGI 容器上注册 MyService.class。

  1. 这种方法可以吗,还是有其他最佳实践?
  2. 在 OSGI 环境中注册服务是好的做法,还是主机应用程序始终应负责的事情?
4

4 回答 4

2

为什么不把激活器类留在你的包中。在非 OSGi 环境中运行时,不会调用激活器类。在 OSGi 环境中运行时,它会。将您的 OSGi 依赖项与激活器隔离是一个很好的策略。

于 2012-10-07T13:53:29.247 回答
1

在大多数情况下,您可以在没有 Activator 的情况下发布您的服务。查看OSGI 社区 WikiEquinox 示例

于 2012-10-07T13:23:24.390 回答
1

另一种方法是使用蓝图。至少在简单的情况下,它允许完全不依赖于 OSGi。对于现实世界的情况,您通常至少需要一些 OSGi API,但在非 OSGi 情况下让它们简单地处于非活动状态是没有问题的。

您可能还想尝试PojoSR。它允许在 OSGi 之外使用激活器和 OSGi 服务。我们开始在 Apache Camel 中使用它来测试 OSGi 代码。

于 2012-10-08T08:00:25.590 回答
1

使用 Spring-DM 将有助于消除对 OSGi 的代码依赖。您的捆绑包不需要激活器,并且可以从 spring-dm config xml 导出服务。但是,这确实添加了更多运行时依赖项,但不需要编译依赖项。

于 2012-10-11T05:11:30.627 回答