【问题标题】:OSGi service reference is null (service from launcher to bundle)OSGi 服务引用为空(从启动器到捆绑的服务)
【发布时间】:2014-05-22 05:37:15
【问题描述】:

我需要将一些参数从 felix 启动器类(主)传递到捆绑包,我关注了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());

但我进入了激活器

java.lang.NullPointerException:指定的服务引用不能 空。

有什么问题?又是不同的类加载器?还是什么?

【问题讨论】:

    标签: java osgi apache-felix


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢!!!我想这就是我要找的。我不确定一个界面的两个副本是否相同,这就是为什么在我的问题中我描述了这些包。有时间可以看看stackoverflow.com/questions/22963720/…吗?
    猜你喜欢
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多