Как работать с двумя компонентами OSGi Declarative Services Bundle в одном плагине? - PullRequest
0 голосов
/ 29 декабря 2018

Я использую сервисы OSGi через определение компонентов вручную.Компоненты службы состоят из описания XML и объекта.Мой проект работал нормально, пока я не попытался создать другой сервис в том же плагине.Теперь мне кажется, что я не должен объявлять два файла component.xml в одном плагине.

component.xml

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="ICustomerOSGiService">
   <implementation class="de.checkpoint.rinteln.service.customer.service.CustomerOSGiService"/>
   <service>
    <provide interface="de.checkpoint.rinteln.carlofon.common.service.ICustomerOSGiService"/>
   </service>
</scr:component>

Внедрив интерфейс, я могу получить доступ к реализации.

Теперь мне нужен второй файл component.xml с другой реализацией, чтобы я могзвоните так же, как первый.Но Затмение не дало мне этого.Поэтому я решил, что мне нужно их разделить.Я имею в виду 2 разных плагина, которые до сих пор работали нормально.Тем не менее, мои плагины выглядят довольно пустыми.Поэтому я хочу объединить все сервисы в одном плагине.Есть ли способ сконцентрировать компоненты как XML?Что-то вроде приведенного ниже кода (который я, кстати, уже пробовал, но, к сожалению, не работает)

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="IOSGiService">
   <implementation class="de.checkpoint.rinteln.service.customer.service.CustomerOSGiService"/>
   <service>
    <provide interface="de.checkpoint.rinteln.carlofon.common.service.ICustomerOSGiService"/>
   </service>

   <implementation class="de.checkpoint.rinteln.service.customer.service.ReminderOSGiService"/>
   <service>
    <provide interface="de.checkpoint.rinteln.carlofon.common.service.IReminderOSGiService"/>
   </service>
</scr:component>

1 Ответ

0 голосов
/ 30 декабря 2018

В плагине может быть любое количество компонентов (у меня 8 в одном плагине).

Вы помещаете каждый компонент в отдельный XML-файл (имя может быть любым, каким вы хотите) и перечисляете их в записи Service-Component в MANIFEST.MF.

То есть в MANIFEST.MF у меня есть:

Service-Component: OSGI-INF/playerStateService.xml,
 OSGI-INF/editorManager.xml,
 OSGI-INF/viewManager.xml,
 OSGI-INF/dateUtil.xml,
 OSGI-INF/preferenceSettings.xml,
 OSGI-INF/dialogSettings.xml,
 OSGI-INF/extensionFactory.xml,
 OSGI-INF/imperativeExpressionManager.xml

И мой XML-файл выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" enabled="true" name="greg.music.playerStateService">
   <implementation class="greg.music.core.services.PlayerStateContextFunction"/>
   <property 
       name="service.context.key" 
       type="String" 
       value="greg.music.core.services.IPlayerStateService"/>
   <service>
      <provide interface="org.eclipse.e4.core.contexts.IContextFunction"/>
   </service>
</scr:component>

(игнорируйте значение property, которое только для этой конкретной службы).

...