Aurich – Jonas Jacobi OSGi Tutorial
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, … 2
Aurich – Jonas Jacobi 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 3 Java VM OSGi Service Framework System-Bundles (OSGi) Support –Bundles (OSGi-Plattform z.B. Equinox) Applikations- Bundles (Benutzerdefiniert)
Aurich – Jonas Jacobi OSGi Bundles OSGi Verpackung für Applikation Bibliothek Beliebige Ressourcen Dynamischer Lebenszyklus 4 Installed Resolved StartingActive Stopping Uninstalled Install Uninstall Stop Start Uninstall Automatisch explizit
Aurich – Jonas Jacobi 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 5
Aurich – Jonas Jacobi Hands-On (Teil 1) OSGi Bundles 6
Aurich – Jonas Jacobi 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 7
Aurich – Jonas Jacobi 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 8
Aurich – Jonas Jacobi Bundle B B classpath: library.jar export: B Bundle A classpath: library.jar import: B OSGi Class Loading – Schwierigkeiten Beispiel 9 { ABC var; B.Foo.bar(var); } A library.jar lib … ABC bar(x : ABC) Foo ClassCastException
Aurich – Jonas Jacobi Bundle B export: B import: lib Bundle C classpath: library.jar export: lib B Bundle A import: B, lib OSGi Class Loading – Schwierigkeiten – Lösung 10 { ABC var; B.Foo.bar(var); } A bar(x : ABC) Foo library.jar lib … ABC
Aurich – Jonas Jacobi 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! 11
Aurich – Jonas Jacobi Hands-On (Teil 2) Bundle Abhängigkeiten 12
Aurich – Jonas Jacobi 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 13
Aurich – Jonas Jacobi Hands-On (Teil 3) Fragment-Bundles 14
Aurich – Jonas Jacobi 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 15
Aurich – Jonas Jacobi 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 16
Aurich – Jonas Jacobi 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
Aurich – Jonas Jacobi 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 Service- Abhängigkeiten 18
Aurich – Jonas Jacobi Hands-On (Teil 3) OSGi Services 19
Aurich – Jonas Jacobi 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 20