Ceci est une biggie.JDBC/OSGi et comment charger dynamiquement les pilotes sans indiquer explicitement les dépendances dans le bundle?
J'ai une base de code bien structurée mais monolithique qui a une architecture modulaire primitive (tous les modules implémentent des interfaces mais partagent le même chemin de classe). Je réalise la folie de cette approche et les problèmes qu'elle représente quand je vais déployer sur des serveurs d'applications qui peuvent avoir différentes versions conflictuelles de ma bibliothèque.
Je suis dépendant d'environ 30 bocaux en ce moment et je suis à mi-chemin, mais je les trouve. Maintenant, certains de mes modules sont faciles à déclarer les dépendances versionnées de, tels que mes composants réseau. Ils référencent statiquement les classes dans les bibliothèques JRE et autres bibliothèques BND, mais mes composants liés à JDBC sont instanciés via Class.forName (...) et peuvent utiliser un nombre quelconque de pilotes. Je suis en train de tout casser en paquets OSGi par zone de service.
- Mes classes/interfaces de base.
- Signalement des composants associés.
- Composants liés à l'accès à la base de données (via JDBC).
- etc ....
Je souhaite que mon code pour pouvoir utiliser toujours sans OSGi par simple fichier jar avec toutes mes dépendances et sans OSGi du tout (via Jarjar) et aussi être modulaire via les méta-données OSGi et les bundles granulaires avec des informations de dépendance.
Comment puis-je configurer mon paquet et mon code afin qu'il puisse utiliser dynamiquement un pilote sur le classpath et/ou dans l'environnement du conteneur OSGi (Felix/Equinox/etc.)?
Existe-t-il une méthode d'exécution pour détecter si je cours dans un conteneur OSGi compatible avec les conteneurs (Felix/Equinox/etc.)? Dois-je utiliser un mécanisme de chargement de classe différent si je suis dans un conteneur OSGi?
Ai-je besoin d'importer des classes OSGi dans mon projet pour pouvoir charger un pilote JDBC at-bundle-time-inconnu via mon module de base de données? J'ai également une deuxième méthode pour obtenir un pilote (via JNDI, qui n'est vraiment applicable que sur un serveur d'application), dois-je changer mon code d'accès JNDI pour les serveurs d'applications compatibles avec OSGi?
Merci pour l'information, en particulier le DynamicImport-Package: * pointe qui étonnamment je ne pouvais pas trouver via la recherche Internet. En ce qui concerne la deuxième réponse, un extrait pourrait être utile si vous avez le temps. Je signalerai ceci comme réponse approuvée quand même que vous avez répondu à mes questions principales. Merci. – Chris