2010-01-25 3 views
7

Après avoir demandé de l'aide pour gérer les dépendances sur différentes versions des mêmes bibliothèques dans Java, il a été suggéré que je devrais jeter un oeil aux implémentations OSGI. Étant sous la pression d'un délai, je pourrais vraiment utiliser de l'aide qui me sauverait de creuser à travers d'interminables documents OSGI. J'ai une application qui fonctionne, qui va utiliser un nouveau cadre. Le framework utilise différentes versions de jars que j'utilise déjà, donc je veux empaqueter le nouveau framework en bundle OSGI. Puis-je laisser mon application telle quelle et utiliser l'ensemble OSGI uniquement comme conteneur dans la machine virtuelle Java? Cela signifierait que j'utiliserais le bundle OSGI uniquement pour isoler un ensemble de classes du reste de la JVM afin d'éviter les conflits entre différentes versions de classes. en d'autres termes, je veux utiliser OSGI sans transporter tout mon code vers une configuration basée sur OSGI.Comment empaqueter et consommer une bibliothèque Java existante avec OSGI

Amitiés Seref

Répondre

3

Je n'ai pas une réponse complète pour vous ici, je voulais juste pour contrer ce deterb dit:

D'abord, vous devez avoir votre application entière dans le cadre de OSGi.

Ce n'est pas vrai. Une autre approche consisterait à incorporer un conteneur OSGi dans une application hôte. La partie délicate ici est l'interaction entre l'intérieur d'OSGi et l'extérieur, parce que le code vit sur des chargeurs de classes séparés.

Vous pouvez rendre vos classes hôtes visibles dans la partie OSGi à l'aide du chemin de classe système OSGi. L'inverse est plus difficile. Une façon pour le code hôte d'interagir avec des ensembles est une interface qui est visible à la fois pour l'application hôte et pour l'ensemble, c'est-à-dire une partie de l'hôte. Une autre façon serait d'utiliser la réflexion.

Si vous avez une séparation claire entre l'hôte et OSGi, par exemple un système de plug-in, alors cela pourrait très bien fonctionner.

Être sous une pression limite

Cela pourrait être un problème. Il y a beaucoup à apprendre avec OSGi, et comme il est sur le point de toucher le courant principal, il y a toujours un manque de connaissances de la communauté, de support d'outils, de compatibilité des bibliothèques, etc.

La plus grande question à poser à ce stade est la suivante: ai-je vraiment besoin de gérer différentes versions de dépendances lors de l'exécution? Si ce n'est pas le cas, c'est-à-dire que vous pouvez comprendre les choses au moment du déploiement (par exemple par configuration), il se peut qu'il y ait une solution plus simple pour vous.

+0

Grâce à Thilo (et à son intérêt), voici la situation: mon logiciel utilise une bibliothèque particulière, qui dépend de x.v1.jar. Je dois maintenant ajouter une autre bibliothèque à mon projet, qui a des dépendances à x.v1.1.jar Dans ce cas, même si je gère les choses au moment de la construction, en cours d'exécution, il doit y avoir deux fichiers contenant des classes avec les mêmes noms, et soit la première bibliothèque que j'utilise, soit la seconde peut finir par accéder à la mauvaise version d'une classe, ou ne pas pouvoir atteindre une classe, etc. etc. Le gâchis n'est pas difficile à imaginer. – mahonya

+0

Maintenant, si je pouvais créer une sorte de bac à sable dans JVM, disons, en mettant toute la nouvelle bibliothèque dans un paquet, je me débarrasserais de mon problème. Dans ce cas, j'utiliserais une sorte de mécanisme pour charger les types de la bibliothèque enveloppée (mécanique OSGI). Par exemple, si je peux utiliser la réflexion et le type de noms pour récupérer des instances de types OSGI, ces types utiliseraient-ils le classloader de leur conteneur OSGI? Si c'est le cas, ils chargeraient des types à partir de x.v1.1.jar et cela pourrait être une solution dans mon cas. J'envisagerais de passer progressivement à OSGI, si je peux gérer ce petit cas d'utilisation critique. – mahonya

+0

@serefakin: Oui, vous pouvez mettre le fichier x.v1.1.jar dans OSGi, mais vous devez également mettre la bibliothèque qui en dépend (car vous devez l'empêcher de voir x.v1.jar). Et cela rend difficile l'utilisation de la bibliothèque à partir du code en dehors d'OSGi (à moins que vous ayez une interface qui peut également vivre à l'extérieur). – Thilo

0

D'abord, vous devez avoir votre application entière dans le cadre de OSGi. Cependant, je ne pense pas qu'il serait difficile de le configurer de sorte que vous ne devez travailler qu'avec quelques paquets (peut-être seulement deux, en fonction de votre configuration)

Le chemin avec le moins de problèmes que je peux voir Pour prendre le cadre et "l'envelopper" et toutes ses dépendances dans un seul paquet Rendre les paquets pour les dépendances privées Pour votre projet principal, faites de même

L'autre chemin serait d'emballer tous les les bibliothèques séparément en utilisant les commandes d'habillage appropriées.Ceci a beaucoup plus de problèmes potentiels si vous n'êtes pas intéressé à aller OSGi complet

Selon votre configuration de construction, je regarderais d'abord en regardant le maven-bundle-plugin et/ou Bnd. Le plugin maven-dependency le rend très facile, car il suffit de lui indiquer les ID-artefacts à intégrer et il le fera. Vous devez vous assurer que vous spécifiez tous les packages jar incorporés en tant que packages privés.

Cela devrait fonctionner à moins que le framework ne fasse du chargement de classe/AOP, ce qui le rendrait beaucoup plus difficile à OSGify.

Enfin, si vous êtes intéressé par une solution non-osgi, créez le framework avec le maven-shade-plugin et renommez simplement tous les packages pour les bibliothèques en conflit. Ce serait probablement le plus simple car vous pourriez simplement reconditionner le framework avec les bibliothèques ombrées et l'utiliser comme dépendance.

Questions connexes