Greifen Sie in der Anwendung auf den OSGI-Bundle-Kontext zu
-
26-12-2019 - |
Frage
Ich versuche, auf den Kontext des OSGI-Bundles in einer Java-Anwendung zuzugreifen, um einen laufenden Dienst zu erhalten.
ctx.getServiceReference(ReceiverService.class.getName());
Ich habe es damit versucht:
BundleContext ctx = FrameworkUtil.getBundle(ReceiverService.class).getBundleContext();
aber es gibt null zurück
Ich initiiere Knopflerfish im Grafikmodus mit vorinstallierten Bundles und starte das SenderSevice-Bundle und das ReceiveService-Bundle.Ich möchte auf ReceiveService zugreifen, um die empfangenen Objekte in einer Java-Anwendung zu verwenden.Daher muss ich auf den Bundle-Kontext von ReceiveService zugreifen.
Lösung
Woher wird die Schnittstelle „ReceiveService“ geladen?Wird es aus einem Bundle exportiert?Leider kann das System-Bundle keine Pakete aus gewöhnlichen Bundles importieren.
Da Sie OSGi einbetten und in Form von Diensten zwischen der äußeren Anwendung und dem inneren Framework kommunizieren, müssen die Schnittstellenpakete von der äußeren Anwendung geladen und mit exportiert werden org.osgi.framework.system.packages.extra
Eigentum.Diese Eigenschaft wird über die Karte übergeben, die Sie bereitstellen FrameworkFactory.newFramework()
.Dann können die gewöhnlichen Bundles die Serviceschnittstelle importieren und den Service veröffentlichen.
Um auf a zuzugreifen BundleContext
Von der äußeren Anwendung müssen Sie die verwenden getBundleContext()
Methode auf der Framework
Objekt.Dies gibt die zurück BundleContext
des Systembündels.
Andere Tipps
Sie scheinen ein in eine Java-Anwendung eingebettetes OSGi-Framework zu verwenden – wie haben Sie dieses Framework gestartet?
Der Standardweg wäre
Framework framework = FrameworkFactory.newFramework(props);
Dann können Sie den System-Bundle-Kontext von abrufen framework
Beispiel:
BundleContext ctx = framework.getBundleContext();
In deinem Beispiel, ReceiverService
wurde höchstwahrscheinlich vom Anwendungs-Klassenlader und nicht von einem Bundle-Klassenlader geladen FrameworkUtil
Das Bundle, das diese Klasse geladen hat, kann nicht ermittelt werden.