在OSGi扩展束中注册服务

时间:2016-10-14 09:39:33

标签: java osgi osgi-fragment

我正在使用OSGi框架扩展包来完全理解它们。 在查看了OSGi R6规范(3.15 and 4.2.4.1)后,我成功地调用了" start" ExtensionBundleActivator的方法。现在我试图在这样的激活器中注册一个服务。但是,当我尝试使用此类服务​​时,引用注释无法连接该服务。

这是我的代码(已经更改了捆绑包的名称,但这不重要):

public class ExtensionBundleActivator implements BundleActivator {

    @Override
    public void start(BundleContext context) throws Exception {
        System.out.println("start extension bundle activator!");

        context.registerService(
            BundleExample.class.getName(),
            new BundleExampleImpl(),
            new Hashtable<>(new HashMap<>()));
    }

    @Override
    public void stop(BundleContext context) throws Exception {
        //service automatically unregistered
    }

}

这是扩展包的清单:

Manifest-Version: 1.0
Bnd-LastModified: 1476436248622
Build-Jdk: 1.8.0_91
Built-By: massi
Bundle-ClassPath: .
Bundle-ManifestVersion: 2
Bundle-Name: extensionbundleexample
Bundle-SymbolicName: com.massimobono.microsi.extensionbundleexample
Bundle-Version: 0.0.1.SNAPSHOT
Conditional-Package: com.massimobono.microsi.common.*;
Created-By: Apache Maven Bundle Plugin
ExtensionBundle-Activator: com.massimobono.microsi.bundleexample.imp
 l.ExtensionBundleActivator
Fragment-Host: system.bundle; extension:=framework
Provide-Capability: osgi.service;objectClass:List<String>="com.massimobo
 no.microsi.bundleexample.BundleExample"
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.8))"
Service-Component: OSGI-INF/com.massimobono.microsi.bundleexample.im
 pl.ExtensionBundleExample.xml
Tool: Bnd-3.0.0.201509101326

消费捆绑(捆绑的一部分):

@Reference(cardinality=ReferenceCardinality.OPTIONAL)
public BundleExample actualBundleExample;

@Activate
public void activate() {
    System.out.println("activating " + this.getClass().getSimpleName() + "with actual bundle set to "+ this.actualBundleExample);
}

我的问题是:我做错了什么?为什么消费者无法检测到扩展束的注册服务?或者我可能只是做了框架禁止的事情......在这种情况下,是否无法从扩展包中提供服务?如何与扩展束中的代码进行交互(也就是访问扩展束本身内部的内容)?

这里有一些注意事项:

  1. 我使用felix作为OSGi实现;
  2. &#34; ExtensionBundleExample&#34;和&#34; BundleExample&#34;加载到felix的自动进程文件夹中(默认值为&#34; bundle&#34;但我调整了config.properties以使用&#34; corebundles&#34;文件夹;
  3. 输出正确显示&#34;启动扩展束激活器!&#34;但是当它显示actualBundleExample的引用时,输出会显示&#34; null&#34;;
  4. BundleExample的可选基数用于测试目的:我只是想调用&#34; acivator&#34;消费者组件具有的方法(以便查看System.out.println控制台;
  5. 来自我以前的question我理解扩展捆绑包是OSGi框架内的一个利基,但我仍然想要理解它们:我发现互联网上关于这个主题的例子很缺乏令人讨厌;
  6. 感谢您的回复!

1 个答案:

答案 0 :(得分:2)

扩展束的主要目的是用于框架扩展,绝对不是常规用法。即扩展束通常与框架紧密耦合。原因是许多规则不计入扩展捆绑包,因为它们是在错误的&#34;围栏的一侧。出于很好的理由,很少有例子。你不应该使用它们,除非你真的知道你正在做什么,因为大多数OSGi规则都不适用。

那就是说。我的期望是您用于BundleExample的包在扩展包(来自类路径)和某些包导出的DS示例之间有所不同。由于它们来自不同的类加载器,因此OSGi认为它们是不同的服务,因为当您尝试使用它时会遇到类加载器异常。

您可以通过让框架导出此包来解决此问题。

只是一个猜测。