java - 构建一个可以在 OSGI 和非 OSGI 环境中工作的库的好方法是什么?

标签 java osgi equinox

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

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

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

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

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

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

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

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

最佳答案

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

关于java - 构建一个可以在 OSGI 和非 OSGI 环境中工作的库的好方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12768989/

相关文章:

java - 当我按 ID 获取行时如何修复 'Incorrect result size: expected 1, actual 0'?

java - 如何取消注册 OSGi 服务

java - 是否有更详细或可自定义的 OSGi 命令帮助页面?

java - 在 OSGI 应用程序中提供 EntityManager 的最佳实践

java - 运行多个 Equinox OSGi 框架

java - spring mvc - 检查您所在页面并更改菜单项样式的最简单方法

java - 为什么 ScheduledExecutorService 不打印堆栈跟踪?

java - Wildfly 16,注释@JsonIgnore不起作用

java - 在 OSGi 应用程序中获取 Eclipse 项目信息

java - nexus 3 是否仍支持 osgi bundle 存储库 (obr)?