© DrHitch/Shutterstock.com
Modulare Software entwickeln mit OSGi

3 Bundles automatisch installieren


Aufbauend auf die Kapitel „Generisches Ressourcenmodell“ und „Resolving“ betrachtet dieses Kapitel die Möglichkeit des Provisionings: die Art und Weise, wie OSGi verwendet werden kann, um Bundles automatisch zu installieren.

Im letzten Kapitel wurde die Art und Weise, wie OSGi die Abhängigkeiten zwischen Bundles auflöst, betrachtet. Dieses Kapitel soll eine Übersicht geben, wie die „Repository-Service-Spezifikation“ [1] den Vorgang des „Resolvings“ unterstützt, um Abhängigkeiten auch mittels Bundles aus externen Repositories auflösen zu können.

Repository

Ein Repository ist ein physikalischer Ort, an dem Bun dles verfügbar gemacht werden. OSGi definiert nicht, in welcher Form Bundles abgelegt werden bzw. wie ein Index für den Zugriff aufgebaut sein muss, sondern beschreibt nur einen Vorschlag in der Spezifikation.

Der OSGi Service Repository ist so einfach wie möglich aufgebaut und bietet nur eine Methode an. Diese hat den Charakter einer Abfragemethode: Dem Repository wird eine Menge an Requirements übergeben und das Repository liefert eine Menge an Capabilities für jede Resource zurück:

interface Repository {
Map<Requirement, Collection<Capability>> findProviders(Collection<? extends Requirement> requirements);
}

Die Art und Weise, wie die Repository-Implementierung die Anfrage bearbeitet, ist nicht Teil der Spezifikation, sondern wird der Implementierung überlassen. Die Spezifikation definiert folgende OSGi Service Properties am Repository-Service:

  • service.pid – die eindeutige ID des Service
  • service.description – der Name/die Beschreibung
  • repository.url – eine oder mehrere URLs des Repositorys

Resource

Konnten zu einem gegebenen Requirement passende Capabilities gefunden werden, dann ist die Frage berechtigt, wie die damit verbundene Resource ermittelt werden kann. Wie im letzten Kapitel zu „Resolving“ beschrieben, ist eine Capability immer mit einer Resource verbunden, welche diese Fähigkeit zur Verfügung stellt. Somit kann die Resource mittels der Methode getResource() von der Capability abgefragt werden. Da der Repository-Service alle Capabilities zu einem Requirement liefert, kann ein Requirement natürlich auch von verschiedenen Resources befriedigt werden.

Von der Resource zum Bundle

Eine weitere Besonderheit von Resources, die vom Repository geliefert werden, ist, dass sie das Interface RepositoryContent implementieren:

interface RepositoryContent {
InputStream getContent();
}

Über die Methode getContent() kann das Bundle mithilfe eines Streams...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang