Java OSGI:通过systemBundle在OSGI容器外使用服务
我有一些不是osgi包的jar文件。让我们称之为starter.jar。我以这种方式运行这个启动器:java-jarstarter.jar。此初学者启动felix框架:Java OSGI:通过systemBundle在OSGI容器外使用服务,java,osgi,apache-felix,Java,Osgi,Apache Felix,我有一些不是osgi包的jar文件。让我们称之为starter.jar。我以这种方式运行这个启动器:java-jarstarter.jar。此初学者启动felix框架: Felix felix = new Felix(configMap); systemBundle=felix.getBundle(); 然后安装并启动osgi捆绑包,导出一些服务 所以starter在osgi容器之外,但是它引用了systemBundle。在starter.jar中使用一些osgi服务是否可能且正常(安全) 编
Felix felix = new Felix(configMap);
systemBundle=felix.getBundle();
然后安装并启动osgi捆绑包,导出一些服务
所以starter在osgi容器之外,但是它引用了systemBundle。在starter.jar中使用一些osgi服务是否可能且正常(安全)
编辑
现在我知道这是可能的,因为我有工作解决方案(来自starter.jar的代码):
由于不同的类加载器,我不得不使用反射,因为我得到了ClassCastException。最终的解决方案相当丑陋。也许有人会提供更好的方法。或者除了通过网络套接字之外没有其他方法?有两条重要规则适用:
第二条规则意味着,当您想要在系统包和普通包之间与服务通信时,必须将API包放在系统包的类路径上,并使用
org.osgi.framework.system.packages.extra
导出。然后,普通包以正常方式导入包。无论系统包是服务的提供者还是使用者,您都必须这样做。有两条重要规则适用:
第二条规则意味着,当您想要在系统包和普通包之间与服务通信时,必须将API包放在系统包的类路径上,并使用
org.osgi.framework.system.packages.extra
导出。然后,普通包以正常方式导入包。无论系统包是服务的提供者还是使用者,您都必须这样做。您可以将包含服务接口的包添加到嵌入式OSGi容器的系统包中。在这种情况下,您可以无反射地使用该服务。@Balazs Zsoldos我会试试。这似乎是个好主意。您可以将包含服务接口的包添加到嵌入式OSGi容器的系统包中。在这种情况下,您可以无反射地使用该服务。@Balazs Zsoldos我会试试。这似乎是个好主意。
BundleContext bundleContext=systemBundle.getBundleContext();
ServiceReference reference = bundleContext.getServiceReference(Temp.class.getName());
Object server = (Object) bundleContext.getService(reference);
Method method = server.getClass().getMethod("getString");
Object result=method.invoke(server);