Ein OSGi-Fragment ist eine Java™-Archivdatei mit bestimmten Manifestheadern, durch die eine Verknüpfung zu einem angegebenen Host-Bundle bzw. Host-Bundles für die Funktionsausführung möglich ist. Fragmente werden als Teil der Host-Bundles betrachtet. Relevante Definitionen des Fragments werden mit den Host-Bundle-Definitionen zusammengeführt, bevor der Host aufgelöst wird, vorausgesetzt, die Informationen stehen nicht im Konflikt zueinander. Fragmentabhängigkeiten werden, sofern möglich, aufgelöst. Wenn die Fragmentabhängigkeiten nicht aufgelöst werden können, ist eine Verknüpfung des Fragments mit dem Host-Bundle nicht möglich. Ein Fragment kann keine eigenen Klassenlader oder Bundleaktivatoren haben. Es kann die in den Host-Bundles vorhandenen Informationen nicht überschreiben. Fragmente erweitern Bundles mit Ressourcen, Klassen und zulässigen Headern, sodass Sie Ihre Bundles anpassen können.
OSGi-Fragmentmanifestdateien
Eine OSGi-Fragment-JAR-Datei enthält eine Fragmentmanifestdatei. Mit den dieser Datei enthaltenen Metadaten kann das OSGi-Framework das Fragment mit einem Host-Bundle oder mehreren Host-Bundles verknüpfen.
Der folgende Beispielcode zeigt den Inhalt einer Anwendungsmanifestdatei mit dem Namen
META-INF/MANIFEST.MF:
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Fragment
Bundle-SymbolicName: Fragment
Bundle-Version: 1.0.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Fragment-Host: WebBundle;bundle-version=1.0.0.qualifier
Import-Package: org.apache.commons.logging;version="1.0.4"
Export-Package: com.sample.myservice.api;version="1.0.0"
Die Metadaten in dieser Manifestdatei enthalten die folgenden Schlüsseleigenschaften:
- Fragment-Host
- Verknüpft das Fragment mit den entsprechenden potenziellen Bundle-Hosts.
- Bundle-Version
- Dieser Header gibt die Version des Fragments an und ermöglicht die gleichzeitige Existenz mehrerer aktiver Versionen eines Bundles in derselben Frameworkinstanz.
- Bundle-Name
- Gibt einen lesbaren Namen für das Fragment an.
- Bundle-SymbolicName
- Eindeutige Identifizierung des Fragments im Framework. Diese Angabe ersetzt nicht den Header "Bundle-Name", der erforderlich ist.
- Import-Package
- Deklariert die externen Abhängigkeiten des Fragments, die vom OSGi-Framework für die Fragmentauflösung verwendet werden. Es können bestimmte Versionen oder Versionsbereiche für jedes Paket deklariert werden. In dieser Beispielmanifestdatei wird das Paket org.apache.commons.logging in der Version 1.0.4 oder höher vorausgesetzt.
- Verwenden Sie diese Eigenschaft, um die Namen der Pakete anzugeben, die von Ihrem Fragment zur Laufzeit importiert werden sollen. Wenn Sie in dieser Eigenschaft nicht das von Ihrem Bundle benötigte Paket angeben, tritt möglicherweise eine Ausnahme vom Typ NoClassDefFound und ein Kompilierungsfehler beim Laden des Bundles auf.
Anmerkung: Sie müssen dieses Paket auch in der Eigenschaft "Export-Package" des Bundles angeben, das das Paket enthält.
Einschränkung: Wenn Ihre Bundlemanifestdatei die Eigenschaft Import-Package verwendet, um eine Bundleabhängigkeit für ein Bundle zu deklarieren, das sich nicht in Ihrem Arbeitsbereich oder auf Ihrer Zielplattform befindet, markiert der Editor die Abhängigkeit als Fehler. Um diese Einschränkung zu umgehen, vergewissern Sie sich, dass sich alle von Ihnen deklarierten Abhängigkeitsbundles in Ihrem Arbeitsbereich befinden, oder verwenden Sie die Schnellkorrektur, um das Paket der Zielplattform hinzuzufügen. Wenn Sie die Schnellkorrektur verwenden möchten, wechseln Sie zur Ansicht "Markierung" und klicken Sie dann mit der rechten Maustaste auf die Fehlermarkierung und wählen Schnellkorrektur aus.
Wichtig: Wenn Sie Bundleabhängigkeiten in Ihrer Datei
MANIFEST.MF angeben, verwenden Sie die Eigenschaft
Import-Package anstelle von
Require-bundle. Wenn Sie
Require-bundle verwenden, um Bundleabhängigkeiten anzugeben, kann Ihre Anwendung nicht implementiert werden.
Die Verwendung der Eigenschaft
Import-Package ist bei der Deklaration von Abhängigkeiten die flexiblere Lösung:
- Sie können die Abhängigkeiten für die von Ihnen benötigte Funktionalität deklarieren statt das Bundle zu verwenden, auf dem die Funktionalität basiert, da auf diese Weise keine unnötigen Abhängigkeiten für Pakete hinzugefügt werden, die für Ihr Bundle nicht erforderlich sind, jedoch im Abhängigkeitsbundle enthalten sind.
- Sie können Versionen oder Versionsbereiche für das deklarierte Bundle angeben und müssen daher nicht auf Änderungen in den verschiedenen Bundleversionen reagieren.
- Export-Package
- Deklariert die Pakete, die außerhalb des Fragments sichtbar sind. Alle hier nicht deklarierten Pakete sind nur innerhalb des Fragments sichtbar.
- Verwenden Sie diese Eigenschaft, um die Namen der Pakete anzugeben, die von Ihrem Fragment zur Laufzeit exportiert werden sollen. Wenn Sie in dieser Eigenschaft
nicht die von anderen Bundles benötigten Pakete angeben, können die Abhängigkeitsbundles möglicherweise nicht aufgelöst werden.