Questo è un grosso problema.JDBC/OSGi e come caricare i driver in modo dinamico senza dichiarare esplicitamente le dipendenze nel pacchetto?
Ho una base di codice ben strutturata ma monolitica con un'architettura modulare primitiva (tutti i moduli implementano interfacce ma condividono lo stesso percorso di classe). Mi rendo conto della follia di questo approccio e dei problemi che rappresenta quando vado a distribuire su server di applicazioni che potrebbero avere versioni in conflitto diverse della mia libreria.
Sono dipendente da circa 30 vasetti in questo momento e sono a metà strada pur trovandoli in su. Ora alcuni dei miei moduli sono facili da dichiarare come dipendenti dalle versioni, come i miei componenti di rete. Esse fanno riferimento a classi all'interno di JRE e altre librerie BNDded, ma i miei componenti relativi a JDBC creano un'istanza tramite Class.forName (...) e possono utilizzare uno qualsiasi dei numerosi driver.
Sto suddividendo tutto in bundle OSGi per area di servizio.
- Le mie classi principali/interfacce.
- Segnalazione dei componenti correlati.
- Componenti relativi all'accesso al database (tramite JDBC).
- ecc ....
Vorrei per il mio codice per poter essere ancora utilizzato senza OSGi tramite file jar singola con tutte le mie dipendenze e senza OSGi a tutti (via JARJAR) ed anche per essere modulare tramite i meta-dati OSGi e i pacchetti granulari con informazioni sulle dipendenze.
Come si configura il mio fagotto e il mio codice in modo che possa utilizzare in modo dinamico qualsiasi driver sul classpath e/o all'interno dell'ambiente container OSGi (Felix/Equinox/etc.)?
Esiste un metodo di runtime per rilevare se sono in esecuzione in un contenitore OSGi compatibile con i contenitori (Felix/Equinox/ecc.)?
Devo utilizzare un meccanismo di caricamento di classe diversa se sono in un contenitore OSGi?
Sono obbligato ad importare classi OSGi nel mio progetto per poter caricare un driver JDBC at-bundle-time-unknown tramite il modulo del mio database?
Ho anche un secondo metodo per ottenere un driver (tramite JNDI, che è realmente applicabile solo quando è in esecuzione in un app server), devo cambiare il mio codice di accesso JNDI per i server app compatibili con OSGi?
Grazie per l'informazione, in particolare il DynamicImport-Pacchetto: * suggerimento che sorprendentemente non riuscivo a trovare tramite ricerca su Internet. Riguardo alla seconda risposta, uno snippet potrebbe essere bello se avete tempo. Lo segnalerò comunque come risposta approvata, sebbene tu abbia risposto alle mie domande principali. Grazie. – Chris