W-JAX 08 - Declarative Services versus Spring Dynamic Modules
JM 12/08 - OSGi in kleinen Dosen 1
1. Core OSGi in kleinen Dosen – Teil 1
Erste Schritte mit OSGi
Die OSGi Service Platform (OSGi) hat sich zu einem sehr bedeutenden
Standard im Java-Umfeld entwickelt. Also wird es für den engagierten
Java-Entwickler allerhöchste Zeit, sich damit näher auseinanderzusetzen.
von Heiko Seeberger
bestehen. Wer meint, Modularisierung
zahlreiche namha e Unternehmen sind,
SGi prägt schon heute vielerorts
sei auch organisatorisch zu erzielen, z.B.
die sich 1999 zu diesem Zweck in einer
die Java-Welt und schickt sich
durch mehrere Projekte oder durch den
internationalen Organisation zusam-
an, zu einer universellen Ba-
Einsatz von komponentenorientierten
menfanden, der OSGi Alliance [1]. OSGi
sistechnologie zu werden. So mancher
Build-Systemen wie Maven, der betrach-
stand ursprünglich als Abkürzung für
Leser wird diesem bereits seit 2000 exis-
tet nur die halbe Wahrheit. OSGi hinge-
„Open Service Gateway Initiative“, heute
tierenden Standard vermutlich erstmalig
gen adressiert nicht nur den Zeitraum
steht der Begri für sich bzw. als Teil von
in Form des Eclipse SDK oder der Eclipse
der Entwicklung, sondern insbesondere
OSGi Service Platform, Titel der aktuellen
Rich Client Platform begegnet sein, da die
auch das Laufzeitverhalten: Es wird spe-
Spezi kation (Version 4.1).
Eclipse-Plug-in-Architektur seit Version
zi ziert, wie Module im laufenden Be-
3.0 auf OSGi basiert. Damit hat Eclipse
Ein dynamisches und service- trieb unter Berücksichtigung ihrer Ab-
zweifelsohne einen bedeutenden Anteil
orientiertes Modulsystem hängigkeiten installiert, aktualisiert und
an der aktuellen Popularität dieser Tech-
entfernt werden können. Gerade diese
nologie, die jedoch viel mehr zu bieten hat Warum ist OSGi eigentlich so erfolg-
Dynamik macht OSGi für serverseitige
als ein „Modulsystem für Rich Clients“. reich? Welchen Eigenscha en ist es zu
bzw. hochverfügbare Systeme interes-
verdanken, dass OSGi aus der Java-Welt
Ein Blick zurück sant, da Hot Deployment im Standard
kaum mehr wegzudenken ist? Die OSGi
inklusive ist.
Ursprünglich wurde OSGi nicht mit Blick Alliance de niert OSGi als dynamisches
Die dritte wesentliche Eigenschaft
auf Rich Clients oder gar Server, sondern Modulsystem für Java. Damit werden
von OSGi ist ein serviceorientiertes
für so genannte Residential Internet Gate- zwei der drei aus unserer Sicht entschei-
Programmiermodell: Module können
ways – Systeme aus der Gebäudetechnik denden Merkmale aufgeführt: Modula-
Objekte als Services bereitstellen, indem
– konzipiert. Derartige Systeme erfordern risierung und Dynamik.
sie diese an der OSGi Service Registry re-
üblicherweise Fernmanagement sowie Modularisierung ist ein „altes Haus-
gistrieren. Andere Module können diese
Installation von Komponenten im lau- mittel“ – nicht nur in der Informatik –,
Services abrufen und so untereinander
fenden Betrieb. Mit diesen Anforderun- um komplexe Probleme zu lösen.
kommunizieren. Dies führt zu einer lo-
gen im Fokus entstand die erste Version Schließlich lassen sich überschaubare
sen Kopplung der beteiligten Module.
der OSGi-Spezi kation, deren Urheber Häppchen leichter verdauen als das gro-
ße Ganze. Die Objektorientierung im
Allgemeinen und Java im Speziellen bie-
Artikelserie:
ten bereits Möglichkeiten zur Modulari-
OSGi in kleinen Dosen
sierung, z.B. in Form von Klassen, Pake-
ten, Sichtbarkeitsregeln etc. Allerdings
Teil 1: Erste Schritte mit OSGi
Teil 2: Immer in Bewegung – hat sich in der Praxis herausgestellt, dass
Bundles und Lifecycle
Java ein Modulkonzept „oberhalb“ von
Teil 3: Was wünschen Sie? –
Packages vermissen lässt. OSGi schließt
Services à la OSGi
diese Lücke, sodass anstelle der sonst o
Teil 4: Alles XML oder was? – Ser-
anzutre enden monolithischen Syste-
vices auf deklarative Weise
Teil 5: Hier wird „Service“ groß ge me solche treten, die aus verschiedenen
schrieben — Ausgewählte
Modulen mit wohlde nierten ö entli-
OSGi-Standardservices
chen Schnittstellen und Abhängigkeiten Abb. 1: Herausragende OSGi-Eigenschaften
32 javamagazin 12|2008 www.JAXenter.de
2. OSGi in kleinen Dosen – Teil 1 Core
definiert im Wesentlichen das OSGi
Jede dieser drei Eigenscha en, Mo-
Framework sowie die OSGi Standard
dularisierung, Laufzeitdynamik und
Services. Das OSGi Framework bzw.
Serviceorientierung, ist an sich nichts
eine Implementierung dessen stellt die
Neues, aber OSGi verbindet diese syn-
Laufzeitumgebung für So ware auf Ba-
ergetisch, sodass sich die folgenden Nut-
sis von OSGi dar. Die Standardservices,
zenpotenziale ergeben (Abb. 1):
z.B. Log Service oder Http Service, stan- Abb. 2: OSGi-System
dardisieren die Lösung typischer Prob-
Erhöhte Flexibilität durch rigorose
lemstellungen und können in eigenen
Trennung von API und Implementie-
Systemen genutzt werden.
rung
Einsparung von Entwicklungskosten
Das OSGi Framework
durch Wiederverwendung von Mo-
dulen Um gleich im OSGi-Jargon sprechen zu
Einsparung von Betriebskosten durch können, führen wir zunächst einen zen-
standardisiertes Lifecycle Manage- tralen Begri ein: Ein OSGi-Modul wird Abb. 3: Schichtenarchitektur des OSGi
ment, z.B. Hot Deployment oder par- Bundle genannt. Somit bestehen Syste- Frameworks
allelen Betrieb mehrerer Modulversi- me auf Basis von OSGi aus Bundles, für
onen die das OSGi Framework die Laufzeit-
umgebung darstellt (Abb. 2). Die Funk-
Hohe Qualitätseffizienz durch gute
tionalität des OSGi Frameworks ist auf
Testbarkeit aufgrund von loser Kopp-
mehrere Schichten verteilt, die in Abbil-
lung
dung 3 orange dargestellt sind.
Nutzung neuer Möglichkeiten, z.B. in
Der Module Layer definiert die
der So wareverteilung Abb. 4: „Hello World!“-Architektur
strukturellen Aspekte rund um Bundles,
d.h. die statische Sicht auf das OSGi-Mo-
Doch wie unterstützt OSGi die beschrie-
dulkonzept. Bundles sind JAR-Archive zuheben ist, dass im Bundle Manifest
benen Eigenscha en? Dazu werfen wir
und enthalten neben Klassen und Res- die Abhängigkeiten und das API, d.h.
zunächst einen Blick auf die Gesamtar-
sourcen mit dem Bundle Manifest eine die ö entliche Schnittstelle, explizit de-
chitektur. Die vorzügliche OSGi-Spezi-
Datei, die die OSGi-Eigenscha en des klariert werden. Das OSGi Framework
kation, die in Form von Core Speci ca-
Bundles beschreibt. Besonders hervor- stellt sicher, dass andere Bundles nur auf
tion und Service Compendium vorliegt,
Anzeige
Java-184x115.indd 1 17.10.2008 15:54:09 Uhr
3. Core OSGi in kleinen Dosen – Teil 1
sodass Bundles in bestimmten Phasen
ihres Lebenszyklus Objekte als Services
an der OSGi Service Registry anmelden
oder abrufen können. Dabei wird das
Serviceinterface, das vom Service imple-
Abb. 5: „Hello World!“-Ergebnis
mentiert wird, als Schlüssel verwendet. Abb. 6: Deklaration der öffentlichen
Besonderes Augenmerk muss hierbei Schnittstelle
der Laufzeitdynamik gewidmet werden:
das API eines Bundles zugreifen kön-
Schließlich können die Bundles, die
nen, und das auch nur dann, wenn sie „lauscht“, sobald es gestartet wurde, auf
Services anbieten, jederzeit „kommen
selbst entsprechende Abhängigkeiten solche Services, um diese aufzurufen
und gehen“, womit Servicekonsumenten
deklarieren. und das Ergebnis „Hello World!“ auf der
umgehen können müssen. Daher bietet
Der Lifecycle Layer bringt die dy- Konsole auszugeben (Abb. 5).
OSGi Mechanismen, um den Service
namische Sicht ins Spiel, indem er den Für dieses Beispiel wird Java 5 und
Lifecycle zu verfolgen, z.B. den im „Hello
Lebenszyklus von Bundles im OSGi Eclipse SDK Ganymede mit PDE benö-
World!“-Beispiel verwendeten Service-
Framework de niert. So können Bund- tigt, z.B. das Package Eclipse for RCP/
Tracker.
les beispielsweise zur Laufzeit installiert Plug-in Developers [5]. Um Nebene ek-
Daneben stellt der Security Layer auf
und wieder deinstalliert werden. Weiter- te zu vermeiden, sollte ein neuer Work-
Basis von Java 2 Security spezi sche Si-
hin können Bundles auch gestartet und space verwendet werden.
cherheitsbelange zur Verfügung. Neben
gestoppt werden, woraufhin in einem
Der Provider
speziellen Objekt, dem BundleActivator, dem Signieren von Bundles spielen dar-
entsprechende start()- und stop()-Me- Zunächst erstellen wir das Bundle com.
in für OSGi spezi sche Permissions eine
weiglewilczek.example.osgi.hello.pro-
zentrale Rolle. So kann z.B. festgelegt
thoden aufgerufen werden.
vider. Wir werden in der kommenden
werden, ob ein Bundle berechtigt wird,
Der Service Layer fügt ein service-
bestimmte Services zu verwenden oder
orientiertes Programmiermodell hinzu, Folge auf übliche Namenskonventionen
das API anderer Bundles zu nutzen. eingehen. PDE unterstützt die Entwick-
Unterhalb der Framework-Schich- lung von OSGi Bundles unter anderem
Listing 1 ten de niert OSGi in Form von Executi- durch Plug-in-Projekte. Diese sind, ver-
on Environments Abstraktionen von Ja- einfacht dargestellt, Java-Projekte, deren
public class Activator implements BundleActivator {
va-Laufzeitumgebungen. Diese können Build-Klassenpfad den deklarierten
pro Bundle zur Voraussetzung gemacht Abhängigkeiten der Bundles entspricht.
private ServiceTracker helloProviderTracker;
werden, wobei das OSGi Framework Auf diese Weise können Laufzeitfeh-
selbst das OSGi/Minimum-1.1 Execu- ler aufgrund fehlender oder fehlerha
public void start(final BundleContext context) {
tion Environment benötigt. Es gibt zahl- deklarierter Abhängigkeiten schon zur
helloProviderTracker = new ServiceTracker(context,
reiche OSGi-Implementierungen, so- Entwicklungszeit vermieden werden.
IHelloProvider.class.getName(),
wohl kommerzielle Produkte als auch Plug-in-Projekte werden mit ei-
new ServiceTrackerCustomizer() {
kostenlose Open-Source-Lösungen, nem eigenen New-Wizard angelegt. In
public Object addingService(final ServiceReference reference) {
z.B. Apache Felix [2] oder Knop er sh unserem Beispiel wird auf der ersten
final IHelloProvider helloProvider = (IHelloProvider)
Wizard-Seite com.weiglewilczek.examp-
OSGi [3]. Wir werden für das folgen-
context.getService(reference);
le.osgi.hello.provider als Projektname
dende Beispiel Eclipse Equinox [4] ver-
System.out.println(helloProvider.sayHello());
eingetragen und an OSGi framework mit
wenden, weil das Eclipse SDK als Ent-
return helloProvider;
Ausprägung standard selektiert. Auf der
wicklungsumgebung mit dem Plug-in
}
Development Environment (PDE) eine zweiten Wizard-Seite können die Vor-
public void modifiedService(final ServiceReference reference,
hervorragende Werkzeugunterstützung belegungen mit einer Ausnahme über-
final Object service) { // Nothing to be done!
anbietet, die optimal auf Equinox ab- nommen werden: Dem vorgeschlagenen
}
Namen für Activator wird ein internal-
gestimmt ist, sodass die ersten Schritte
besonders einfach sind. Trotzdem wer- Package-Segment vor dem Klassenna-
public void removedService(final ServiceReference reference,
den wir uns ausschließlich am aktuellen men eingeschoben. Nach Fertigstellung
final Object service) { // Nothing to be done!
OSGi-Standard orientieren, sodass die wurde ein neues Projekt angelegt, das im
}
Wesentlichen die Activator-Klasse sowie
Beispiele problemlos auf anderen Imple-
});
helloProviderTracker.open();
mentierungen laufen können. das Bundle Manifest (mehr dazu in der
}
kommenden Folge) enthält.
„Hello World!“ Als Nächstes erstellen wir im Packa-
public void stop(final BundleContext context) {
ge com.weiglewilczek.example.osgi.hello.
Das Beispiel (Abb. 4) besteht aus zwei
if (helloProviderTracker != null) helloProviderTracker.close();
provider (diesmal ohne internal) das
Bundles: Das eine bietet beim Starten
}
Serviceinterface IHelloProvider mit der
unter dem Serviceinterface IHello-
}
Methode sayHello():
Provider einen Service an, das andere
34 javamagazin 12|2008 www.JAXenter.de
4. OSGi in kleinen Dosen – Teil 1 Core
Abb. 7:
public interface IHelloProvider {
OSGi
String sayHello();
Frame-
} work Run
Configu-
ration
Dazu implementieren wir im Package
com.weiglewilczek.example.osgi.hello.
internal.provider (diesmal wieder mit in-
ternal) die Klasse OsgiHelloProvider:
public class OsgiHelloProvider implements
IHelloProvider {
public String sayHello() {
return ”Hello world!“;
}
}
In der Methode Activator.start() erzeu-
gen wir eine Instanz des OsgiHelloPro-
viders und registrieren diese als OSGi
ServiceunterdemServiceinterfaceIHello-
Provider:
Ausblick
zu können, müssen diese Abhängigkei-
ten im Bundle Manifest eingetragen In dieser ersten Folge haben wir einen
public void start(final BundleContext context) {
werden. Dazu verwenden wir wieder- Überblick über OSGi gegeben, die Archi-
context.registerService(
um den Manifest-Editor und fügen im tektur des OSGi Frameworks betrachtet
IHelloProvider.class.getName(),
Reiter Dependencies die entsprechen- und Modularisierung, Laufzeitdynamik
new OsgiHelloProvider(), null);
}
den Packages hinzu. und Serviceorientierung als wesentliche
Eigenscha en von OSGi herausgestellt.
„Hello World!“ in Aktion Die nächste Folge steht unter dem Mot-
Abschließend deklarieren wir noch das
to „Immer in Bewegung – Bundles und
Package, das das Serviceinterface als Be- Um dieses Beispiel ablaufen zu lassen,
Lifecycle“ und beleuchtet im Detail das
standteil der ö entlichen Schnittstelle können wir eine weitere hilfreiche
Modulkonzept und die Laufzeitdyna-
enthält. Dies erfolgt im Bundle Manifest, Funktion des PDE nutzen: Es ist nicht
mik von OSGi.
das wir durch Doppelklick im Package nötig, Bundles im korrekten Zielfor-
Explorer mit dem Manifest-Editor – ei- mat zu erstellen und in einem OSGi
nem weiteren PDE-Werkzeug – ö nen. Framework zu installieren. Vielmehr
Heiko Seeberger ist als
Im Reiter Runtime fügen wir das Package können Plug-in-Projekte direkt aus der
Technical Director für die
com.weiglewilczek.example.osgi.hello. Entwicklungsumgebung heraus gestar- Weigle Wilczek GmbH
provider zu den Exported Packages hin- tet werden. Dazu wird eine Run Con- tätig. Sein technischer
figuration vom Typ OSGi Framework
zu (Abb. 6). Schwerpunkt liegt in der
Entwicklung von Unterneh-
benötigt. Über das Menü R |R
mensanwendungen mit OSGi, Eclipse
Der Consumer C ... gelangen wir in ei- RCP, Spring, AspectJ und Java EE. Sei-
nen Dialog, in dem wir eine neue OSGi
Nun erstellen wir das Bundle com. ne Erfahrungen aus über zehn Jahren
Framework Run Con guration anlegen
weiglewilczek.example.osgi.hello.con- IT-Beratung und Softwareentwicklung
fließen in die Eclipse Training Alliance
(Abb. 7). Dabei ist der Reiter Bundles
sumer. Dazu gehen wir analog zum
ein. Zudem ist Heiko Seeberger aktiver
besonders wichtig, denn hier legen wir
Provider vor. Der Consumer enthält Committer in Eclipse-Projekten, Autor
mit dem Activator nur eine Klasse. Lis- fest, welche Bundles verwendet werden zahlreicher Fachartikel und Redner auf
sollen. Die Voreinstellungen bewirken,
ting 1 zeigt, wie wir in dessen Methode einschlägigen Konferenzen.
start() einen ServiceTracker (mehr da- dass die verwendeten Bundles nicht nur
installiert, sondern auch gleich gestar-
zu in kommenden Folgen) für obiges
Serviceinterface anlegen. Der Service- tet werden, was wir für unser Beispiel Links & Literatur
TrackerCustomizer ru in der Metho- auch benötigen. Wir wählen unsere bei- [1] www.osgi.org/
de addingService() den vom Provider den Beispiel-Bundles und lassen mittels [2] felix.apache.org/
Add Required Bundles alle abhängigen
registrierten IHelloService auf und gibt [3] www.knopflerfish.org/
Bundles automatisch ergänzen. Ein
das Ergebnis auf der Konsole aus. Um [4] www.eclipse.org/equinox
Klick auf R lässt uns „Hello World!“
den ServiceTracker und das vom Provi- [5] www.eclipse.org/downloads
in Aktion erleben (Abb. 5).
der angebotene Serviceinterface nutzen
javamagazin 12|2008 35
www.JAXenter.de