Inhaltsverzeichnis[Anzeigen]

 

OSGi

Struktur

Motivation

  • Eclipse Framework:
    eclipse-archtectur.gif

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 right 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.
800px-Osgi_history.png

Framework

osgi_frameworkBig.jpg

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

    OSGiLifecycle.jpg
    • 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

    osgi_service_interactionBig.gif
    • 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)
    • 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 ManifestEditor.gif
  • Service
    • Charakteristik
      • registriertes Objekt im Framework
      • können sich als Listener im Framework registrieren right 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

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 right MANIFEST.MF
    • Kern von Eclipse ( seit 3.0 )
    • setzt die OSGi Spezifikation R4 um: http://www.eclipse.org/equinox/bundles/
  • Entwicklungsumgebung für OSGi Bundles
  • können über den Bundle Context referenziert werden

OSGi Console

osgiConsole.gif

  • 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.
  1. Neues Projekt anlegen
    1. Plug-In Project Wizard auswählen
    2. 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
  2. OSGi Bundle verwalten
  3. OSGi Bundle starten
    1. Run right Run ..
    2. Neue Configuration anlegen (Equinox OSGi Framework)
      • Plug-In auswählen
      • notwendige Plug-Ins hinzufügen
      • Plug-In Environment validieren
    • Run

      helloworld.gif

Eclipse Instanz

  • starte eclipse mit der console
    grimm@laiard ~ $ eclipse -console     
  • Befehlsumfang der Konsole
    • help
  • Verwalten des OSGi-Frameworks right Eclipse Instanz
  • Verwalten des Bundels (Plug-Ins) right 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]

 

OSGi Bundles installieren

Das OSGi Bundle Repositorybringt einen reichen Satz an Bundles mit.
  • Ablaufumgebung installieren
  • Bundles installieren

Mentoring

Stay Informed about my Mentoring

 

Rezensionen

Tutorial

Besucher

Heute 577

Gestern 3357

Woche 12140

Monat 39457

Insgesamt 3892171

Aktuell sind 40 Gäste und keine Mitglieder online

Kubik-Rubik Joomla! Extensions

Abonniere den Newsletter (+ pdf Päckchen)

Beiträge-Archiv

Sourcecode

Neuste Kommentare