2017-03-31 1 views
2

Ich benutze Karaf (2.4. * & 4.0. *) Für die letzten zwei Jahre in verschiedenen Missionen und jedes Mal, wenn ich konfrontiert Caching-Problem mit API-Bundles, wenn es um die Deinstallation/Installation geht.Karaf: Empfohlene Möglichkeit, API-Paket zu deinstallieren/zu installieren, und wie Ghost Bundle-Auflösung zu vermeiden

Lassen Sie uns das folgende Szenario vor:

  1. ich installieren (1) Service-api/1.0.0, Export com.service.api
  2. installieren I (2) Service-core/1.0.0 , die com.service.api importiert
  3. Ich deinstalliere Service-API/1.0.0.
  4. Ich installiere (3) Service-API/1.1.0, die neue Schnittstellen hinzufügt.

Das unterschiedliche Verhalten tritt auf, wenn ich Bündel verwenden: Installieren -s Bundles zu installieren, deinstallieren Sie sie deinstallieren:

  1. Die -Core nicht immer gestoppt. Tatsächlich benutzt er eine zwischengespeicherte Version von Service-API. Ich kann sogar die Bündel-ID (1) sehen, wenn ich einen Import -i (2) mache. Ein "resolve (2)" löst das Problem nicht, nur die Tatsache, "stop (2)" dann startet es wieder.

  2. Wenn ich Service-API/1.1.0 installiere, tritt der Bug in 3 immer noch auf und mein Service-Core benutzt wieder den alten -api. Das große Problem ist, wenn ich eine neue Service-Seife installiere, wird es das Bündel (3) verwenden, während das (2) das (1) verwendet, und so schafft es einen Konflikt zwischen dem Klassenlader.

Ich kann keine Ressource auf dieser Angelegenheit im Internet finden, und ich habe versucht, Equinox & Felix und ich sehe keine Lösung für dieses Problem. Ist Paket: installieren Sie die gute Möglichkeit, Paket zu installieren? Ist die Verwendung von Deploy eine bessere Lösung?

Bonus: In der OSGI-Spezifikation sollte ein Bundle erst deinstalliert werden, wenn alle Verweise freigegeben sind, aber in Karaf deinstalliert sich das Bundle direkt selbst. Könnte es die Ursache des oben beschriebenen Problems sein?

Antwort

2

Was Sie sehen, entspricht den OSGi-Spezifikationen. Wenn Sie eine API deinstallieren, werden alle Pakete, die sie verwenden, weiterhin verwendet, bis sie erneut aufgelöst werden. Dieses Verhalten wurde eingeführt, um kaskadierende Änderungen in der Laufzeit zu vermeiden.

Um ein Bündel abzuholen oder eine API zu verlieren, müssen Sie das Bündel auflösen. Der einfachste Weg dazu besteht in der Verwendung des Befehls resolve. Welches löst ein bestimmtes Bündel oder alle Bündel auf.

Eine weitere Möglichkeit zur automatischen Auflösung von Bundles besteht darin, sie immer mithilfe der Apache Karaf-Funktionen zu installieren. Wenn Sie Features installieren/deinstallieren, stellt Karaf immer sicher, dass alle Pakete, die betroffen sein könnten, erneut aufgelöst werden.

+0

Vielen Dank für die Antwort. Habe das Dokument zur Deinstallation gefunden, das es erklärt: https://osgi.org/javadoc/r4v43/core/org/osgi/framework/Bundle.html#uninstall(). –

2

Um Christians Antwort hinzuzufügen - müssen Sie sich bewusst sein, wie verschiedene Methoden zum Installieren/Deinstallieren von Bundles funktionieren. Leider scheint es keinen Standardweg zu geben!

Zum Beispiel, wenn Sie von gogo Shell deinstallieren wird es nicht wieder auflösen. Das heißt, Bündel, die das entfernte Bündel verwenden, verhalten sich immer noch so, als ob nichts passiert wäre, bis sie wieder aufgelöst werden. Wenn Sie jedoch installieren und dann über fileinstall deinstallieren, wird es automatisch wieder aufgelöst. Das Gleiche gilt für Karaf-Features, wie Christian darauf hingewiesen hat.

Wie Sie sehen können here, was Sie beschreiben, ist kein Karaf-spezifisches Problem.

Verwandte Themen