我在玩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);
}
我的问题是:我是什么做错了?为什么消费者无法检测到扩展包的注册服务?或者,也许我只是在做一些框架禁止的东西...在这种情况下,不可能从扩展包提供服务?我如何与扩展包中的代码进行交互(也就是访问扩展包本身内的某些东西)?
这里的一些注意事项:
- 我使用的是菲利克斯作为OSGi实现;
- 两者“ExtensionBundleExample”和“BundleExample”被加载费利克斯(默认一个是“捆绑”的自动处理的文件夹内,但我调整了
config.properties
用“corebundles”文件夹; - 输出corretly显示“开始扩展bundle激活器!“,但是当显示
actualBundleExample
的引用时,输出显示”null“; - BundleExample的可选基数用于测试目的:我只是想调用消费者组件的”acivator“方法有(为了看到
System.out.println
控制台; - 从我以前的question我知道扩展束是一个网络他在OSGi框架内部,但我想要理解他们:我发现互联网上关于这个主题的例子很少令人讨厌;
感谢您的回复!
在Felix config.properties条目“org.osgi.framework.system.packages.extra”中添加“com.massimobono.bundleexample”解决了问题。十分感谢! (顺便说一下,除此之外,我还需要不包含从框架中部署的包中提供“com.massimobono.bundleexample”的包......哦!) – Koldar