Je réalise un client de base de données qui propose à l'utilisateur de
désigner par l'interface graphique l'emplacement de ses drivers jdbc.
J'ai passé des heures et des heures a essayer de comprendre le mécanisme et
finalement, je suis arrivé à ça :
==================
URL[] paths = new URL[] { new
URL("file:/C:/mysql-connector-java-2.0.14-bin.jar") };
URLClassLoader loader = URLClassLoader.newInstance( paths );
Class cls = loader.loadClass("org.gjt.mm.mysql.Driver");
Class cls2 = Class.forName( "org.gjt.mm.mysql.Driver", true, loader );
//au cas où
Driver drv = (Driver) cls.newInstance();
DriverManager.registerDriver(drv);
Enumeration enum = DriverManager.getDrivers();
while ( enum.hasMoreElements() )
System.out.println( enum.nextElement() );
=================
cls et cls2 sont bien initialisés avec org.gjt.mm.mysql.Driver.
drv également.
Il n'y a aucune erreur alors comment est-il possible que enum ne contienne
rien ?
Du coup j'ai une erreur (java.sql.SQLException: No suitable driver) sur la
ligne suivante :
=================
DriverManager.getConnection( "jdbc:mysql://localhost:3306/test", "root",
"" );
=================
Je sens que je touche au but, mais comme DriverManager.registerDrive ne
renvoie rien et ne lance pas d'erreur, je ne sais plus comment avancer...
Si quelqu'un avait sous la main un exemple de ClassLoader qui ferait ça, je
suis preneur !
Normalement les URL sont normalisée de la manière suivante : PROTOCOLE://EMPLACEMENT_PHYSIQUE/EMPLAEMENT_LOGIQUE donc peut etre que file://C:/... fonctionnera mieux.
Normalement les URL sont normalisée de la manière suivante :
PROTOCOLE://EMPLACEMENT_PHYSIQUE/EMPLAEMENT_LOGIQUE
donc peut etre que file://C:/... fonctionnera mieux.
Normalement les URL sont normalisée de la manière suivante : PROTOCOLE://EMPLACEMENT_PHYSIQUE/EMPLAEMENT_LOGIQUE donc peut etre que file://C:/... fonctionnera mieux.
Normalement les URL sont normalisée de la manière suivante : PROTOCOLE://EMPLACEMENT_PHYSIQUE/EMPLAEMENT_LOGIQUE donc peut etre que file://C:/... fonctionnera mieux.
En réalité, "file:/C:/mysql-connector-java-2.0.14-bin.jar" est ce qui est renvoyé par toURL lorsque je fais new File( "C:mysql-connector-java-2.0.14-bin.jar" ).toURL();
Mais le problème ne vient certainement pas de là, pourquoi Driver.registerDriver ne fonctionne pas mais ne donne pas de message d'erreur ???
Merci d'avance Lilian
Unknown <Unknown@devnull.null> wrote in message news:<pan.2004.06.12.01.07.57.366315@devnull.null>...
Normalement les URL sont normalisée de la manière suivante :
PROTOCOLE://EMPLACEMENT_PHYSIQUE/EMPLAEMENT_LOGIQUE
donc peut etre que file://C:/... fonctionnera mieux.
En réalité, "file:/C:/mysql-connector-java-2.0.14-bin.jar" est ce qui
est renvoyé par toURL lorsque je fais
new File( "C:\mysql-connector-java-2.0.14-bin.jar" ).toURL();
Mais le problème ne vient certainement pas de là, pourquoi
Driver.registerDriver ne fonctionne pas mais ne donne pas de message
d'erreur ???
Normalement les URL sont normalisée de la manière suivante : PROTOCOLE://EMPLACEMENT_PHYSIQUE/EMPLAEMENT_LOGIQUE donc peut etre que file://C:/... fonctionnera mieux.
En réalité, "file:/C:/mysql-connector-java-2.0.14-bin.jar" est ce qui est renvoyé par toURL lorsque je fais new File( "C:mysql-connector-java-2.0.14-bin.jar" ).toURL();
Mais le problème ne vient certainement pas de là, pourquoi Driver.registerDriver ne fonctionne pas mais ne donne pas de message d'erreur ???
Merci d'avance Lilian
LR
URL[] paths = new URL[] { new URL("file:/C:/mysql-connector-java-2.0.14-bin.jar") }; URLClassLoader loader = URLClassLoader.newInstance( paths ); Class cls = loader.loadClass("org.gjt.mm.mysql.Driver"); Driver drv = (Driver) cls.newInstance();
J'ai trouvé une solution, en fait, avec le code ci-dessus, j'arrive à me connecter à la base grace au code suivant : Properties prop = new Properties(); prop.setProperty( "password", getPassword() ); prop.setProperty( "user", getUsername() ); Connection dbConn = drv.connect( getConnectionString(), prop );
A+Lilian
URL[] paths = new URL[] { new
URL("file:/C:/mysql-connector-java-2.0.14-bin.jar") };
URLClassLoader loader = URLClassLoader.newInstance( paths );
Class cls = loader.loadClass("org.gjt.mm.mysql.Driver");
Driver drv = (Driver) cls.newInstance();
J'ai trouvé une solution, en fait, avec le code ci-dessus, j'arrive à me
connecter à la base grace au code suivant :
Properties prop = new Properties();
prop.setProperty( "password", getPassword() );
prop.setProperty( "user", getUsername() );
Connection dbConn = drv.connect( getConnectionString(), prop );
URL[] paths = new URL[] { new URL("file:/C:/mysql-connector-java-2.0.14-bin.jar") }; URLClassLoader loader = URLClassLoader.newInstance( paths ); Class cls = loader.loadClass("org.gjt.mm.mysql.Driver"); Driver drv = (Driver) cls.newInstance();
J'ai trouvé une solution, en fait, avec le code ci-dessus, j'arrive à me connecter à la base grace au code suivant : Properties prop = new Properties(); prop.setProperty( "password", getPassword() ); prop.setProperty( "user", getUsername() ); Connection dbConn = drv.connect( getConnectionString(), prop );
A+Lilian
Alwin
Driver.RegisterDriver marche ! Mais enregistre ton driver dans le classloader de base et non dans ton URLClassLoader.
Plutôt que d'enregistrer toi même ton driver, essaye d'utiliser ceci au lancement de ton programme.
java -Djdbc.drivers=C:mysql-connector-java-2.0.14-bin.jar // Statique et peut etre System.setProperty("jdbc.drivers","C:mysql-connector-java-2.0.14-bin.jar") ; // dynamique
-- --- Alwin - ZX636-R
Driver.RegisterDriver marche !
Mais enregistre ton driver dans le classloader de base et non dans ton
URLClassLoader.
Plutôt que d'enregistrer toi même ton driver, essaye d'utiliser ceci au
lancement de ton programme.
java -Djdbc.drivers=C:\mysql-connector-java-2.0.14-bin.jar // Statique
et peut etre
System.setProperty("jdbc.drivers","C:\mysql-connector-java-2.0.14-bin.jar")
; // dynamique
Driver.RegisterDriver marche ! Mais enregistre ton driver dans le classloader de base et non dans ton URLClassLoader.
Plutôt que d'enregistrer toi même ton driver, essaye d'utiliser ceci au lancement de ton programme.
java -Djdbc.drivers=C:mysql-connector-java-2.0.14-bin.jar // Statique et peut etre System.setProperty("jdbc.drivers","C:mysql-connector-java-2.0.14-bin.jar") ; // dynamique
-- --- Alwin - ZX636-R
LR
Driver.RegisterDriver marche ! Mais enregistre ton driver dans le classloader de base et non dans ton URLClassLoader.
Mais que je load la class par URLClassLoader ou le loader par défaut, une fois que la classe est chargée je dois pouvoir appeler DriverManager.registerDriver de la classe ainsi récupérée mais comme je l'ai dit dans mon premier message, ça n'a aucun effet...
Plutôt que d'enregistrer toi même ton driver, essaye d'utiliser ceci au lancement de ton programme.
java -Djdbc.drivers=C:mysql-connector-java-2.0.14-bin.jar // Statique et peut etre
jdbc.driver ne semble pas être une propriété par défaut. En tout cas elle ne figure pas dans la description javadoc de la méthode getProperties. Et je pense que ces variables sont chargées une fois pour toute au démarrage de la VM et qu'elle ne sont plus relues ensuite. En tout cas, j'avais essayé de faire System.setProperty("java.class.path", C:mysql-connector-java-2.0.14-bin.jar) et ça n'avait rien donné non plus.
Quoi qu'il en soit, si tu regardes mon messages du 13 juin, j'ai trouvé une solution.
Merci pour ton aide A+Lilian
Driver.RegisterDriver marche !
Mais enregistre ton driver dans le classloader de base et non dans ton
URLClassLoader.
Mais que je load la class par URLClassLoader ou le loader par défaut, une
fois que la classe est chargée je dois pouvoir appeler
DriverManager.registerDriver de la classe ainsi récupérée mais comme je l'ai
dit dans mon premier message, ça n'a aucun effet...
Plutôt que d'enregistrer toi même ton driver, essaye d'utiliser ceci au
lancement de ton programme.
java -Djdbc.drivers=C:\mysql-connector-java-2.0.14-bin.jar // Statique
et peut etre
jdbc.driver ne semble pas être une propriété par défaut. En tout cas elle ne
figure pas dans la description javadoc de la méthode getProperties. Et je
pense que ces variables sont chargées une fois pour toute au démarrage de la
VM et qu'elle ne sont plus relues ensuite. En tout cas, j'avais essayé de
faire System.setProperty("java.class.path",
C:\mysql-connector-java-2.0.14-bin.jar) et ça n'avait rien donné non plus.
Quoi qu'il en soit, si tu regardes mon messages du 13 juin, j'ai trouvé une
solution.
Driver.RegisterDriver marche ! Mais enregistre ton driver dans le classloader de base et non dans ton URLClassLoader.
Mais que je load la class par URLClassLoader ou le loader par défaut, une fois que la classe est chargée je dois pouvoir appeler DriverManager.registerDriver de la classe ainsi récupérée mais comme je l'ai dit dans mon premier message, ça n'a aucun effet...
Plutôt que d'enregistrer toi même ton driver, essaye d'utiliser ceci au lancement de ton programme.
java -Djdbc.drivers=C:mysql-connector-java-2.0.14-bin.jar // Statique et peut etre
jdbc.driver ne semble pas être une propriété par défaut. En tout cas elle ne figure pas dans la description javadoc de la méthode getProperties. Et je pense que ces variables sont chargées une fois pour toute au démarrage de la VM et qu'elle ne sont plus relues ensuite. En tout cas, j'avais essayé de faire System.setProperty("java.class.path", C:mysql-connector-java-2.0.14-bin.jar) et ça n'avait rien donné non plus.
Quoi qu'il en soit, si tu regardes mon messages du 13 juin, j'ai trouvé une solution.