Newsgroup: it.comp.java
Titolo: [JAR] - caricamento


http://csvtosql.sourceforge.net/

 
Questo perche' il DriverManager, se non ricordo male, vuole come condizione 
che il classloader della classe chiamante e quello del driver coincidano.

 che al momento di usarlo ottengo un "no suitable driver" :(
Prova ad utilizzare, nel file MANIFEST del tuo jar, la direttiva
"Class-Path", impostando il path del jar col driver jdbc; se, ad esempio,
il driver si trova nel file driver.jar, nella stessa dir. del jar della tua
applicazione, imposta nel MANIFEST:
Class-Path: ./driver.jar
Ovviamente dovrai utilizzare il Class Loader nel modo standard.
Dovrebbe andare; dico "dovrebbe" perchè a mio parere la gestione del
classpath nei jar è alquanto contorta.
Facci sapere se funziona,
Un saluto,
Sergio B.
-- 
Ideatore, sviluppatore e amministratore del progetto QuickNote, su
http://quicknote.sourceforge.net/

 Class-Path: ./driver.jar
questo è un problema, perchè l'utente dovrebbe poter usare un quasiasi 
driver jdbc scrivendo il percorso e la main class nel file di configurazione.
l'applicazione che sto sviluppando è 
http://csvtosql.sourceforge.net/
ci sono delle classi che si occupano di scrivere nel database, solo
che al momento i driver devono già risiedere nel classpath,
sarrebbe invece carino che l'utente scriva il nome del file del 
driver nel file di configurazione e l'applicazione lo carichi automaticamente.
al massimo se avete una soluzione alternativa ..


 coincidano.
e che senso ha questa limitazione ?


 e che senso ha questa limitazione ?
Bella domanda. Bisognerebbe chiederlo a chi l'ha scritto.

 wrote in
news:cbuadg$t2m$
1...@newsreader.mailgate.org
: 

Un trucco e' caricare *anche* la client class da un ClassLoader dinamico. 
Se il client class loader e' lo stesso si quello che carica il driver, 
DriverManager lo trova.
Un'altra possibilita' e' fare lo spawn di una JVM dopo aver letto la 
configurazione e opporunamente preparato il suo classpath.
Un'altr, che forse e' quella piu' sensata, e' di richiedere all'utente di 
avere i driver jdbc o in lib/ext (e quindi visibili ad ogni jvm) o in una 
directory specifica che il tuo codice conosce (che so, /lib/drivers) e 
definire opportunamente il classpath che la lancia..

 definire opportunamente il classpath che la lancia..
questa mi sembra meglio e mi risparmierebbe un paio di anni di vita,
anche perchè al momento sono da solo a sviluppare il core. :)


 
Oppure includere tutto in un unico Jar di applicazione, Driver 
compresi... Il Jar stesso farebbe parte della tua ClassPath....

 compresi... Il Jar stesso farebbe parte della tua ClassPath....
no, č l'utente che deve scegliersi il driver.


 
Una cosa che puoi fare e' di usare una connection factory che e' caricata 
dallo stesso classloader dinamico che "possiede" i driver, esegue la 
connect e ritorna quest'ultima. Quest'ultima ovviamente dev'essere 
caricata esplicitamente e il methodo invocato via reflection per evitare 
che il linker la "trovi" quando chiama il codice chiamante.
Del tipo:
class ConnectionFactoryInternal {
  public Connection getConnection(String jdbcUrl) {
    return DriverManager.getConnection(...); 
  }
}
public class ConnectionFactory {
  public Connection getConnection(ClassLoader dynamicClassLoader, String 
jdbcUrl) {
    Object factory = Class.forName
("ConnectionFactoryInternal").newInstance();
    	Method m = factory.getClass().getMethod("getConnection",new Class[] 
{ String.class});
     return (Connection)m.invoke(obj, new Object[] { jdbcUrl };
  }
}
In questa maniera il resto del codice "vede" solo ConnectionFactory, che 
pero' ottiene le connection chiamando il DriverManager da una classe 
caricata dallo stesso classloader (dinamico) che possiede i driver.
E' possibile che pero' i driver per qualche motivo necessitino di 
quell'eguaglianza: nella specifica JDBC non c'e' nulla, mi pare, ma non 
si sa mai..

 
Concordo, penso che dati i presupposti sia la soluzione migliore.
Buon lavoro ;-)
P.S.
Ho dato un'occhiata al sito del tuo progetto e sembra interessante: "mi
permetto" tuttavia il consiglio di migliorare e dettagliare (soprattutto
nella home page) la spiegazione di ciò che effettivamente fa.
In bocca al lupo!


 In bocca al lupo!
beh non sono mai stato un grande scrittore :)
vedrň di migliorarla
poi devo scrivere anche i tutorial per estendere altri pezzi


 al massimo se avete una soluzione alternativa ..
In effetti era facile, e avevo gia' una mezza soluzione costruita quando 
scrivevo cmaker.
Domani ti posto la soluzione. Ciao!

 Domani ti posto la soluzione. Ciao!
Pronti:
http://sadun-util.sourceforge.net/api/org/sadun/util/sql/DynamicConnectionFactory.html

grazie mille, e anche questa feature è andata.
ho anche già buttato fuori la nuova versione :)
