Newsgroup: it.comp.java
Titolo: caricamento a runtime di librerie

Ciao a tutti!
sono alle prese con un piccolo progetto, un programma che legge da un
file di configurazione i parametri di connessione ad un database e poi
dopo essersi collegato all'origine dati ogni 5 minuti esegue una query
ed aggiorna le statistiche in base ai risultati.
Il mio problema è che l'applicazione non sa qule driver JDBC deve
caricare fino a quando non legge il file di configurazione, nel quale
è inserito anche il percorso del jar relativo al driver.
Sapreste dirmi come posso fare a caricare il jar del driver a runtime?
Grazie 1000 in anticipo
Ciao a tutti
Marco

 Sapreste dirmi come posso fare a caricare il jar del driver a runtime?
Non so come si fa, ma se ti informi sui ClassLoader credo che dovresti 
trovare la soluzione. Forse c'e' un JarClassLoader.
-- 
Andrea Francia
http://www.andreafrancia.it/

Marco Capoferri ha scritto:

Devi utilizzare un tuo ClassLoader, dai un'occhiata a 
http://java.sun.com/j2se/1.4.2/docs/api/java/net/URLClassLoader.html
Considera però che potrebbe non essere semplice, se una libreria che 
carichi ha delle dipendenze che non sono nel tuo classpath il 
classloader non le vedrà automaticamente e quindi otterrai errori.
Quindi una cosa del tipo:
URLClassLoader cl = URLClassLoader.newInstance(url_del_tuo_jar_come_array);
Class clazz = cl.loadClass("classe.del.driver");
DriverManager.getConnection(....)
dovrebbe funzionare (non ho testato nulla)...
Poi devi considerare il riutilizzo dei classloader in modo che ne venga 
istanziato 1 solo per ogni driver o, meglio ancora, se sai a priori 
TUTTI i possibili jar dei drivers (leggi tutto il file di configurazione 
all'inizio), puoi istanziare un unico classloader e usare sempre quello.
Ciao,
Tommaso

Marco Capoferri ha scritto:

ti basta seguire il più banale dei tutorial che trovi in rete. sia che 
tu usi il DataSource che il DriverManager l'uso consueto e corretto 
prevede il caricamento del driver a runtime.
-- 
 Fino all'anno scorso avevo un solo difetto. Ero presuntuoso.
http://softvalley.blogspot.com
http://www.flickr.com/photos/marko_po/

 trovare la soluzione. Forse c'e' un JarClassLoader.
per caricare un driver jdbc a runtime? un classloader a parte non ti 
sembra un capellino esagerato? :)


 sembra un capellino esagerato? :)
è corretto invece, ad esempio se devi scrivere un sql editor devi poter
caricare i jar a runtime ...
-- 
Davide Consonni

 Marco
tada:
    public class JarLoader {
 
        private static final Class[] parameters = new Class[]{URL.class};
 
        public static void addURL(URL u) throws IOException {
            URLClassLoader sysloader =
(URLClassLoader)ClassLoader.getSystemClassLoader();
            Class sysclass = URLClassLoader.class;
            try {
                Method method =
sysclass.getDeclaredMethod("addURL",parameters);
                method.setAccessible(true);
                method.invoke(sysloader,new Object[]{ u });
            } catch (Throwable t) {
                t.printStackTrace();
                throw new IOException("Error, could not add URL to system
classloader");
            }
        }
 
        public static void addFile(File f) throws IOException {
            addURL(f.toURL());
        }
    }
-- 
Davide Consonni

 caricare i jar a runtime ...
che sia corretto in determinate circostanze non lo metto in dubbio, 
infatti io ho detto che è esagerato e riferendomi alla domanda specifica.
ma anche se scrivesse un tool sql pretendere di caricare i jar a caldo 
mi sembra un esigenza forzata, tant'è che non conosco tools che lo fanno.


 sembra un capellino esagerato? :)
L'OP ha scritto che il file di configurazione contiene, tra gli altri 
questi due parametri:
  - il percorso dove andare a prendere il .jar che contiene il driver.
  - il nome della classe che fa da Driver.
Da questo ho desunto che il .jar non fosse nel classpath.
Se vuoi far caricare una classe che non si trova nel classpath devi 
scomodare i ClassLoader o no? Lo sto chiedendo, non sono pratico ma mi 
sembra di sì.

 
http://csvtosql.sourceforge.net/
è un progetto che ho scritto io ed alcuni programmatori che hanno
partecipato con patch legge file csv e li converte in sql oppure li
inserisce in un database. anche se in realtà può fare un po più di cose.
li ho usato il caricamento a caldo dei jar del jdbc ...
è lgpl quindi ci sono pure i sorgenti ...
-- 
Davide Consonni

 tant'è che non conosco tools che lo fanno.
Lo fanno:
  - Netbeans, nell'ambito dell'interfaccia per accedere ai database.
  - SquirrelSql (mi sembra)

Madonna mia non pensavo di scatenare sto putiferio!!!!
Cmq grazie a tutti per le risposte ed i sorgenti!
Oggi appena finisco integrare il parser XML con il progetto provo le
soluzioni proposte e poi vi faccio sapere come è andata la cosa
Grazie 1000 ancora a tutti!
Ciao Marco

Dimenticavo
per le dipendenze dei jar caricati non ci sono problemi poichè le mie
librerie caricate a runtime (Driver JDBC o altre che siano) sono tutte
composte da un unico file Jar per cui almeno per questo non ho
problemi per fortuna
Ciao e grazi e1000 ancora a tutti
Marco