Core OSGi in kleinen Dosen – Teil 1




     Erste Schritte mit OSGi
     Die OSGi Service Platform (OSGi) hat sich zu ein...
OSGi in kleinen Dosen – Teil 1 Core



                                            definiert im Wesentlichen das OSGi
    ...
Core OSGi in kleinen Dosen – Teil 1


                                                                            sodass B...
OSGi in kleinen Dosen – Teil 1 Core



                                                              Abb. 7:
public interf...
Upcoming SlideShare
Loading in …5
×

JM 12/08 - OSGi in kleinen Dosen 1

951 views

Published on

First article "OSGi in kleinen Dosen" in German Java Magazin 12/08.

Published in: Technology, News & Politics
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
951
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
41
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

JM 12/08 - OSGi in kleinen Dosen 1

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

×