Quand dois-je utiliser Import-Package et quand dois-je utiliser require-Bundle?
OSGi permet de dépendances à être déterminée par l'intermédiaire de Import-Package
qui, fils d'un seul paquet (exportées à partir de n'importe quel bundle), et Require-Bundle
, les câbles jusqu'à un nommé spécifique du bundle exportations.
Dans la construction d'une nouvelle application OSGi, l'approche qui dois-je utiliser pour représenter les dépendances? La plupart des forfaits sera interne, mais il y aura quelques dépendances externes (open-source) des paquets.
- À partir de eclipsesource.com/blogs/2009/07/14/... : “Regardez, require-Bundle est quelque chose qui a été utilisé dans Eclipse pour un certain temps, principalement pour des raisons d'héritage. Nous ne recommandons pas son utilisation plus. Import-Package est mieux si vous voulez un couplage lâche entre les faisceaux. Cependant, être conscient de la douleur split paquets peuvent causer.”
Vous devez vous connecter pour publier un commentaire.
Je crois
Require-Bundle
est une Éclipse chose (qui a maintenant fait dans le OSGi spec pour accueillir Eclipse). La "pure" OSGi façon est d'utiliser desImport-Package
, comme il se dissocie expressément le package à partir du bundle qui le fournit. Vous devriez être de déclarer les dépendances sur les fonctionnalités dont vous avez besoin (Java API fournie par une certaine version d'un paquet), au lieu d'où cette fonctionnalité est à venir à partir de (ce qui ne devrait pas question pour vous). Cela permet de maintenir la composition d'ensembles plus souple.JavaScript analogie: C'est comme pour détecter si un navigateur web prend en charge un certain API rapport à déduire de ce que la chaîne de l'agent utilisateur indique quel type de navigateur, il est.
Peter Kriens de l'OSGi Alliance a plus à dire à ce sujet sur le OSGi blog.
Probablement le seul cas où vous avez besoin d'utiliser
Require-Bundle
est si vous avez divisé les paquets, c'est un package qui est réparti sur plusieurs faisceaux. Diviser les paquets sont bien sûr fortement déconseillés.commons-logging
bundle vs en fonction decommons-logging
module API. Dans le dernier cas, vous pouvez basculer facilement de l'common-logging
bundle avec appropriée SLF4J adaptateur bundle qui exporte également lescommons-logging
module API et donc de façon transparente crée un pont decommons-logging
de SLF4J.Faveur de l'Import-Package plus require-Bundle.
Require-Bundle:
Import-Package:
Je crois Import-Package vous donne un couplage lâche et doit être préféré. Je l'utilise lors de la déclaration des dépendances sur les paquets que je n'ai pas, comme slf4j, et je peux échanger des implémentations comme je le souhaite. Je utiliser require-Bundle quand la dépendance est une chose que je peux contrôler, comme mon propre faisceaux, parce que tout changement important aurait vécu moi-même de toute façon.
Éviter Import-Package.
Comme les paquets de fournir plusieurs-à-plusieurs relations entre les grappes, elles sont sujettes à la dépendance des cycles qui sont difficiles à détecter et les éviter.
Require-Bundle d'autre part, les références d'un lot unique, rendant le graphe de dépendance des protégés de cycles par un trivial au moment de la construction de la vérifier.
Avec require-Bundle il est beaucoup plus facile à construire architecture en couches isolées bas niveau d'abstraction.
Import-Package
devrait être mieux parce que, comme dit précédemment, vous pouvez déplacer un package à partir d'un forfait à un autre sans changer de client existant MANIFESTE.MFMais...
Il y a une raison pratique à utiliser
Require-Bundle
si vous utilisez Eclipse pour développer vos faisceaux:Eclipse ne pas utiliser les paquets que les unités de la résolution. Il utilise des faisceaux. C'est, si vous utilisez un package d'un bundle, Eclipse compile votre bundle sans signaler tout problème avec l'utilisation du reste des paquets qui ne sont pas importés à partir de ce bundle.
Vous pourriez (vous êtes l'homme) pensent que tout est OK et télécharger votre bundle pour le déploiement, mais ... votre forfait pause au moment de l'exécution.
J'en suis sûr parce que ce problème est arrivé (pour moi!) aujourd'hui.
La bonne solution serait de changer l'Éclipse de chemin de classe conteneur, mais... si cela ne va pas être fait... vous pourriez décider d'éviter ce genre de problèmes nécessitant des faisceaux, au lieu de paquets, en payant le prix mentionné (pas de rétro-compatible code de mouvement entre les bundles).
Je ne suis pas convaincu que l'utilisation de l'Import-Package est mieux, parce que mon attente par défaut lorsque vous travaillez avec un bundle est de travailler avec les associés API publique. Pour cette raison, require-Bundle a plus de sens.