OSGi
Struktur
Motivation
- Eclipse Framework:
Definition
- OSGi Framework
- ist eine offene, modulare und skalierbare „Service Delivery Platform“ auf Java-Basis, die dem Idealmodell einer Service Oriented Architecture (SOA) entspricht.( nach wikipedia.de )
Einsatzgebiete
- Steuererung und Vernetzung von Geräten
- Telematik
- mobile Endgeräte
- Heimvernetzung
- Gebäudeverwaltung
- industrielle Automatisierung
- Integrierte Entwicklungsumgebung Eclipse in Form des Equinox-Frameworks (seit 2004 Eclipse 3.0)
Organisation
- 1999 wurde die OSGi Alliance gegründet
- Mitglieder sind unter Anderen Sun Microsystems, IBM, Nokia, Motorola, Oracle, NEC, Hitachi, Sprint, Samsung, Siemens, Telefónica, BEA und Deutsche Telekom
Spezifikationen
Die OSGi Alliance selbst spezifiziert lediglich die APIs und Testcases für OSGi-Implementierungen von Dritter Seite und stellt im Rahmen dessen auch eine Referenzimplementierung zur Verfügung.Framework
Plugins in das OSGi Framework werden als Bundles bezeichnet.
Ein Bundle besteht aus einer Manifest Datei, einem Activator und dem Programmcode.
Diesen Bundles wird durch das OSGi Framework eine Ablaufumgebung zur Verfügung gestellt, die aus vier Schichten besteht.
- Ablaufumgebung
- minimale Java Virtual Maschine
- Module
- jedes Bundle ist eine jar Datei, besitzt seine eigenen Klassen und seinen eigenen Classloader
- jedes Bundle kann in jeder OSGi Implementierung laufen
- jedes Bundle spezifiziert, was es importieren und exportieren will
- Versionierung auf Modulebene
- Lebenszyklus
- jedes Bundle muß einen definierte Lebenszyklen unterstützen
- jedes Bundle muß einen BundleActivator mit start und stop Methoden implementieren
- der Activator erhält einen Bundlecontext um auf die Framework Funktionalität zugreifen zu können
package helloworld;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
public class Activator implements BundleActivator {
/*
* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
*/
public void start(BundleContext context) throws Exception {
System.out.println("Hello World!!");
}
/*
* (non-Javadoc)
* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
*/
public void stop(BundleContext context) throws Exception {
System.out.println("Goodbye World!!");
}
}
- Service Registratur
- damit die einzelnen Services miteinander kommunizieren können, registrieren sich die Services bei der Service Registratur
- OSGi bricht einen reichen Satz an Services mit http://www.osgi.org/About/Technology
- mit einer LDAP basierten Query Abfrage kann die Service Registratur befragt werden
OSGi Konzepte
- Bundle
- Charakteristik
- auslieferbare Applikation
- registriert Services
- Inhalt
- Manifest Datei MANIFEST.MF mit Attributen
- Bundle-Activator
- Bundle-ClassPath
- Bundle-Version
- Export-Package
- Import-Package
- Require-Bundle
- Code (jar Datei)
- Ressources (Bilder)
- Manifest Datei MANIFEST.MF mit Attributen
- Aktionen des OSGi Frameworks
- Startup
- liest das Manifest
- installiert den Code und die Ressourcen
- löst Abhängigkeiten zwischen den Bundles auf
- Laufzeit
- startet das Bundle über den BundleActivator
- verwaltet den Java Classpath abhängig vom Bundle
- verwaltet die Bundle Abhängigkeiten
- stoppt das Bundle über den BundleActivator
- Startup
- Charakteristik
- Service
- Charakteristik
- registriertes Objekt im Framework
- können sich als Listener im Framework registrieren Abhängigkeiten der Services auflösen
- durch Java Interfaces spezifiziert
- kann durch ein Bundle gebunden, gesucht oder registriert werden
- mehrere Services können das gleiche Interface implementieren
- OSGi definierten einen Standardsatz an Services
- besitzt eine eindeutige ID
- Charakteristik
Implementierung
Es gibt mehrere OSGi Implementierung: http://de.wikipedia.org/wiki/OSGi#OSGi-Frameworks.Equinox
- OpenSource Community, basierend auf der OSGi Technologie
- OSGi Framework Implementierung
- Eclipse suchte eine standardisierte, offene, dynamische und modulare Laufzeitumgebung um
- Bundle zur Laufzeit installieren, neu laden und entfernen zu können
- unflexible jar Datei durch Metadaten (Versionen, Abhängigkeiten .. ) zu ergänzen MANIFEST.MF
- Kern von Eclipse ( seit 3.0 )
- setzt die OSGi Spezifikation R4 um: http://www.eclipse.org/equinox/bundles/
- Eclipse suchte eine standardisierte, offene, dynamische und modulare Laufzeitumgebung um
- Entwicklungsumgebung für OSGi Bundles
- können über den Bundle Context referenziert werden
OSGi Console
- erlaubt den Zugriff auf die
- Eclipse Runtime
- OSGi Framework
- alle Bundles
- gibt Statusinformation zu Bundles und Services
Beispiele
helloworld Bundle
Erstellung eines Plug-In Projekts, das in jeder OSGi Implementierung ausgeführt werden kann.- Neues Projekt anlegen
- Plug-In Project Wizard auswählen
- Plug-In Project
- Namen vergeben
- Ziel Plattform auswählen (OSGi-Framework) 1 Plug-In Content
- vergewissen, das der Activator Erzeuger gesetzt ist 1 Templates
- Hello OSGi-Bundle als Template auswählen
- OSGi Bundle verwalten
- OSGi Bundle starten
- Run Run ..
- Neue Configuration anlegen (Equinox OSGi Framework)
- Plug-In auswählen
- notwendige Plug-Ins hinzufügen
- Plug-In Environment validieren
- Run
Eclipse Instanz
- starte eclipse mit der console
grimm@laiard ~ $ eclipse -console
- Befehlsumfang der Konsole
- help
- Verwalten des OSGi-Frameworks Eclipse Instanz
- Verwalten des Bundels (Plug-Ins) Lebenszyklus des Bundles
- Statusinformationen zu Bundles und Services:
- Welche Bundles sind installiert ? In welchem Lebenszyklus befinden sie sich?
osgi> ss
Framework is launched.
id State Bundle
0 ACTIVE system.bundle_3.2.2.R32x_v20061101
1 ACTIVE org.eclipse.equinox.common_3.2.0.v20060603
2 ACTIVE org.eclipse.update.configurator_3.2.1.v20092006
3 ACTIVE org.eclipse.core.runtime_3.2.0.v20060603
4 RESOLVED org.eclipse.pde.source_3.2.1.r321_v20060823-6vYLLdQ3Nk8DrFG
6 ACTIVE org.eclipse.core.contenttype_3.2.0.v20060603
7 RESOLVED org.eclipse.core.variables_3.1.100.v20060605
8 ACTIVE org.eclipse.core.runtime.compatibility.auth_3.2.0.v20060601
9 RESOLVED org.eclipse.team.cvs.ssh_3.2.0.I200606011710
10 ACTIVE org.eclipse.equinox.registry_3.2.1.R32x_v20060814
... - Welche Services sind registriert und wer nutzt diese?
osgi> services
{org.osgi.service.packageadmin.PackageAdmin}={
service.ranking=2147483647,
service.pid=0.org.eclipse.osgi.framework.internal.core.PackageAdminImpl,
service.vendor=Eclipse.org, service.id=1}
Registered by bundle: System Bundle [0]
Bundles using service:
System Bundle [0]
initial@reference:file:plugins/org.eclipse.update.configurator_3.2.1.v20092006.jar/ [2]
update@plugins/org.eclipse.equinox.registry_3.2.1.R32x_v20060814.jar [10]
initial@reference:file:plugins/org.eclipse.core.runtime_3.2.0.v20060603.jar/ [3]
update@plugins/org.eclipse.equinox.preferences_3.2.1.R32x_v20060717.jar [59]
update@plugins/org.eclipse.core.jobs_3.2.0.v20060603.jar [41]
initial@reference:file:plugins/org.eclipse.equinox.common_3.2.0.v20060603.jar/ [1]
update@plugins/org.eclipse.debug.ui_3.2.1.v20060823.jar 57]
{org.osgi.service.startlevel.StartLevel}={service.ranking=2147483647,
service.pid=0.org.eclipse.osgi.framework.internal.core.StartLevelManager,
service.vendor=Eclipse.org, service.id=2}
Registered by bundle: System Bundle [0]
No bundles using service.
... - Welche Pakete importiert und exportiert ein Bundle direkt oder indirekt?
- Detailierte Information über ein Bundle.
osgi> bundle 10
update@plugins/org.eclipse.equinox.registry_3.2.1.R32x_v20060814.jar [10]
Id=10, Status=ACTIVE
Data Root=/net/laiard/fs2/home/grimm/eclipse/eclipse3.2/configuration/org.eclipse.osgi/bundles/10/data
Registered Services
{org.eclipse.core.runtime.IExtensionRegistry}={service.id=25}
Services in use:
{org.eclipse.osgi.service.datalocation.Location}={type=osgi.configuration.area, service.id=9}
{org.eclipse.core.runtime.IExtensionRegistry}={service.id=25}
{org.eclipse.osgi.service.resolver.PlatformAdmin}={
service.ranking=2147483647,
service.pid=0.org.eclipse.osgi.internal.baseadaptor.StateManager,
service.vendor=Eclipse.org,
service.id=13}
{org.osgi.service.packageadmin.PackageAdmin}={
service.ranking=2147483647,
service.pid=0.org.eclipse.osgi.framework.internal.core.PackageAdminImpl,
service.vendor=Eclipse.org,
service.id=1}
Exported packages
org.eclipse.core.internal.registry; version="0.0.0"[exported]
org.eclipse.core.internal.registry.osgi; version="0.0.0"[exported]
org.eclipse.core.internal.registry.spi; version="0.0.0"[exported]
org.eclipse.core.runtime; version="0.0.0"[exported]
org.eclipse.core.runtime.dynamichelpers; version="0.0.0"[exported]
org.eclipse.core.runtime.spi; version="0.0.0"[exported]
Imported packages
org.eclipse.osgi.service.datalocation; version="1.0.0"<System Bundle [0]>
org.eclipse.osgi.service.debug; version="1.0.0"<System Bundle [0]>
org.eclipse.osgi.service.environment; version="1.0.0"<System Bundle [0]>
org.eclipse.osgi.service.resolver; version="1.0.0"<System Bundle [0]>
org.eclipse.osgi.storagemanager; version="1.0.0"<System Bundle [0]>
org.eclipse.osgi.util; version="1.0.0"<System Bundle [0]>
org.osgi.framework; version="1.3.0"<System Bundle [0]>
org.osgi.service.packageadmin; version="1.2.0"<System Bundle [0]>
org.osgi.util.tracker; version="1.3.2"<System Bundle [0]>
javax.xml.parsers; version="0.0.0"<System Bundle [0]>
org.xml.sax; version="0.0.0"<System Bundle [0]>
org.xml.sax.helpers; version="0.0.0"<System Bundle [0]>
org.eclipse.core.internal.runtime;
version="0.0.0"<initial@reference:file:plugins/org.eclipse.equinox.common_3.2.0.v20060603.jar/ [1]>
org.eclipse.core.internal.boot;
version="0.0.0"<initial@reference:file:plugins/org.eclipse.equinox.common_3.2.0.v20060603.jar/ [1]>
org.eclipse.core.runtime;
version="0.0.0"<initial@reference:file:plugins/org.eclipse.equinox.common_3.2.0.v20060603.jar/ [1]>
org.eclipse.core.internal.registry;
version="0.0.0"<update@plugins/org.eclipse.equinox.registry_3.2.1.R32x_v20060814.jar [10]>
org.eclipse.core.internal.registry.osgi;
version="0.0.0"<update@plugins/org.eclipse.equinox.registry_3.2.1.R32x_v20060814.jar [10]>
org.eclipse.core.internal.registry.spi;
version="0.0.0"<update@plugins/org.eclipse.equinox.registry_3.2.1.R32x_v20060814.jar [10]>
org.eclipse.core.runtime;
version="0.0.0"<update@plugins/org.eclipse.equinox.registry_3.2.1.R32x_v20060814.jar [10]>
org.eclipse.core.runtime.dynamichelpers;
version="0.0.0"<update@plugins/org.eclipse.equinox.registry_3.2.1.R32x_v20060814.jar [10]>
org.eclipse.core.runtime.spi;
version="0.0.0"<update@plugins/org.eclipse.equinox.registry_3.2.1.R32x_v20060814.jar [10]>
org.eclipse.core.runtime.jobs;
version="0.0.0"<update@plugins/org.eclipse.core.jobs_3.2.0.v20060603.jar [41]>
Fragment bundles
update@plugins/org.eclipse.core.runtime.compatibility.registry_3.2.1.R32x_v20060907/ [56]
Named class space
org.eclipse.equinox.registry; bundle-version="3.2.1.R32x_v20060814"[provided]
Required bundles
org.eclipse.equinox.common;
bundle-version="3.2.0.v20060603"<initial@reference:
file:
plugins/org.eclipse.equinox.common_3.2.0.v20060603.jar/ [1]> - Manifest Datei eines Bundles
osgi> headers 10
Bundle headers:
Bundle-Activator = org.eclipse.core.internal.registry.osgi.Activator
Bundle-ClassPath = runtime_registry_compatibility.jar, .
Bundle-Localization = plugin
Bundle-ManifestVersion = 2
Bundle-Name = Extension Registry Support
Bundle-RequiredExecutionEnvironment = J2SE-1.4,CDC-1.0/Foundation-1.0,J2SE-1.3
Bundle-SymbolicName = org.eclipse.equinox.registry; singleton:=true
Bundle-Vendor = Eclipse.org
Bundle-Version = 3.2.1.R32x_v20060814
Eclipse-ExtensibleAPI = true
Eclipse-LazyStart = true
Export-Package = org.eclipse.core.internal.registry;x-friends:="org.eclipse.core.runtime",
org.eclipse.core.internal.registry.osgi;x-friends:="org.eclipse.core.runtime",
org.eclipse.core.internal.registry.spi;x-internal:=true,
org.eclipse.core.runtime; registry="split"; mandatory:="registry",
org.eclipse.core.runtime.dynamichelpers,org.eclipse.core.runtime.spi
Import-Package = org.eclipse.core.runtime.jobs;resolution:=optional,
org.eclipse.osgi.storagemanager,
org.eclipse.osgi.util,
org.eclipse.osgi.service.datalocation,
org.eclipse.osgi.service.debug,
org.eclipse.osgi.service.environment,
org.eclipse.osgi.service.resolver,
org.osgi.framework,
org.osgi.service.packageadmin,
org.osgi.util.tracker,
org.xml.sax,org.xml.sax.helpers,
javax.xml.parsers
Manifest-Version = 1.0
Require-Bundle = org.eclipse.equinox.common;bundle-version="[3.2.0,4.0.0)" - Services können über LDAP Filter gesucht abgefragt werden.
osgi> services "(&(objectclass=org.eclipse.osgi.*)(service.vendor=Eclipse.org))"
{org.eclipse.osgi.framework.log.FrameworkLog}={service.ranking=2147483647,
service.pid=0.org.eclipse.core.runtime.adaptor.EclipseLog,
service.vendor=Eclipse.org, service.id=3}
Registered by bundle: System Bundle [0]
Bundles using service:
initial@reference:file:plugins/org.eclipse.update.configurator_3.2.1.v20092006.jar/ [2]
initial@reference:file:plugins/org.eclipse.core.runtime_3.2.0.v20060603.jar/ [3]
update@plugins/org.eclipse.equinox.preferences_3.2.1.R32x_v20060717.jar [59]
initial@reference:file:plugins/org.eclipse.equinox.common_3.2.0.v20060603.jar/ [1]
{org.eclipse.osgi.framework.log.FrameworkLog}={service.ranking=-2147483648, performance=true,
service.pid=46org.eclipse.core.runtime.adaptor.EclipseLog,
service.vendor=Eclipse.org, service.id=4}
Registered by bundle: System Bundle [0]
Bundles using service:
initial@reference:file:plugins/org.eclipse.core.runtime_3.2.0.v20060603.jar/ [3]
update@plugins/org.eclipse.equinox.preferences_3.2.1.R32x_v20060717.jar [59]
initial@reference:file:plugins/org.eclipse.equinox.common_3.2.0.v20060603.jar/ [1]
{org.eclipse.osgi.service.environment.EnvironmentInfo}={service.ranking=2147483647,
service.pid=0.org.eclipse.core.runtime.internal.adaptor.EclipseEnvironmentInfo,
service.vendor=Eclipse.org,
service.id=12}
Registered by bundle: System Bundle [0]
Bundles using service:
initial@reference:file:plugins/org.eclipse.core.runtime_3.2.0.v20060603.jar/ [3]
{org.eclipse.osgi.service.resolver.PlatformAdmin}={
service.ranking=2147483647,
service.pid=0.org.eclipse.osgi.internal.baseadaptor.StateManager,
service.vendor=Eclipse.org,
service.id=13}
Registered by bundle: System Bundle [0]
Bundles using service:
initial@reference:file:plugins/org.eclipse.update.configurator_3.2.1.v20092006.jar/ [2]
update@plugins/org.eclipse.equinox.registry_3.2.1.R32x_v20060814.jar [10]
initial@reference:file:plugins/org.eclipse.core.runtime_3.2.0.v20060603.jar/ [3]
{org.eclipse.osgi.service.pluginconversion.PluginConverter}={
service.ranking=2147483647,
service.pid=0.org.eclipse.core.runtime.internal.adaptor.PluginConverterImpl,
service.vendor=Eclipse.org,
service.id=14}
Registered by bundle: System Bundle [0]
No bundles using service.
{org.eclipse.osgi.framework.console.CommandProvider}={service.ranking=2147483647,
service.pid=0.org.eclipse.core.runtime.internal.adaptor.EclipseCommandProvider,
service.vendor=Eclipse.org,
service.id=15}
Registered by bundle: System Bundle [0]
Bundles using service:
System Bundle [0]
{org.eclipse.osgi.service.localization.BundleLocalization}={
service.ranking=2147483647,
service.pid=0.org.eclipse.core.runtime.internal.adaptor.BundleLocalizationImpl,
service.vendor=Eclipse.org,
service.id=16}
Registered by bundle: System Bundle [0]
Bundles using service:
initial@reference:file:plugins/org.eclipse.equinox.common_3.2.0.v20060603.jar/ [1]
- Welche Bundles sind installiert ? In welchem Lebenszyklus befinden sie sich?
OSGi Bundles installieren
Das OSGi Bundle Repositorybringt einen reichen Satz an Bundles mit.- Ablaufumgebung installieren
- Bundles installieren
Weiterlesen...