Schlagwort: Apache Felix

adaptTo() 2012 – Apache Sling & Friends Tech Meetup

Vom 26. bis 28. September findet dieses Jahr die 2. adaptTo() in Berlin statt, bei der auch dieses Jahr wieder eine exzellente Auswahl an Sessions rund um das Thema Apache Sling/Felix/Jackrabbit präsentiert wird.
Leider ist die Konferenz ausverkauft, jedoch werden im Anschluss wieder alle Slides & Codesamples ins Netz gestellt.

Der Timetable der adaptTo() 2012 mit allen Sessions und Speakern ist inzwischen veröffentlicht.

Zusätzlich findet einen Tag in vorher in den Räumen der pro!vision GmbH ein Apache Oakathon statt.




OSGI mit Felix

Hier ein kleines Beispiel zu OSGI mit Apache Felix

Man benötigt:

Apache Felix
BND-Tool
oder, ganz neu, für noch komfortableres Arbeiten das BND-Tool als Eclipse-Plugin

bndtools
Eclipse

Einstellungen für Eclipse:
Man legt eine neue User Library mit Namen Felix an: Window->Preferences->Java->Build path->User Libraries->New

Die felix.jar wird mit der neuen User Library verlinkt: Window->Preferences->Java->Build path->User Libraries->Add JARs

Anschließend legt man ein neues Java-Projekt in Eclipse an und fügen die neue User Library hinzu.
Danach kopiert man die beiden Ordner bundle und conf direkt in das Projektverzeichnis des erstellten Projekts.

Felix starten:
Man richtet unter Eclipse eine neue Laufzeitkonfiguration für Felixein: Run->Run Configurations->Java Applaction->New

In der Console kann man sich jetzt mit “ps” die installierten Bundles oder mit “help” die verfügbaren Kommandos ansehen.

BND-Tool:
Die Jar des BND-Tools wird in das Projektverzeichnis kopiert und außerdem in das Dropin-Verzeichnis von Eclipse. Danach muss man Eclipse neu starten.

Das eigentliche Programm:

Man erzeugt ein Service-Interface sowie die Implementierung dazu:

package de.pmannel.osgi;

public interface HelloService
{
	void sayHello();
}
package de.pmannel.osgi;

public class HelloServiceImpl implements HelloService
{

	@Override
	public void sayHello()
	{
		System.out.println("Hello Felix! Greetings from Service");

	}
}

Außerdem erzeugt man einen Activator, der beim Starten/Stoppen des Bundles ausgeführt wird.

package de.pmannel.osgi;

import java.util.Dictionary;
import java.util.Hashtable;

import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.ServiceTracker;

public class HelloFelixActivator implements BundleActivator
{
	private HelloService helloService;
	private ServiceTracker serviceTracker;

	@Override
	public void start(BundleContext context) throws Exception
	{
		Dictionary props = new Hashtable();
		props.put("objectName", "de.pmannel.osgi<:type=HelloService");
		context.registerService(HelloService.class.getName(), new HelloServiceImpl(), props);
		serviceTracker = new ServiceTracker(context, HelloService.class.getName(), null);
		serviceTracker.open();
		helloService = (HelloService)serviceTracker.getService();

		helloService.sayHello();
	}

	@Override
	public void stop(BundleContext context) throws Exception
	{
		serviceTracker.close();
		serviceTracker = null;
		helloService = null;
		System.out.println("Goodby Felix..");

	}
}

Nun erzeugt man im Projektverzeichnis eine .bnd-Datei, in der man bestimmte Parameter für die spätere Manifest-datei des OSGI-Bundles setzt.

# felix.bnd
Private-Package: de.pmannel.osgi
Bundle-Activator: de.pmannel.osgi.HelloFelixActivator
Bundle-SymbolicName: HelloFelix
Bundle-Version: 1.1.0

Mit einem Rechtsklick auf der Datei ->Make Bundle erzeugt man automatisch die Manifest-Datei.

Manifest-Version: 1.0
Private-Package: de.pmannel.osgi
Bundle-Version: 1.1.0
Tool: Bnd-0.0.384
Bnd-LastModified: 1273493680531
Bundle-Name: HelloFelix
Bundle-ManifestVersion: 2
Created-By: 1.6.0_07 (Sun Microsystems Inc.)
Bundle-Activator: de.pmannel.osgi.HelloFelixActivator
Import-Package: org.osgi.framework,org.osgi.util.tracker
Bundle-SymbolicName: HelloFelix

Das Bundle wird in Felix über die Console installiert:

install file:HelloFelix.jar

Anschließend wird das Bundle gestartet, indem man sich über “ps” die ID des Bundles holt:

start 9

Das war’s!

Man kann jetzt auch im laufenden Betrieb zb.: die sayhello()-Methode ändern und dann mit

update 9

eine neue Ausgabe erzeugen….