Quelle est l'utilisation prévue cas pour les Bundle-Classpath dans les bundles OSGI
Je suis en train d'essayer de comprendre l'intention de cas d'utilisation pour les Bundle-Classpath dans les bundles OSGI.
Ici est ma compréhension, merci de m'aider à comprendre si elle est correcte.
Disons que je suis en train de travailler sur la création d'un bundle OSGI qui sera déployé dans un écosystème d'autres bundles. Le bundle je suis en train de travailler sur les besoins de certains autres bundles, mais ils ne sont pas chargés, exportés dans cet écosystème, et je n'ai pas de contrôle sur ce que l'écosystème des exportations. Dans un tel scénario, je peux mettre ces bottes à l'intérieur d'un répertoire (dire 'lib') qui devient une partie de mon bundle. Ces services doivent également être trouvée dans le Bundle-Classpath, de sorte qu'ils peuvent être chargés.
- Est-ce une utilisation correcte cas pour les Bundle-Classpath ?
- Ces supplémentaires bundles également être chargés dans le conteneur OSGI et les packages exportés par eux soit disponible pour les autres faisceaux ?
OriginalL'auteur Parag | 2013-06-05
Vous devez vous connecter pour publier un commentaire.
Bundle-ClassPath
est prévu pour y compris les dépendances dans notre bundle, de sorte que notre bundle peuvent être déployées autonome.Prenons un exemple. Supposons que le code dans mon bundle utilise une bibliothèque, par exemple: Google Goyave. J'ai deux choix pour l'emballage de mon bundle:
Il suffit de créer mon bundle avec seulement mon propre code à l'intérieur. Le bundle auront désormais la
Import-Package
déclarations qui donnent lieu à une dépendance sur Goyave, et quiconque veut déployer mon bundle dans son application va également déployer à la Goyave.Sinon je peux inclure une copie de Goyave à l'intérieur de mon bundle et la référence de mon
Bundle-ClassPath
. Celui qui déploie mon bundle peut déployer juste mon paquet, et n'a pas besoin de s'inquiéter de savoir où obtenir de Goyave. En fait, l'existence de Goyave à l'intérieur de mon bundle est un détail d'implémentation, et de le deployer n'a même pas besoin de savoir que je l'utilise.Le choix entre ces deux options est un compromis. L'Option 2 a l'avantage de mon bundle est plus facile à déployer, car il est autonome -- tout ce qu'il faut est là à l'intérieur. Sur l'autre main dans mon bundle est beaucoup plus grande qu'elle doit être, qui pourrait devenir un problème si beaucoup d'autres bundles également intégrer leur propre copie de la Goyave.
Un plus grave problème avec l'option 2, c'est que toutes les dépendances de la bibliothèque devenu mon dépendances. En fait la Goyave est un rare exemple d'une bibliothèque Java avec aucune dépendance de sa propre... mais de nombreuses autres bibliothèques Java glisser dans un énorme arbre de dépendances transitives. Si vous utilisez cette approche, disons, Hibernate, alors votre propre bundle aura également que la grande dépendance à définir. Cela devient très laid, très rapidement.
Donc, vous devez être prudent de ne pas abuser des
Bundle-ClassPath
/Embed-Dependency
. Vous ne devriez envisager de l'utiliser si la dépendance est (un) petit, et sans dépendances transitives, et (b) votre bundle utilise la bibliothèque comme une mise en œuvre interne de détail, c'est à dire qu'il ne fait pas partie de votre API publique.Mise à JOUR
J'ai oublié de répondre à votre deuxième question sur les exportations. La réponse est NON, les exportations de "bundles" que vous mettez sur votre
Bundle-ClassPath
ne deviendra PAS les exportations de votre bundle. En fait, les Pots de nous mettre surBundle-ClassPath
ne sont pas traités comme des paquets à tous, ils sont juste des Bocaux.Vous pouvez choisir d'exporter les paquets qui viennent de l'intérieur les Pots sur votre
Bundle-ClassPath
mais vous devez le faire dans le MANIFESTE.MF de votre bundle.OriginalL'auteur Neil Bartlett
L'utilisation la plus courante de cas pour cet en-tête est l'emballage de bibliothèques externes. Disons que vous avez une bibliothèque
foo.jar
, et que vous voulez utiliser ses classes dans votre bundle.Vous mettez le pot dans votre bundle comme,
À vous manifester, vous pouvez maintenant utiliser
N'oubliez pas d'inclure le
.
sur le chemin de la classe, ou vous ne serez pas en mesure de trouver les classes dans votre bundle.Lorsque les classes sont sur le
Bundle-ClassPath
, vous pouvez les utiliser comme n'importe quel autre classe: utiliser dans votre code, ou de les exporter.Non: les classes sont traités exactement de la même manière que tout autre dans votre bundle.
Merci, je pense que cela doit être le Maven bundle plugin qui m'oblige à importer les classes utilisées par le pot
Hm, pas sûr. Essayez de mettre à jour votre question avec la forme de votre générés bundle, le manifeste, et le maven déclarations que vous utilisez.
il ressemble à la Maven Bundle Plugin nécessite l'importation de classes qui viennent dans un bocal, même si c'est pas un OSGI jar. Je vais creuser un peu plus profond et mise à jour de ma question ... merci!
OriginalL'auteur Angelo van der Sijpt
Je pense que vous avez peut-être un peu hors sujet ici.
De OSGI dans l'Action.
Prenons un cas concret. Imaginez un bundle (fichier JAR) avec la structure suivante:
si vous voulais
a.A
,b.B
etc.C
à la disposition les uns des autres, vous devez définirsrc
,src2
etsrc3
en ce qui concerne le bundle classpath. Ce qui signifierait que vous auriez à ajouter à votre fichier de manifeste de la ligne suivante:OriginalL'auteur devoured elysium