3 Stimmen

OSGI: Ist es möglich, Pakete zu importieren, ohne das Bundle zu aktivieren?

Ist es möglich, ein Paket aus einem anderen Bundle zu importieren, ohne dessen Aktivator aufzurufen? Für dieses Paket sind keine Bundle-Initialisierungen erforderlich. Ich verstehe, dass dies schlechtes Design ist, aber ich kann es nicht ändern.

Eine Ausnahme:

org.osgi.framework.BundleException: The activator my-package.Activator for bundle my-bundle is invalid
at org.eclipse.osgi.framework.internal.core.AbstractBundle.loadBundleActivator(AbstractBundle.java:157)  
at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:750)  
at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:352)  
at org.eclipse.osgi.framework.internal.core.AbstractBundle.resume(AbstractBundle.java:370)  
at org.eclipse.osgi.framework.internal.core.Framework.resumeBundle(Framework.java:1068)  
at org.eclipse.osgi.framework.internal.core.StartLevelManager.resumeBundles(StartLevelManager.java:557)  
at org.eclipse.osgi.framework.internal.core.StartLevelManager.incFWSL(StartLevelManager.java:464)
at org.eclipse.osgi.framework.internal.core.StartLevelManager.doSetStartLevel(StartLevelManager.java:248)  
at org.eclipse.osgi.framework.internal.core.StartLevelManager.dispatchEvent(StartLevelManager.java:445)  
at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:220)  
at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:330)

8voto

pooh Punkte 662

Ja, das ist möglich, die OSGi-Spezifikation erlaubt es, und es ist nicht einmal eine schlechte Praxis.

Lassen Sie mich sehen, ob ich Sie richtig verstanden habe. Sie haben Bundle A, das in seinem Manifest ein Paket exportiert, und Bundle B, das es importiert. Sie wollen das tun, ohne Bundle A zu starten, richtig?

Ja, das ist möglich. Wenn der einzige Zweck von Bundle A darin besteht, einige Java-Klassen und -Pakete bereitzustellen, wie z. B. eine Bibliothek, kann es sogar keinen Aktivator haben. Gemäß der OSGi-Spezifikation sind alle exportierten Pakete eines Bundles für andere Bundles verfügbar, sobald das Bundle in den aufgelösten Zustand übergeht (d. h. es ist installiert, die Abhängigkeiten sind aufgelöst, aber es ist noch nicht gestartet).

Der Zustand von Bündel B, das Bündel A verwendet, spielt keine Rolle. Es spielt auch keine Rolle, ob Bundle B Klassen aus dem importierten Paket verwendet oder nicht. Sie müssen auch nichts Besonderes tun, sondern nur die Abhängigkeit auf die übliche OSGi-Art deklarieren:

Manifest des Bündels A: Export-Paket: com.acme.aaa

Bündel B manifestieren: Import-Paket: com.acme.aaa

Sie sollten Bundle A installieren und prüfen, ob es in den Status RESOLVED übergegangen ist, d. h. ob seine Abhängigkeiten im System erfüllt sind. Wenn ja, können Sie es so belassen und in Bundle B verwenden.

Die oben genannten Personen verwechseln wahrscheinlich den Import von Paketen mit der Verwendung eines SERVICE in OSGi. Die Bereitstellung eines SERVICE (d.h. eines "lebenden" Java-Objekts) erfordert, dass das Bundle gestartet und sein Aktivator aufgerufen wird. Beim Exportieren von Paketen ist das nicht der Fall.

0voto

Marko Topolnik Punkte 188258

Según la OSGi-Spezifikation ist dies nicht möglich. Ihre einzigen Optionen sind die eifrige und die faule Aktivierung, die beide bereits erfolgt sind, bevor Sie eine Klasse aus dem Bundle beobachten.

BTW Wenn Sie wirklich nur ein Paket importieren, ohne jemals auf irgendwelche Klassen zu verweisen, dann wird ein lazy-aktiviertes Bundle nicht aktiviert werden. Ich bezweifle jedoch, dass dies Ihr Fall ist.

0voto

Frank Lee Punkte 2638

Wenn sich ein Bundle im aufgelösten Zustand befindet, können Sie sein Paket importieren, es wurde (noch?) nicht gestartet.

Also: Installieren Sie das Paket und starten Sie es einfach nicht. Ich denke, es hängt vom Kontext ab, ob das eine gute Idee ist oder nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X