Вопрос

Мне успешно удалось запустить 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top