Java OSGi服务引用为null(从启动器到捆绑包的服务)

Java OSGi服务引用为null(从启动器到捆绑包的服务),java,osgi,apache-felix,Java,Osgi,Apache Felix,我需要将一些参数从felix launcher类(Main)传递到bundle,然后我就这样做了。我所做的 启动器项目 test.launcher包包含:Main.java、Temp.java、TempI.java 捆绑项目 test.bundle包包含:Activator.java test.launcher包包含:TempI.java 正如您所见,我将TempI.java复制到bundle项目中,因为launcher不是bundle,无法导出其包 大体上 BundleContext cont

我需要将一些参数从felix launcher类(Main)传递到bundle,然后我就这样做了。我所做的

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

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

正如您所见,我将TempI.java复制到bundle项目中,因为launcher不是bundle,无法导出其包

大体上

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());
但我进入激活器

ServiceReference serviceReference = context.getServiceReference(TempI.class.getName());
TempI service = (TempI) context.getService(serviceReference); 
System.out.println(service.testService());
java.lang.NullPointerException:无法创建指定的服务引用 空


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

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


您不需要将TempI放入包中,而是导入包。您还需要配置框架以使用导出包。然后,您的捆绑包将从系统捆绑包导入包,并且在启动器中注册的服务将对捆绑包可见。

非常感谢!!!我想这就是我要找的。我不确定一个接口的两个副本是否相同,这就是为什么在我的问题中我描述了这些包。如果你有时间,你能看看吗?