# Deklarativer Service im RCP Feature ?



## stefan. (6. Jan 2011)

Deklarativer Service im RCP Feature ?

Hallo,

ich habe einen deklarativen OSGI Service. Diesen habe ich in der Run Configuration auf Autostart = True gestellt. Zusätzlich verwende ich den EventAdmin Service zum Austausch von Informationen zwischen verschiedenen Plugins.

Die Plugins:
org.eclipse.equinox.ds und org.eclipse.osgi.service habe ich ebenfalls auf Autostart gestellt.
Beim Start aus Eclipse herraus funktonieren die Services. Wenn ich aber ein feature Product erstelle und dieses exportiere, funktionieren beide Services nicht.

Der folgende Code soll den EventAdmin Service bereitstellen:  eventAdminServiceReference ist dann beim feature-Export immer NULL. (Dabei scheint es egal zu sein was ich in der Product Configuration angebe).

```
@Override
	public void start(BundleContext context) throws Exception {
		super.start(context);
		plugin = this;
		Utils.initLogger();

		ServiceReference eventAdminServiceReference = getBundle().getBundleContext().getServiceReference(
				EventAdmin.class.getName());
		if (eventAdminServiceReference != null) {
			// EventAdmin Service lookup
			eventAdmin = (EventAdmin) getBundle().getBundleContext().getService(eventAdminServiceReference);
			if (eventAdmin == null) {
				log.error("eventadmin service NULL");
				System.err.println("eventadmin service NULL");
			}
		} else {
			System.out.println("Service Reference NULL");
			log.error("Activator.start() Service Reference NULL");
		}

	}
```

Beim deklarativen Service ist die ServiceReference immer NULL.

```
IMyService service;
BundleContext context = Activator.getDefault().getBundle().getBundleContext();
ServiceReference reference = context.getServiceReference(IMyService.class.getName());

if (reference != null) {
	service = (IMyService) context.getService(reference);
	if (service != null) {
		service.connect(connection);
	}
} else {
	log.error("Service nicht verfuegbar !");
}
```

DS Service component.xml

```
<?xml version="1.0" encoding="UTF-8"?>

<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="control.myservice">

   <implementation class="control.service.MyService"/>

   <service>

      <provide interface="control.service.IMyService"/>

   </service>

</scr:component>
```

Hat jemand eine Idee wieso es aus Eclipse herraus funktioniert aber nicht im feature-Product ?


----------



## Gast2 (7. Jan 2011)

Hast du deine xml mit ausgeliefert?


----------



## stefan. (7. Jan 2011)

Meinst du die component.xml ? Die wird mit ausgeliefert:


----------



## Gast2 (7. Jan 2011)

Schon mal in die setMethode einen log reingemacht ob die überhauot augerufen wird?


----------



## stefan. (7. Jan 2011)

Also beim EventAdmin Service klappt schon das registrieren nicht und beim DS Service habe ich keine set - Methode, sondern nur eine get - Methode. Diese wird aufgerufen, weil ich ja den log-Eintrag: 
log.error("Service nicht verfuegbar !");

 bekomme. Der DS Service wird doch mittels component.xml registriert !?


----------



## Gast2 (7. Jan 2011)

stefan. hat gesagt.:


> Also beim EventAdmin Service klappt schon das registrieren nicht und beim DS Service habe ich keine set - Methode, sondern nur eine get - Methode. Diese wird aufgerufen, weil ich ja den log-Eintrag:
> log.error("Service nicht verfuegbar !");
> 
> bekomme. Der DS Service wird doch mittels component.xml registriert !?



Habs noch nie getestet, aber ich denke mal du brauchst eine setMethode wie soll er sonst registrieren?
Aber wie gesagt noch nie getestet vielleicht findest hier war bei 7 und 8.
OSGi with Eclipse Equinox - Tutorial


----------



## stefan. (7. Jan 2011)

Meines Wissens nach muss man deklarative Services nicht registrieren. Man muss nur dafür sorgen dass das Plugin - Projekt gestartet wird. Sonst würde es ja auch aus Eclipse herraus nicht funktionieren. 

Registrieren wie es im Tutorial Teil 8 gezeigt ist muss man doch nur wenn man es nicht programmatisch machen möchte !?


----------



## Gast2 (8. Jan 2011)

stefan. hat gesagt.:


> Meines Wissens nach muss man deklarative Services nicht registrieren. Man muss nur dafür sorgen dass das Plugin - Projekt gestartet wird. Sonst würde es ja auch aus Eclipse herraus nicht funktionieren.
> 
> Registrieren wie es im Tutorial Teil 8 gezeigt ist muss man doch nur wenn man es nicht programmatisch machen möchte !?



Mhm wie gesagt ich relativ wenig Erfahrung weil ich OSGi Services mit Spring und DI mache. Darum sag ich dazu nur was mit einfällt^^...
Du kannst in deinem feature noch den start level vom Bundle einstellen villeicht hilft das?!


----------



## stefan. (8. Jan 2011)

SirWayne hat gesagt.:


> Du kannst in deinem feature noch den start level vom Bundle einstellen villeicht hilft das?!



Dort hatte ich schon mein Service-Plugin auf Autostart gestellt. Testweise hatte ich dort auch org.eclipse.osgi.service und ein paar andere Plugins eingetragen. 

Nachdem ich aber jetzt org.eclipse.equinox.ds und org.eclipse.equinox.event eingetragen habe (vorher im feature als plugin hinzugefügt) funktioniert jetzt (beim exportieren) sowohl mein eigener DS-Service als auch der EventAdmin-Service. 

Vielen Dank nochmal für deine Hilfe 

PS: Ich finde nur komisch das man im eigenen feature Eclipse-Plugins hinzufügen muss, diese sollten ja eigentlich bei den "included features" dabei sein ?


----------

