OSGi Tutorial 17.09.2009 Aurich – Jonas Jacobi Das OSGi Service Framework Dynamisches Modulsystem für Java ‒ Dynamische Integration und Fernmanagement von • Softwarekomponenten (Bundles) • Services ‒ Verfügbarkeit, Skalierbarkeit, Security Eingebettete Systeme bis Enterprise Applications Grundlage u.a. von Eclipse OSGi Alliance ‒ Bis 2004 Open Service Gateway Initiative ‒ IBM, Oracle, Sun, Nokia, … Verschiedene Implementierungen ‒ Equinox, Felix, Knopflerfish, … 17.09.2009 Aurich – Jonas Jacobi 2 Das OSGi Service Framework Container für Applikationen und Services Applikationen teilen sich eine Java VM Applikationsmanagement ‒ Life Cycle, Java Pakete, Security, Abhängigkeiten Service Registry Benachrichtigungen über Veränderungen ‒ Bundles ‒ Services System-Bundles (OSGi) Support –Bundles (OSGi-Plattform z.B. Equinox) ApplikationsBundles (Benutzerdefiniert) OSGi Service Framework Java VM 17.09.2009 Aurich – Jonas Jacobi 3 OSGi Bundles OSGi Verpackung für ‒ Applikation ‒ Bibliothek ‒ Beliebige Ressourcen Dynamischer Lebenszyklus Uninstall Install Uninstalled Installed Resolved Stopping Starting Active explizit Automatisch 17.09.2009 Aurich – Jonas Jacobi 4 OSGi Bundle Interna Normale JAR-Datei Erweiterte Manifest-Datei ‒ META-INF/MANIFEST.MF ‒ Beschreibt das Bundle • Name, Version, … ‒ Definiert Abhängigkeiten • Java-Packages • Andere Bundles ‒ Definiert Package-Exporte Activator zur Initialisierung/Shutdown (Optional) ‒ Normale Java Klasse ‒ In der Manifest-Datei definiert Kann Services bereitstellen 17.09.2009 Aurich – Jonas Jacobi 5 Hands-On (Teil 1) OSGi Bundles 17.09.2009 Aurich – Jonas Jacobi 6 Zusammenspiel von Bundles Das OSGi Framework verwaltet die Abhängigkeiten ‒ Lazy-Loading (-Starting) von Bundles ‒ Bundles starten nur, wenn alle Abhängigkeiten aufgelöst werden können Java-Packages exportieren ‒ im Bundle vorhandene Packages ‒ im Classpath vorhandene Packages Java-Packages anderer Bundles Importieren ‒ Vorteile: Lose Kopplung, Spezifisches Matching ‒ Nachteile: • Alle Imports müssen angegeben werden • nur Code/Resource Abhängigkeiten Importieren anderer Bundles ‒ Vorteile: Nicht-Code Abhängigkeiten, Bequem ‒ Nachteile: Starke Kopplung, Packages können verdeckt werden 17.09.2009 Aurich – Jonas Jacobi 7 OSGi Class Loading Jedes Bundle besitzt einen eigenen ClassLoader!! Zugriff nur auf ‒ ‒ ‒ ‒ java.* Eigene Klassen / Klassen im Classpath des Bundles Importierte Packages Exportierte Packages importierter Bundles Mehrere Versionen eines Bundles können gleichzeitig geladen sein 17.09.2009 Aurich – Jonas Jacobi 8 OSGi Class Loading – Schwierigkeiten Beispiel Bundle A Bundle B classpath: library.jar import: B classpath: library.jar export: B A { ClassCastException ABC var; B.Foo.bar(var); B Foo bar(x : ABC) } library.jar lib ABC … 17.09.2009 Aurich – Jonas Jacobi 9 OSGi Class Loading – Schwierigkeiten – Lösung Bundle A import: B, lib Bundle B export: B import: lib A B { ABC var; B.Foo.bar(var); } Foo bar(x : ABC) library.jar lib ABC … Bundle C classpath: library.jar export: lib 17.09.2009 Aurich – Jonas Jacobi 10 OSGi Class Loading - Schwierigkeiten Schwierigkeiten mit nicht-OSGi Bibliotheken/Applikationen ‒ „Hacks“ zum dynamischen Laden von Implementierungen wie Class.forName, … führen zu Exceptions ‒ Tricks zum Umgehen der Probleme • Thread.currentThread().setContextClassLoader(…) ‒ Externer Zugriff auf Klassen eines eingebetteten OSGi-Frameworks sehr kompliziert! 17.09.2009 Aurich – Jonas Jacobi 11 Hands-On (Teil 2) Bundle Abhängigkeiten 17.09.2009 Aurich – Jonas Jacobi 12 Fragment Bundles Hinzufügen neuer Übersetzungen ‒ erfordert neue Property Dateien in aurich.translation.impl ‒ Problem bei fremden Bundles Lösung: Fragment-Bundles ‒ Erweitern den Classpath eines Bundles ‒ Besitzen keinen eigenen Life-Cycle • Können aber dynamisch hinzugefügt werden ‒ Wird genutzt für: • Bereitstellen von Konfigurationen/Ressourcen • Implementierung von Produktvarianten Insbes. Plattformspezifische Implementierungen 17.09.2009 Aurich – Jonas Jacobi 13 Hands-On (Teil 3) Fragment-Bundles 17.09.2009 Aurich – Jonas Jacobi 14 OSGi Services Werden Spezifiziert durch ein Java-Interface Können in verschiedenen Bundles implementiert werden ‒ Normale Java Objekte ‒ Bundle registriert Service ‒ Andere Bundles nutzen Service Klare Trennung von Spezifikation und Implementierung Zentrale Service-Registry ‒ Dynamisches Registrieren/Deregistrieren von Services 17.09.2009 Aurich – Jonas Jacobi 15 OSGi Standard Services OSGi definiert eine Menge von Standard Services ‒ ‒ ‒ ‒ ‒ ‒ ‒ ‒ Wird von der OSGi Umgebung (z.B. equinox) mitgeliefert Config-Admin-Service Metatype-Service User-Admin-Service Preferences-Service Log-Service Http-Service … diverse weitere insbes. für Mobile-Plattformen 17.09.2009 Aurich – Jonas Jacobi 16 Service Registry Zentrale Stelle ‒ zur Anmeldung von Services ‒ zum Auffinden von Services Services können über Properties beschrieben werden ‒ Immer vorhanden: objectClass ‒ Beliebige weitere definierbar Filter auf Properties zum Finden von Services ‒ LDAP Notation • (& (objectClass=org.eclipse.console.CommandProvider) (author=*Mustermann*)) 17.09.2009 Aurich – Jonas Jacobi 17 Benutzen von Services BundleContext ‒ Wird einem Bundle-Activator in der Start-Methode übergeben ‒ Ermöglicht Zugriff auf das Framework • Bundle-Events • Service-Events ServiceTracker ‒ Kapselt das Suchen und Tracken von Services Declarative Services ‒ Einfache deklarative Konfiguration von bereitgestellten/zu nutzenden Services ‒ Kümmert sich um das automatische Auflösen von ServiceAbhängigkeiten 17.09.2009 Aurich – Jonas Jacobi 18 Hands-On (Teil 3) OSGi Services 17.09.2009 Aurich – Jonas Jacobi 19 Fazit Dynamisches Modulsystem für Java ‒ Kommt mit relativ wenigen Klassen/Interfaces aus Bundles ‒ Einfache .jar Dateien mit speziellen Attributen in der Manifest.mf ‒ Life-Cycle Management ‒ Abhängigkeitsmanagement Services ‒ ‒ ‒ ‒ Lose Koppelung Dynamik Viele Standardservices schon vorhanden Declarative Services zum komfortablen Management ClassLoading „tricky“ 17.09.2009 Aurich – Jonas Jacobi 20