В 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 до запуска всех пакетов не работал.

0 ответов

Другие вопросы по тегам