O'Reilly logo

Die OSGi Service Platform: Eine Einführung mit Eclipse Equinox by Matthias Lübken, Bernd Kolb, Nils Hartmann, Gerd Wütherich

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

5 Package-Abhängigkeiten zwischen Bundles78
String message = String.format(translatedMsg, args);
System.out.println(message);
}
}
Wenn Sie Ihre Änderungen an der Activator-Klasse speichern, werden
Sie feststellen, dass Eclipse nicht in der Lage ist, das Package
org.osgibook.translation aufzulösen. Da Sie dieses Package aus einem
anderen Bundle nutzen möchten, müssen Sie es explizit importieren,
bevor Sie es benutzen können. Ändern Sie dazu den Import-Package-
Header in der Manifest-Datei des »Hello World«-Bundles und fügen
Sie das Package org.osgibook.translation zur Auflistung der importier-
ten Packages hinzu:
1
Import-Package: org.osgibook.translation,
org.osgi.framework;version="1.4.0"
Wenn Sie Ihre Änderung nun speichern, sehen Sie, dass Eclipse jetzt in
der Lage ist, die Activator-Klasse fehlerfrei zu kompilieren.
Schritt 3: Ausführen des Beispiels
Starten Sie nun das »Hello World«-Bundle über den »Hello World«-
Launcher. Achten Sie darauf, dass das neue »Translation«-Bundle in
der Run-Konfiguration ausgewählt ist (siehe Abb. 5–4).
1. Auch hier gilt: Sie können die zu importierenden Packages auch im Plug-in-Mani-
fest-Editor auf der Seite »Dependencies« unter »Imported Packages« mit der
»Add...«-Schaltfläche hinzufügen.
Abb. 5–4
Die Launch-
Konfiguration
795.2 Exportieren von Packages
Sie sehen die geänderte Begrüßungsnachricht auf der OSGi-Konsole:
osgi> Hallo OSGi-Welt sagt Bundle org.osgibook.helloworld!
Falls Sie auf einem englischsprachigen System arbeiten, dann wird
Ihnen die folgende Begrüßungsnachricht ausgegeben:
osgi> Hello OSGi World from bundle org.osgibook.helloworld!
Damit haben Sie nun einen ersten praktischen Einblick in die Package-
Abhängigkeiten zwischen Bundles bekommen. In den folgenden
Unterkapiteln werden wir Ihnen die zugrunde liegenden Konzepte im
Detail vorstellen.
5.2 Exportieren von Packages
Die Klassen eines Bundles sind für andere Bundles zunächst nicht
sichtbar. Damit diese in anderen Bundles genutzt werden können, müs-
sen sie vom implementierenden Bundle explizit exportiert und vom
nutzenden Bundle explizit importiert werden.
Der Export-
Package-Header
Das Exportieren von Klassen erfolgt im OSGi Framework auf
Package-Ebene. Um ein oder mehrere Packages eines Bundles zu
exportieren, müssen Sie über den Manifest Header
Export-Package eine
(kommaseparierte) Liste mit allen Packages angeben:
Export-Package: org.osgibook.translation
Die obige Anweisung exportiert bspw. das Package org.osgi-
book.translation für die Nutzung in anderen Bundles (vgl. Abb. 5–5).
Class Filtering
Sie können die Menge der exportierten Klassen einschränken, indem
Sie die
exclude- bzw. include-Direktiven des Export-Package-Headers
verwenden. Eine Klasse wird dann nur exportiert, wenn sie einerseits
mit der
include-Direktive erfasst wird, andererseits aber nicht durch
die
exclude-Direktive ausgeschlossen ist. In den Direktiven geben Sie
die Klassennamen jeweils ohne ihren Package-Namen an. Um mehrere
Abb. 5–5
Exportieren von
Packages
META-INF
MANIFEST.MF
org.osgibook.translation.impl
org.osgibook.translation
META
-
INF
M
ANIFE
S
T.MF
Export-Package: org.osgibook.translation
5 Package-Abhängigkeiten zwischen Bundles80
Klassen auf einmal zu erfassen, können Sie einen Klassennamen mit
einem oder mehreren
* trunkieren:
Export-Package: org.osgibook.translation;
include:=“TranslationService*“
Mit diesem Header exportieren Sie alle Klassen aus dem Package
org.osgibook.translation, deren Name mit TranslationService beginnt.
Der Defaultwert der
include-Direktive ist die Wildcard *, der allen
Klassennamen entspricht. Die
exclude-Direktive ist per Default leer, so
dass alle Klassen eines Packages sichtbar sind.
5.3 Importieren von Packages
Wenn Sie in Ihrem Bundle Klassen eines anderen Bundles nutzen
möchten, müssen Sie die benötigen Packages in Ihrem Bundle explizit
importieren. Die Spezifikation der OSGi Platform definiert zwei ver-
schiedene Bundle Manifest Header, mit denen die Abhängigkeit zu
anderen Packages bzw. Bundles definiert werden kann:
Import-Package
und Require-Bundle.
5.3.1 Importieren mit Import-Package
Mit dem Bundle Manifest Header Import-Package spezifizieren Sie die
Abhängigkeit zu einem (oder mehreren) Package, indem Sie eine (kom-
maseparierte) Liste mit allen Packages angeben, die von Ihrem Bundle
benötigt werden. Mit der folgenden Angabe importieren Sie bspw. das
Package
org.osgibook.translation und machen es in Ihrem Bundle ver-
fügbar (vgl. Abb. 5–6):
Import-Package: org.osgibook.translation
Das OSGi Framework versucht vor dem Starten eines Bundles, dessen
Abhängigkeiten aufzulösen. Für alle im Import-Package-Header auf-
geführten benötigten Packages bedeutet das, dass das OSGi Frame-
work versucht, dem Bundle entsprechende exportierte Packages bereit-
zustellen.
Abb. 5–6
Import-Package
MANIFEST.MF
META-INF
org.osgibook.helloworld
META-INF
MANIFEST.MF
org.osgibook.translation.impl
org.osgibook.translation
MANIFE
S
T.M
F
META
-
INF
org osgibook helloworld
MET
M
or
g
.
o
Import-Package: org.osgibook.translation
815.3 Importieren von Packages
Optionale Imports bei
Import-Package
Wenn die OSGi-Laufzeitumgebung kein Bundle findet, das ein
über
Import-Packages importiertes Package exportiert, bleibt das
Bundle, das diesen Import benötigt, im Zustand
installed und kann
nicht gestartet werden. Mit dem Parameter
resolution können Sie
jedoch ein Package als optional deklarieren. In diesem Falle würde das
Framework die
Import-Package-Anweisung ignorieren, falls kein ent-
sprechendes exportiertes Package im System installiert ist.
Import-Package: org.osgibook.translation;
resolution:=optional
Damit stehen Ihnen natürlich zur Laufzeit auch die Klassen dieses
Packages nicht zur Verfügung. Sinnvoll ist die Verwendung von optio-
nalen Packages bspw. dann, wenn ein Bundle eine bestimmte Funktio-
nalität in Abhängigkeit der Existenz eines Packages erbringt: So kann
ein Bundle bspw. beim Vorhandensein einer Logging-API während sei-
ner Ausführung Log-Meldungen ausgeben. Ist die Logging-API hin-
gegen nicht verfügbar, kann das Bundle trotzdem seine eigentliche Auf-
gabe erfüllen, lediglich die Ausgabe der Log-Nachricht wäre in diesem
Falle nicht möglich.
5.3.2 Importieren mit Require-Bundle
Mit dem Bundle Manifest Header Require-Bundle spezifizieren Sie
Abhängigkeiten eines Bundles zu einem oder mehrerer Bundles. Mit
dem folgenden Bundle-Header definieren Sie bspw. die Abhängigkeit
zum Bundle
org.osgibook.translation (vgl. auch Abb. 5–7):
Require-Bundle: org.osgibook.translation
Im Gegensatz zum Import-Package-Header, mit dem Sie gezielt ein oder
mehrere Packages in Ihr Bundle importieren, werden mit dem
Require-
Bundle
-Header alle Packages, die das referenzierte Bundle exportiert,
in Ihr Bundle importiert.
Optionale Bundles
Falls im OSGi Framework eines der über den Bundle Manifest Header
Require-Bundle spezifizierten Bundles nicht verfügbar ist, kann Ihr
Abb. 5–7
Require-Bundle
MANIFEST.MF
META-INF
org.osgibook.helloworld
META-INF
MANIFEST.MF
org.osgibook.translation.impl
org.osgibook.translation
MANIFE
S
T.M
F
META
-
INF
org osgibook helloworld
MET
M
or
g
.
o
Require-Bundle: org.osgibook.translation

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required