chargement dynamique driver jdbc
Bonjour a tous,
J'ai un petit problème, je souhaiterais pouvoir, via un fichier de propriétés me connecter à n'importe quelle base de données sans avoir a utiliser un classpath dans ma commande java.
Pour se faire j'ai utilise un fichier de propriétés avec ces données :
Code:
1 2 3 4 5 6 7
|
user = alt157
mdp = **********
base = mabase
url = jdbc:postgresql://192.168.0.11/mabase
driver = org.postgresql.Driver
jar = /usr/share/java/postgresql.jar |
Dans mon code je charge les classes de la sorte :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Enumeration;
import java.util.Properties;
import java.io.InputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.URLClassLoader;
import java.net.URL;
import java.util.jar.JarFile;
public class Test
{
public static void main ( String[] args) throws Exception
{
Properties prop = new Properties();
InputStream file = new FileInputStream("config.txt");
prop.load(file);
Connection con = null;
String url = prop.getProperty("url");
String user = prop.getProperty("user");
String mdp = prop.getProperty("mdp");
String jar = prop.getProperty("jar");
File f = new File(jar);
URLClassLoader loader = new URLClassLoader(new URL[] { f.toURL() } );
JarFile leJar = new JarFile(f.getAbsolutePath());
Enumeration I = leJar.entries();
while ( I.hasMoreElements() ) {
String tmp = I.nextElement().toString();
if ( tmp.endsWith(".class") ) {
tmp = tmp.substring(0,tmp.length()-6);
tmp = tmp.replaceAll("/",".");
System.out.println(tmp);
Class.forName(tmp ,true,loader);
}
}
con = DriverManager.getConnection(url, user, mdp );
}
} |
Mais cela me renvoie une erreur :
Citation:
Exception in thread "main" java.sql.SQLException: No suitable driver found for jdbc:postgresql://192.168.0.11/mabase
at java.sql.DriverManager.getConnection(DriverManager.java:640)
at java.sql.DriverManager.getConnection(DriverManager.java:200)
at Test.main(Test.java:40)
Je ne vois vraiment pas ou il y a un probleme, j'ai tente de mettre le retour de Class.forName dans une variable de type Class et de l'afficher a l'écran. A priori il me charge bien toutes les classes de mon .jar...
Je tiens juste a préciser que si j'utilise simplement la commande java :
Code:
1 2
|
java -classpath /usr/share/java/postgresql.jar:. Test |
Cela fonctionne mais j'ai pas envie de m'embêter a gérer ce classpath car l'application devra être utilisable facilement et l'on devra pouvoir attaquer différentes bases sans avoir a changer le classapth ou a redémarrer l'application.
Merci d'avance a vous tous