2016-10-14 94 views
0

我在玩OSGi框架扩展束以充分理解它们。 在查看OSGi R6规范(3.15 and 4.2.4.1)后,我已成功调用ExtensionBundleActivator的“开始”方法。现在我试图在这种激活器内注册一个服务。但是,当我尝试使用此类服务​​时,引用注释无法连接服务。在OSGi扩展束中注册服务

这里是我的代码('已经改变了包的名称,但它不应该的问题):

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. 我使用的是菲利克斯作为OSGi实现;
  2. 两者“ExtensionBundleExample”和“BundleExample”被加载费利克斯(默认一个是“捆绑”的自动处理的文件夹内,但我调整了config.properties用“corebundles”文件夹;
  3. 输出corretly显示“开始扩展bundle激活器!“,但是当显示actualBundleExample的引用时,输出显示”null“;
  4. BundleExample的可选基数用于测试目的:我只是想调用消费者组件的”acivator“方法有(为了看到System.out.println控制台;
  5. 从我以前的question我知道扩展束是一个网络他在OSGi框架内部,但我想要理解他们:我发现互联网上关于这个主题的例子很少令人讨厌;

感谢您的回复!

回答

2

扩展包的主要用途是用于框架扩展,绝对不是用于常规用法。即扩展捆绑通常紧密耦合到框架。原因在于许多规则不包括扩展包,因为它们位于围栏的“错误”一侧。有很少的例子有很好的理由。除非你真的知道你在做什么,否则你不应该使用它们,因为大部分OSGi规则都不适用。

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

你可以通过让框架导出这个包来解决这个问题。

只是一个猜测。

+0

在Felix config.properties条目“org.osgi.framework.system.packages.extra”中添加“com.massimobono.bundleexample”解决了问题。十分感谢! (顺便说一下,除此之外,我还需要不包含从框架中部署的包中提供“com.massimobono.bundleexample”的包......哦!) – Koldar