В OSGi ServiceLoader.load не может найти реализацию
Мы пытались заставить SPI Fly работать с openstack4j-core и одним из соединителей openstack4j (openstack4j-httpclient). это org.openstack4j.core.transport.HttpExecutorService
которые требуют SPIFly ткачества.
Одна странность: оба пакета загружаются из zip-файла и запускаются после запуска и запуска остальной системы. Этот же zip-файл обеспечивает org.apache.aries.spifly.dynamic.bundle
,
В двух комплектах используется OSGI-Spec-совместимая модель из стандартного набора инструкций для SPI Fly. В соответствии с этими инструкциями все, что нам действительно нужно, это соответствующий Require-Capability
а также Provide-Capability
Заголовки в MANIFEST.MF обоих комплектов добавьте в сервисную декларацию в META-INF / (показано ниже).
Базовый комплект имеет:
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 имеет файл с именем org.openstack4j.core.transport.HttpExecutorService
под META-INF / services, одной строкой:
org.openstack4j.connectors.httpclient.HttpExecutorServiceImpl
Мы также добавляем org.apache.aries.spifly.dynamic.bundle
расслоение, которое обеспечивает serviceloader.processor
а также serviceloader.registrar
возможностей.
Тогда во время выполнения, вызов ServiceLoader просто не находит HttpExecutorService
,
PS: возиться с порядком, в котором запускаются связки, не было плодотворным и вызывающим resolveBundles
на FrameworkWiring
до запуска всех пакетов не работал.