Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OSGI:通过systemBundle在OSGI容器外使用服务_Java_Osgi_Apache Felix - Fatal编程技术网

Java OSGI:通过systemBundle在OSGI容器外使用服务

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服务是否可能且正常(安全) 编

我有一些不是osgi包的jar文件。让我们称之为starter.jar。我以这种方式运行这个启动器:java-jarstarter.jar。此初学者启动felix框架:

Felix felix = new Felix(configMap);
systemBundle=felix.getBundle();
然后安装并启动osgi捆绑包,导出一些服务

所以starter在osgi容器之外,但是它引用了systemBundle。在starter.jar中使用一些osgi服务是否可能且正常(安全)

编辑 现在我知道这是可能的,因为我有工作解决方案(来自starter.jar的代码):


由于不同的类加载器,我不得不使用反射,因为我得到了ClassCastException。最终的解决方案相当丑陋。也许有人会提供更好的方法。或者除了通过网络套接字之外没有其他方法?

有两条重要规则适用:

  • 服务的提供者和使用者都必须从相同的导出导入API包(即定义服务接口的包)。这可以通过几种方式进行安排。从第三个API包导入提供者和使用者。。。或者提供者可以导出包,消费者可以从中导入。。。或者(很少)消费者可以导出包,而提供者可以导入包

  • 系统包无法从普通包导入包。它只能出口


  • 第二条规则意味着,当您想要在系统包和普通包之间与服务通信时,必须将API包放在系统包的类路径上,并使用
    org.osgi.framework.system.packages.extra
    导出。然后,普通包以正常方式导入包。无论系统包是服务的提供者还是使用者,您都必须这样做。

    有两条重要规则适用:

  • 服务的提供者和使用者都必须从相同的导出导入API包(即定义服务接口的包)。这可以通过几种方式进行安排。从第三个API包导入提供者和使用者。。。或者提供者可以导出包,消费者可以从中导入。。。或者(很少)消费者可以导出包,而提供者可以导入包

  • 系统包无法从普通包导入包。它只能出口


  • 第二条规则意味着,当您想要在系统包和普通包之间与服务通信时,必须将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);