2017-03-31 1 views
2

J'utilise Karaf (2.4. * & 4.0. *) Depuis deux ans, dans différentes missions, et chaque fois j'ai fait face problème de mise en cache avec les ensembles d'API lorsqu'il s'agit de les désinstaller/installer.Karaf: Méthode recommandée pour désinstaller/installer le paquet de l'API, et comment éviter la résolution du paquet fantôme

Imaginons le scénario suivant:

  1. installer (1) Service-api/1.0.0, l'exportation com.service.api
  2. -je installer (2) Service-core/1.0.0 , qui importe com.service.api
  3. Je désinstalle service-api/1.0.0.
  4. J'installe (3) service-api/1.1.0, qui ajoute de nouvelles interfaces.

Le comportement différent se produit lorsque j'utilise paquet: -s installer pour installer des paquets, désinstaller pour les désinstaller:

  1. Le -core est pas toujours arrêté. En fait, il utilise une version en cache de service-api. Je peux même voir le bundle id (1) quand je fais un import -i (2). Faire un "resolve (2)" ne résout pas le problème, seul le fait de "stopper (2)" le relance alors. Quand j'installe service-api/1.1.0, le bogue dans 3 se produit toujours et mon noyau de service utilise à nouveau l'ancien -api. Le gros problème est que si j'installe un nouveau service-soap, il utilisera le bundle (3), alors que le (2) utilise le (1), et donc il crée un conflit entre classloader.

Je ne peux trouver aucune ressource à ce sujet sur Internet, et je l'ai essayé Equinox & Felix et je ne vois pas de solution à ce problème. Est-bundle: installer le bon moyen d'installer bundle? Est-ce que l'utilisation de deploy est une meilleure solution? Bonus: Dans les spécifications OSGI, un bundle ne doit pas être désinstallé tant que toutes les références ne sont pas libérées, mais dans Karaf, le bundle se désinstalle directement. Peut-il être la cause du problème décrit ci-dessus?

Répondre

2

Ce que vous voyez est conforme aux spécifications OSGi. Lorsque vous désinstallez une API, tous les bundles qui l'utilisent l'utilisent jusqu'à ce qu'ils soient résolus à nouveau. Ce comportement a été introduit pour éviter les changements en cascade dans le moteur d'exécution.

Pour qu'un paquet prenne ou perd une API, vous devez résoudre le paquet. Le moyen le plus simple de le faire est d'utiliser la commande resolve. Qui résout un bundle donné ou tous les bundles.

Une autre façon de résoudre automatiquement les bundles consiste à toujours les installer à l'aide des fonctionnalités Apache Karaf. Lorsque vous installez/désinstallez des fonctionnalités, Karaf s'assurera toujours de résoudre tous les paquets qui pourraient être affectés.

+0

Merci pour la réponse. Trouvé le document spec sur la désinstallation qui l'explique: https://osgi.org/javadoc/r4v43/core/org/osgi/framework/Bundle.html#uninstall(). –

2

Pour ajouter à la réponse de Christian - vous devez savoir comment fonctionnent les différentes méthodes d'installation/désinstallation des bundles. Malheureusement, il semble n'y avoir aucun moyen standard! Par exemple, si vous désinstallez le shell gogo, il ne sera PAS résolu à nouveau. C'est-à-dire que les bundles utilisant le bundle supprimé continueront à se comporter comme si rien ne s'était produit jusqu'à ce qu'ils soient résolus de nouveau. Cependant, si vous installez puis désinstallez via fileinstall, il sera résolu automatiquement. Même chose avec les caractéristiques de Karaf comme Christian l'a souligné.

Comme vous pouvez le voir here, ce que vous décrivez n'est pas un problème spécifique de Karaf.