我们一直在尝试让 SPI Fly 与openstack4j-core和其中一个 openstack4j 连接器 ( openstack4j-httpclient ) 一起工作。就是org.openstack4j.core.transport.HttpExecutorService
需要SPIFly编织。
一个怪癖:两个包都是从一个 zip 文件加载的,并在系统的其余部分启动并运行后启动。相同的 zip 文件提供了org.apache.aries.spifly.dynamic.bundle
.
这两个捆绑包确实使用了SPI Fly 标准指令集中的 OSGI-Spec 兼容模型。根据这些说明,我们真正需要的只是两个包的 MANIFEST.MF 中的相应标头,以及 META-INF/ 下的服务声明Require-Capability
(如下所示)。Provide-Capability
核心捆绑包有:
Require-Capability:
osgi.serviceloader;filter:="(osgi.serviceloader=org.openstack4j.api.APIProvider)";cardinality:=multiple,
osgi.serviceloader;filter:="(osgi.serviceloader=org.openstack4j.core.transport.HttpExecutorService)";cardinality:=multiple,
osgi.serviceloader;filter:="(osgi.serviceloader=org.openstack4j.openstack.logging.LoggerFactorySupplier)";cardinality:=multiple;resolution:=optional,
osgi.extender;filter:="(osgi.extender=osgi.serviceloader.processor)",
osgi.extender;filter:="(osgi.extender=osgi.serviceloader.registrar)",
osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.7))"
httpclient 有:
Require-Capability: osgi.extender;filter:="(osgi.extender=osgi.serviceloader.registrar)",osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.7))"
Provide-Capability: osgi.serviceloader;osgi.serviceloader="org.openstack4j.core.transport.HttpExecutorService"
(为了可读性,重新格式化,当然)
此外, openstack4j-httpclient有一个名为META-INF/servicesorg.openstack4j.core.transport.HttpExecutorService
的文件,只有一行:
org.openstack4j.connectors.httpclient.HttpExecutorServiceImpl
我们还添加了org.apache.aries.spifly.dynamic.bundle
提供serviceloader.processor
和serviceloader.registrar
功能的包。
然后在运行时,ServiceLoader 调用只是找不到HttpExecutorService
.
PS:搞乱bundle的启动顺序没有效果,在所有bundle启动前调用resolveBundles
也FrameworkWiring
没有用。