1

I use OSGi services via manually component definition. Service components consist of an XML description and an object. My project was working just fine until I try to instantiate another service in the same plugin. Now it seems to me, as if I'm not supposed to declare two component.xml file in the same plugin.

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>

By injecting the interface I can access to the implementation.

Now I want a second component.xml with a different implementation so I can call just like the first. But Eclipse wouldn't let me to it. So I figured, my be i need to separate them. I mean in 2 differents plugins, which has been working fine so far. Still, my plugins look pretty empty now. So I want to combine all the services in the same plugin. Is there any way to concentrate the components as XML? Something like the code below (which I already tried by the way but unfortunately, doesn't work)

<?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>
greg-449
  • 109,219
  • 232
  • 102
  • 145
Lycone
  • 650
  • 9
  • 18

1 Answers1

3

You can have any number of components in a plug-in (I have 8 in one plug-in).

You put each component in a separate XML file (the name can be whatever you want) and list them in the Service-Component entry in the MANIFEST.MF.

So in the MANIFEST.MF I have:

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

And my XML file looks like:

<?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>

(ignore the property value, that is just for this specific service).

greg-449
  • 109,219
  • 232
  • 102
  • 145
  • Thanks... I found where my mistake was. I tried this too, but i guess Eclipse doesn't like the "copy-paste" thing. I copied the component and change the name as I wanted it. But this did not appear in the MANIFEST.MF and even adding the name didn't help. Long story short, I needed to add the component manually. Still the right answer though. – Lycone Dec 30 '18 at 11:28
  • You can also just put `Service-Component: OSGI-INF/*` instead of listing them all explicitly. – Neil Bartlett Dec 31 '18 at 05:41