200 likes | 343 Views
OSGi Tutorial. 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
E N D
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 • OSGiAlliance • Bis 2004 Open Service Gateway Initiative • IBM, Oracle, Sun, Nokia, … • Verschiedene Implementierungen • Equinox, Felix, Knopflerfish, …
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) Applikations- Bundles (Benutzerdefiniert) OSGi Service Framework Java VM
OSGiBundles • OSGi Verpackung für • Applikation • Bibliothek • Beliebige Ressourcen • Dynamischer Lebenszyklus Uninstall Install Uninstalled Installed Uninstall Resolved Start Stopping Stop Starting Active explizit Automatisch
OSGiBundle 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
Hands-On (Teil 1) OSGiBundles
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
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
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 bar(x : ABC) Foo library.jar lib ABC …
OSGi Class Loading – Schwierigkeiten – Lösung Bundle A Bundle B import: B, lib export: B import: lib A { ABC var; B.Foo.bar(var); } B bar(x : ABC) Foo library.jar Bundle C lib classpath: library.jar export: lib ABC …
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!
Hands-On (Teil 2) Bundle Abhängigkeiten
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
Hands-On (Teil 3) Fragment-Bundles
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
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
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*))
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
Hands-On (Teil 3) OSGi Services
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“