我正在使用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);
}
我的问题是:我做错了什么?为什么消费者无法检测到扩展束的注册服务?或者我可能只是做了框架禁止的事情......在这种情况下,是否无法从扩展包中提供服务?如何与扩展束中的代码进行交互(也就是访问扩展束本身内部的内容)?
这里有一些注意事项:
config.properties
以使用&#34; corebundles&#34;文件夹; actualBundleExample
的引用时,输出会显示&#34; null&#34;; System.out.println
控制台; 感谢您的回复!
答案 0 :(得分:2)
扩展束的主要目的是用于框架扩展,绝对不是常规用法。即扩展束通常与框架紧密耦合。原因是许多规则不计入扩展捆绑包,因为它们是在错误的&#34;围栏的一侧。出于很好的理由,很少有例子。你不应该使用它们,除非你真的知道你正在做什么,因为大多数OSGi规则都不适用。
那就是说。我的期望是您用于BundleExample的包在扩展包(来自类路径)和某些包导出的DS示例之间有所不同。由于它们来自不同的类加载器,因此OSGi认为它们是不同的服务,因为当您尝试使用它时会遇到类加载器异常。
您可以通过让框架导出此包来解决此问题。
只是一个猜测。