Как мне зарегистрировать сервис в OSGi (Apache Felix)?
-
19-09-2019 - |
Вопрос
Мне успешно удалось запустить Apache Felix из кода и зарегистрировать собственный пакет.
Необходима следующая связь между OSGI-проектами:
[OsgiInterface]
-- предоставляет интерфейсы.
[OsgiModuleA]
-- (bundle) предоставляет реализацию этих интерфейсов.
знает [OsgiInterface]
[OsgiUsage]
-- использует один или несколько пакетов.
знает [OsgiInterface]
и [OsgiModuleA]
Теперь у меня возникли проблемы с регистрацией сервиса, который реализует интерфейс.Я бы предположил, что мои записи в manifest.mf
файлы неверны.
Дополнительная информация
Было бы очень любезно, если бы кто-нибудь мог взглянуть на код в моем предыдущий вопрос
Позвольте мне обратиться к этому вопросу:
Я попытался создать третий проект OsgiИнтерфейсы, который предоставляет интерфейс SomeInterface
в упаковке interfaces
.Этот проект известен обоим ОсгиМодулеА и Использование OsgiUsage.
ОсгиМодулеА: manifest.mf
теперь имеет дополнительную ценность interfaces
для вступления Import-Package:
.Кроме того, существует пример SomeInterface
предоставляется активатору.
Когда пакет запущен, NoClassDefFoundError
происходит:интерфейс SomeInterface
это неизвестно.
Редактировать:
Теперь, когда ошибка исправлена, я могу сказать, что самой важной частью было:
map.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA,
"my.interfaces; version=1.0.0");
Без этого я получил ClassCastException
.
Решение
В самой простой форме сервисы регистрируются в коде Java, не используя манифест или какой-либо другой файл.Обычно это происходит в вашем BundleActivator .
Long i = new Long(20); // the service implementation
Hashtable props = new Hashtable();
props.put("description", "This an long value");
bundleContext.registerService(Long.class.getName(), i, props);
Я предлагаю вам прочитать учебник, подобный тому, что приведен на Рыба - шишковидка
Альтернативой является использование декларативных служб или нового средства создания чертежей.Используя любую из этих (или других нестандартизированных систем), вы будете объявлять свои сервисы в файле (обычно XML) вместо написания кода для взаимодействия с реестром сервисов.
Но, вероятно, сначала вам следует разобраться с основными принципами вручную.
[OsgiUsage] - использует один или несколько пакетов.знает [OsgiInterface] и [OsgiModuleA]
Не должно быть необходимости, чтобы пакет, использующий услугу, знал о пакете, который ее предоставляет.Им обоим просто нужно знать интерфейс сервиса.На самом деле, пакетам вообще не нужно знать о других пакетах.Им нужно только импортировать пакеты и потреблять или предоставлять услуги.
Другие советы
Я понимаю, что у вас есть Какой-то интерфейс в другой связке, верно?Затем вы также должны экспортировать этот пакет в манифест этого пакета, например.
Export-Bundle: interfaces
Но вам действительно стоит взглянуть на инструмент bnd, упомянутый в другом ответе.Это генерирует стандартные манифесты OSGi.
Я предлагаю вам взглянуть на проект iPOJO.Это значительно упрощает использование Felix.
https://felix.apache.org/documentation/subprojects/apache-felix-ipojo.html
Я бы сказал, использовать бнд непосредственно или maven-пакет-плагин для создания банок с поддержкой OSGI.
Это проще, чем писать манифест OSGI самостоятельно (опечатки, ошибки, недостающий импорт / экспорт)
Для начала попробуйте обернуть банки bnd.