java - OSGi 服务引用为空(从启动器到 bundle 的服务)

标签 java osgi apache-felix

我需要将一些参数从 felix 启动器类(主要)传递到 bundle,我遵循了 this advice .我做了什么

启动器项目
test.launcher包包含:Main.java,Temp.java,TempI.java

捆绑项目
test.bundle包包含:Activator.java
test.launcher 包包含:TempI.java

如您所见,我将 TempI.java 复制到捆绑项目,因为启动器未捆绑并且无法导出其包。

主要

BundleContext context = felix.getBundleContext();
ServiceRegistration serviceRegistration=context.registerService(TempI.class.getName(),  new Temp(), null);

在激活器中

ServiceReference serviceReference = context.getServiceReference(TempI.class.getName());
TempI service = (TempI) context.getService(serviceReference); 
System.out.println(service.testService());

但我进入了Activator

java.lang.NullPointerException: Specified service reference cannot be null.

问题是什么?又是不同的类加载器?或者什么?

最佳答案

您声明启动器和包都包含它们自己的 TempI 类副本。一个由启动器的类加载器加载,另一个由 bundle 的类加载器加载。对于 VM 和 OSGi 服务注册表,这些是不同的类对象。因此,当您捆绑查找属于您的 bundle 已知的 TempI 类的 TempI 服务时,它找不到。

您不需要将 TempI 放入包中,而是导入包。您还需要配置框架以使用 org.osgi.framework.system.packages.extra 导出包.然后你的 bundle 将从系统 bundle 中导入包,并且在启动器中注册的服务将对 bundle 可见。

关于java - OSGi 服务引用为空(从启动器到 bundle 的服务),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22955417/

相关文章:

java - Solr 如何使用邻近搜索和通配符进行 eDisMax 查询?

java - GSON:无知地将 JSON 转换为对象

java - 如何在servlet java中获取客户端公共(public)IP地址

struts2 - 非 osgi 与 osgi 包交互

java - 使用@Reference 注释在运行时动态选择服务实现?

java - 在 catch block 中使用通用异常是否有任何负面影响

maven - 将不同包中的 ServletContainerInitializers 打包到单个 OSGi 包中

java - 创建需要用户参数的 OSGI 服务

java - Apache Felix SCR @Reference 速查表

java - OSGi 应用程序内部的 REST 客户端