OSGi-Anwendungen suchen
Sie können Klassen im Paket org.apache.aries.blueprint verwenden, um das OSGi-Anwendungsprogrammiermodell zu erweitern. Diese Systemprogrammierschnittstelle eines anderen Herstellers wird über das Server-Feature blueprint-1.0 bereitgestellt. Sie müssen auf OSGi-Anwendungsbundles zugreifen, um Ihre Erweiterungen anzuwenden. Im Liberty-Profil werden OSGi-Anwendungen als Subsysteme ausgeführt. Wenn Sie eine OSGi-Anwendung lokalisieren möchten, können Sie in einem Benutzerfeature einen ServiceTracker erstellen.
Informationen zu diesem Vorgang
In diesem Abschnitt wird beschrieben, wie der Entwickler eines Benutzerfeatures eine aktive OSGi-Anwendung finden kann. Dies ist oft erforderlich für Benutzerfeatures, die OSGi-Anwendungen Programmiermodellerweiterungen bereitstellen. Ein neues Benutzerfeature könnte beispielsweise solche Erweiterungen über die Implementierung eines neuen Bundle-Extenders (Erweiterungsprogramm), oft als Container bezeichnet, bereitstellen, oder noch einfacher, über Verfolgen und Aufrufen von Services, die innerhalb bestimmter OSGi-Anwendungen veröffentlich werden.
Solche Benutzerfeatures müssen den BundleContext einer bestimmten aktiven OSGi-Anwendung verwenden, um neue BundleTracker- und ServiceTracker-Instanzen zu erstellen. Dieser BundleContext kann aus dem Subsystem org.osgi.service.subsystem.Subsystem abgerufen werden, das der OSGi-Anwendung zugeordnet ist. Die folgende Prozedur beschreibt, wie Sie diesen SubSystem-Service abrufen.
Vorgehensweise
Wenn Sie eine OSGi-Anwendung lokalisieren möchten, indem Sie in einem Benutzerfeature einen ServiceTracker erstellen, führen Sie die folgenden Schritte aus:
- Erstellen Sie einen Filter org.osgi.framework.Filter mit dem Subsystem als Ziel, das Sie lokalisieren möchten.
- Erstellen Sie einen Service-Tracker org.osgi.util.tracker.ServiceTracker, der den Filter aus Schritt 1 verwendet, um den Service org.osgi.service.subsystem.Subsystem abzurufen, der der OSGi-Anwendung zugeordnet ist, die Sie lokalisieren möchten. Diese Subsystem-Serviceinstanz stellt alles bereit, was Sie für die Arbeit mit der OSGi-Anwendung benötigen.
Beispiel
import org.osgi.framework.BundleContext;
import org.osgi.service.subsystem.Subsystem;
import org.osgi.util.tracker.ServiceTracker;
import org.osgi.util.tracker.ServiceTrackerCustomizer;
String SERVICE_FILTER = "(&(objectClass=org.osgi.service.subsystem.Subsystem)
(subsystem.type=osgi.subsystem.application)(subsystem.symbolicName=my.app))"
org.osgi.framework.Filter filter = ctx.createFilter(SERVICE_FILTER);
org.osgi.util.tracker.ServiceTracker<Subsystem, Subsystem> str = new ServiceTracker<Subsystem, Subsystem>(ctx, filter, null);
org.osgi.framework.Constants.OBJECTCLASS;
org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_SYMBOLICNAME_PROPERTY;
org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_TYPE_APPLICATION;
org.osgi.service.subsystem.SubsystemConstants.SUBSYSTEM_TYPE_PROPERTY;