Dies ist ein großes Problem.JDBC/OSGi und wie man Treiber dynamisch lädt, ohne Abhängigkeiten explizit im Bündel anzugeben?
Ich habe eine gut strukturierte und dennoch monolithische Code-Basis, die eine primitive modulare Architektur hat (alle Module implementieren Schnittstellen, die den gleichen Klassenpfad teilen). Ich erkenne die Torheit dieses Ansatzes und die Probleme, die es bei der Bereitstellung auf Anwendungsservern darstellt, die möglicherweise unterschiedliche Versionen meiner Bibliothek widersprechen.
Ich bin auf etwa 30 Gläser im Moment abhängig und bin auf halbem Weg obwohl sie abbindet. Jetzt können einige meiner Module die versionierten Abhängigkeiten von beispielsweise meinen Netzwerkkomponenten einfach deklarieren. Sie verweisen statisch auf Klassen innerhalb der JRE und anderer BNDded-Bibliotheken, aber meine JDBC-Komponenten instanziieren über Class.forName (...) und können einen beliebigen Anzahl von Treibern verwenden.
Ich breche alles in OSGi-Bundles nach Servicebereich auf.
- Meine wichtigsten Klassen/Schnittstellen.
- Berichterstattung im Zusammenhang mit Komponenten.
- Datenbankzugriff bezogene Komponenten (über JDBC).
- etc ....
Ich wünsche mein Code der Lage sein, noch überhaupt über einzige JAR-Datei mit allen meinen Abhängigkeiten und ohne OSGi ohne OSGi verwendet wird (über Jarjar) und auch modular zu sein über die OSGi-Metadaten und granularen Bundles mit Abhängigkeitsinformationen.
Wie konfiguriere ich mein Bündel und meinen Code, so dass es dynamisch jeden Treiber auf dem Classpath nutzen und/oder innerhalb der OSGi Containerumgebung (Felix/Equinox/etc.)?
Gibt es eine Laufzeitmethode, um festzustellen, ob ich in einem OSGi-Container laufe, der über Container hinweg kompatibel ist (Felix/Equinox/etc.)?
Muss ich einen anderen Klassenlademechanismus verwenden, wenn ich in einem OSGi-Container bin?
Muss ich OSGi-Klassen in mein Projekt importieren, um einen at-bundle-unknown JDBC-Treiber über mein Datenbankmodul laden zu können?
Ich habe auch eine zweite Methode zum Abrufen eines Treibers (über JNDI, die nur wirklich beim Ausführen auf einem App-Server anwendbar ist), muss ich meinen JNDI-Zugriffscode für OSGi-fähige App-Server ändern?
Vielen Dank für die Informationen, insbesondere die DynamicImport-Package: * Tipp, der überraschend konnte ich nicht über Internet-Suche finden. In Bezug auf die zweite Antwort könnte ein Snippet schön sein, wenn Sie Zeit haben. Ich werde dies als die genehmigte Antwort trotzdem kennzeichnen, obwohl Sie meine Hauptfragen beantwortet haben. Vielen Dank. – Chris