【发布时间】:2024-01-14 18:12:01
【问题描述】:
我正在使用 OSGi 框架扩展包以便完全理解它们。
在查看了 OSGi R6 规范 (3.15 and 4.2.4.1) 之后,我成功地调用了 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);
}
我的问题是:我做错了什么?为什么消费者检测不到扩展包的注册服务?或者,也许我只是在做框架禁止的事情……在这种情况下,不可能从扩展包中提供服务吗?如何与扩展包中的代码进行交互(也就是访问扩展包本身的内容)?
这里有一些注意事项:
- 我使用 felix 作为 OSGi 实现;
- “ExtensionBundleExample”和“BundleExample”都加载到 felix 的自动进程文件夹中(默认是“bundle”,但我调整了
config.properties以使用“corebundles”文件夹; - 输出正确显示“启动扩展捆绑激活器!”但是当显示
actualBundleExample的引用时,输出显示“null”; - BundleExample 的可选基数用于测试目的:我只是想调用消费者组件具有的“激活器”方法(以便查看
System.out.println控制台; - 从我之前的 question 中我了解到扩展包是 OSGi 框架中的一个小众市场,但我仍然想了解它们:我发现互联网上缺乏关于这个主题的示例非常烦人;
感谢您的回复!
【问题讨论】:
标签: java osgi osgi-fragment