如何在同一个插件中处理2个OSGi声明式服务捆绑包组件?

时间:2018-12-29 20:20:48

标签: osgi inject e4 declarative-services

我通过手动定义组件来使用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,以便可以像第一个一样调用。但是Eclipse不允许我这样做。所以我想,是我需要将它们分开。我的意思是说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 :(得分:3)

一个插件中可以有任何数量的组件(我在一个插件中有8个组件)。

您将每个组件放在单独的XML文件中(名称可以是您想要的任何名称),并将它们列出在MANIFEST.MF的Service-Component条目中。

所以在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值,仅用于此特定服务)。