Comment déployer les applications et les dépendances OSGi?
OSGi semble avoir un excellent avantage d'avoir de petits artefacts déployables en n'enveloppant pas des douzaines de dépendances JAR dans un répertoire lib. Cependant, je ne trouve rien qui me permette de déployer facilement et de manière fiable des dépendances dans un conteneur. Par exemple, j'ai une application qui utilise CXF et plusieurs sous-projets Spring. Si je dois déployer cette application sur un nouveau serveur Glassfish, quelle serait la meilleure façon de le faire, en s'assurant que toutes les dépendances sont installées?
j'utilise Maven, et il serait semble qu'il pourrait y avoir un moyen d'avoir un crochet qui regarde le répertoire META-INF/maven et tire la liste des dépendances de la pom.xml et goes et va chercher les libs nécessaires (probablement à partir d'un repo local). Est-il un moyen de le faire?
le plugin Pax sonne comme s'il faisait ça, mais il semble être basé sur le boostrapping D'un conteneur Felix? Ce qui n'est pas ce que je veux, je fais face à un déjà en cours d'exécution, conteneur à distance.
y a-t-il un shot une telle chose existe comme outil en ligne de commande par opposition à GUI aussi?
3 réponses
il existe plusieurs façons de déployer des paquets dépendants dans les conteneurs OSGi. En voici quelques uns:
1 The Felix OBR bundle repository
vous devez d'abord créer un fichier d'index XML pour vos paquets disponibles, en utilisant un outil tel que bindex. Si vous utilisez le maven-bundle-plugin, alors il maintient automatiquement un index OBR dans~/.m2 / dépôt / dépôt.XML.
charger l'index en utilisant la ligne de commande OBR interface:
> obr:addUrl file:/Users/derek/.m2/repository/repository.xml
puis demandez à OBR de déployer votre paquet cible, avec des dépendances déterminées à partir de L'index OBR:
> obr:deploy com.paremus.posh.sshd
Target resource(s):
-------------------
Paremus Posh Ssh Daemon (1.0.23.SNAPSHOT)
Required resource(s):
---------------------
Paremus Command API (1.0.23.SNAPSHOT)
Optional resource(s):
---------------------
Paremus Config Admin Commands (1.0.23.SNAPSHOT)
Paremus OSGi & LDAP Types (1.0.23.SNAPSHOT)
2 Apache Karaf
Karaf supporte les" features", qui sont essentiellement des listes de paquets nécessaires pour fournir la fonctionnalité:
karaf@root> features:info obr
Description of obr 2.0.0 feature
----------------------------------------------------------------
Feature has no configuration
Feature has no dependencies.
Feature contains followed bundles:
mvn:org.apache.felix/org.apache.felix.bundlerepository/1.6.4
mvn:org.apache.karaf.shell/org.apache.karaf.shell.obr/2.0.0
mvn:org.apache.karaf.features/org.apache.karaf.features.obr/2.0.0
karaf@root> features:install obr
3 Eclipse Virgo
Vierge plans définir les artéfacts qui composent une application et il est capable de de fournir automatiquement les dépendances d'un application comprenant des faisceaux, des plans, des archives de plans (Sea) et des configurations, provenant de dépôts locaux et éloignés.
4 Paremus Agile
Nimble utilise OBR (ou ses propres index étendus) pour déployer automatiquement tous les paquets dépendants nécessaires pour activer un paquet cible (et les désinstaller lorsque le paquet cible est arrêté). Il peut également détecter d'autres dépendances, comme un paquet WAB nécessite un extenseur web et installer automatiquement un selon un Politique configurable.
agile peut également être configuré pour lancer Glassfish, de sorte que ses caractéristiques sont disponibles pour les faisceaux dans le conteneur de Glassfish.
L'exemple ci-dessous montre également que le support de journalisation est automatiquement installé lorsque sshd est activé:
$ posh
________________________________________
Welcome to Paremus Nimble!
Type 'help' for help.
[denzil.0]% nim:add --dry-run com.paremus.posh.sshd@active
-- sorted parts to install --
4325 osgi.resolved.bundle/ch.qos.logback.core:0.9.22
-- start dependency loop --
5729 osgi.resolved.bundle/com.paremus.util.logman:1.0.23.SNAPSHOT
5727 osgi.active.bundle/com.paremus.util.logman:1.0.23.SNAPSHOT
3797 osgi.resolved.bundle/ch.qos.logback.classic:0.9.25.SNAPSHOT
3792 osgi.resolved.bundle/slf4j.api:1.6
-- end dependency loop --
436 osgi.resolved.bundle/org.apache.mina.core:2.0.0.RC1
6533 osgi.resolved.bundle/sshd-core:0.3
398 osgi.resolved.bundle/com.paremus.posh.sshd:1.0.23.SNAPSHOT
396 osgi.active.bundle/com.paremus.posh.sshd:1.0.23.SNAPSHOT
(disclaimer: je suis un développeur à Paremus)
5 Apache Felix Gogo
gogo est le nouveau shell de ligne de commande standard RFC147. Il est déjà utilisé en Felix, Karaf, Agile et sera bientôt disponible dans Glassfish.
Gogo vous permet d'exécuter toutes les commandes que vous pouvez taper de façon interactive, comme un script. Ainsi, vous pouvez générer la liste des paquets pour l'installer et la convertir en script, ou même capturer les paquets installés à partir d'une configuration de travail de sorte qu'il puisse être recréé à partir d'un départ propre.
si vous créez une application OSGi et une application Java classique qui font la même chose et utilisent les mêmes bibliothèques, vous aurez besoin exactement du même jeu de bocaux. La grande différence est d'être capable de définir explicitement vos dépendances (et peut-être produire plus de pots granulaires pour votre application).
il n'y a qu'un seul serveur basé sur OSGi que je connaisse (la Vierge D'Eclipse, précédemment le serveur DM de Spring). Glassfish et Websphere soutiennent OSGi, mais je n'ai pas joué. avec eux donc je ne peux pas dire grand-chose. Ce que je peux dire, c'est qu'ils ont tous besoin d'un conteneur OSGi et c'est généralement L'Equinox D'Eclipse ou le Felix D'Apache.
votre question semble être vraiment sur la fourniture de l'application (trouver ce qui doit être déployé). Je sais que pour Maven 3.0 ils ont fait un tas de choses en travaillant avec le cadre D'approvisionnement P2 D'Eclipse.
pour votre application Déployez-vous une oreille ou une guerre? Pour ces services, votre système de construction sera besoin de produire l'archive avec toutes les dépendances ou il ne fonctionnera pas. C'est un peu confus sur la raison pour laquelle vous avez un problème parce que les gens utilisent Maven parce qu'il fait la gestion transitive des dépendances pour leurs constructions.
Il y a un aspect fondamental de votre question qui n'est pas encore traitée.
Glassfish est en effet un véritable serveur D'applications comme la plupart des serveurs d'applications modernes: ceux-ci vous fournissent un conteneur Web (où vous déploieriez des archives de guerre), a Java EE container (pour déployer les EJB dans les archives JAR et EAR), ainsi que l'intégration d'un conteneur OSGI. La dernière est alors utilisée pour le démarrage interne du serveur d'application mécanisme.
En essence, vous pouvez cible trois conteneurs. Les IDE modernes et les outils de construction vous fournissent des moyens d'emballer votre logique pour cibler l'un de ceux-ci. Alors la question devient: Comment puis-je concevoir mon application avec toutes ces possibilités?
Il y a quelques très important technique questions de ne pas perdre de vue. (Je me concentre ici sur des considérations objectives et factuelles, à l'écart de tout choix subjectif., philosophie, stratégie et autres considérations liées au contexte qui, en fait, peuvent aussi peser beaucoup sur votre décision finale):
- un conteneur OSGI ne vous fournit pas Implicite ou DéclarativeGestion Des Threads,Persistance, ou gestion des transactions des services comme le web et les conteneurs Java EE. Alors, prévoyez d'analyser ces questions et de produire le code pour gérer vos threads et traiter la transaction propagation sur ces fils par exemple. Bien sûr, OSGi fournit tous les API nécessaires pour traiter ces aspects, mais ne nécessite un codage (où L'AOP peut aider). D'un autre côté, dans les conteneurs web et Java EE, vous vous fiez aux services gérés par conteneur et/ou utilisez les annotations EJB, les descripteurs de déploiement et les objets gérés par serveur comme les pools pour simplement déclarer le nombre de threads que vous voulez en parallèle, les tailles des pools de connexion et les attributs de transaction. Il y a des avantages et les inconvénients dans l'un ou l'autre style (procédural dans OSGi versus déclaratif ou implicite dans Java app. serveur.)
- OSGI fournit un aide-soignantchargement votre code, gérer dépendances des modules, même traiter avec multiple la coexistence des versions du même module, et ajout/suppression et start/stop soi-disant bundles (unités de déploiement OSGI), à condition en effet que votre paquet contienne la logique Gérer les problèmes de démarrage/arrêt potentiels comme interrompre correctement tous les threads lancés sur un stop -- threads qui auraient pu "se propager" à travers d'autres modules dépendants. D'un autre côté, Java EE et les conteneurs Web embarquent souvent des copies de JAR's dépendants qui peuvent donner des déploiements plus gros à moins que vous ne commenciez à considérer votre serveur d'application chargeur de classe de la hiérarchie et en profiter pour déployer des' bibliothèques partagées ' soit sous forme de pots de POJO simples, soit sous forme de Java EE beans emballés dans JAR. Quoi qu'il en soit, dans les cas ultérieurs, la gestion des dépendances de déploiement devient une préoccupation que vous devrez aborder au moins à construire le temps utilisant des cadres comme Maven en effet. Ensuite, au moment de l'exécution, vous devrez peut-être script start/stop cascades selon les dépendances; sinon, profitez des extensions spécifiques du serveur d'application qui traitent ces dynamique de déploiement problèmes dans les conteneurs web et Java EE (par exemple Weblogic).
- comme déjà dit, OSGI est maintenant utilisée par la plupart des serveurs d'applications pour gérer leurs propres séquence de démarrage. Avec la complexité croissante des plateformes, la multiplication des API, l'augmentation du nombre d'équipes de développement pour assembler un seul produit final, ainsi que l'utilisation de nombreux composants tiers / open source, OSGI devient un incontournable serveur de démarrage de l'outil pour assurer les versions stables et un ensemble cohérent de versions compatibles de tous les composants. Pensez à L'IDE Eclipse: avec un catalogue de milliers de plug-ins et un taux élevé de nouveautés, cette IDE serait une plateforme très fragile sans OSGI comme base. Les serveurs D'applications modernes sont confrontés au même problème.
- basé sur les considérations ci-dessus peut être tentant d' calque votre code dans certaines installations que vous pourriez baser dans la couche OSGI, qui à son tour fournit des services de base à une couche Java EE bean hébergement logique d'affaires, puis une couche de servlet Web à l'interface de l'ensemble... mais deux autres questions fusent: (a) Comment faites-vous pour que tous ces éléments communiquent ensemble? OSGI dispose de son propre mécanisme de dépôt et les API jar déployées ne seront pas visibles par les autres modules à moins d'être explicitement publiées dans OSGI. Les conteneurs web et Java EE utilisent une technologie de dépôt complètement différente pour accéder aux interfaces des autres composants, à savoir JNDI. Encore une fois, regardez la documentation spécifique à votre serveur d'application qui peut fournir des moyens d'aborder les haricots Java EE des paquets OSGI et vice-versa (Glassfish par exemple, depuis V3); mais soyez prudent sur la gestion du fil et les portées de transaction. (b) Comment éviteriez-vous d'interférer dans la séquence de démarrage du serveur d'application? OSGI tend à devenir une fonctionnalité de base du système (sous la gouvernance du fournisseur), par rapport aux conteneurs web et Java EE naturellement orienté pour héberger votre code d'application (sous votre gouvernance). La mise à niveau de votre serveur d'application ou l'installation d'une nouvelle version peut interférer avec vos propres déploiements OSGI; vous devrez vérifier le problème et organiser vos scripts de déploiement en conséquence.
la question est riche et son analyse complexe. Un examen plus approfondi doit tenir compte de la nature de la demande de construire. En outre, si vous avez l'intention d'utiliser des cadres de développement comme open source Spring et/ou Camel, ainsi que des cadres spécifiques au fournisseur comme Oracle Fusion SOA composites, JBoss Switchyard,etc. vous aurez de nombreuses autres contraintes techniques à prendre en considération.
il n'y a pas de réponse unique à ces questions et cela justifie essentiellement la pléthore actuelle de technologies qui se chevauchent.
lorsque cette question d'architecture est résolue, alors vous pouvez chercher à optimiser la productivité avec une gestion de configuration et un référentiel de déploiement appropriés.