However, loading a jar file programmatically is no big deal. You use java.net.URLClassLoader to load the class and get an instance to the newly loaded class. Let me start with this piece of code
- //lets say the jar file resides in /usr/home/user/myfile.jar
- String pathToURL = "usr/home/user/myfile.jar"
- URL url[] = new URL[1];
- url[0] = new URL("jar:file:/"+pathToURL+"!/");
- URLClassLoader classLoader = new URLClassLoader(url);
- //now get the class you are interested in
- Class<!----> myClass = classLoader.loadClass("org.package.MyClass");
This should all work fine until the time you want to load a JDBC driver jar file programmatically at run time. The restriction here is that the call to
- DriverManager.getConnection(driverURL,prop);
will result in looking at the system class path and it appears there is no way to add your own jar files into that space. After a lot of search I found a feasible solution. There are some methods in the URLClassLoader like
- protected void addURL(URL url);
- protected Class<!----> findclass(String name);
As you might have guessed these are less useful since these have access modifier of protected. Had it been public then we could have done something of this sort
- ClassLoader sysClassLoader = ClassLoader.getSystemClassLoader();
- //and then
- sysClassLoader.addURL(myJarUrl);
- //hopefully this should have worked
However, as these methods are protected you cannot use them. So as far as i can think, you cannot use the DriverManager.getConnection and pass it the url since you don't have the jar file in the System ClassLoader. The solution is to implement your own ClassLoader and get the driver from their, sounds a bit weird here is how you will want to go about it
- public class JDBCClassLoader extends URLClassLoader {
- //override the methods of interest
- @override
- public Class<!----> findClass(String name) {
- return super.findClass(name);
- }
- @override
- public JDBCClassLoader(URL[] urls) {
- super(urls);
- }
- }
So in the above code we define 2 methods of interest. 1 is the 1-arg constructor which passes on the url's array to the super implementation and the 2nd method is the findClass method that will give us back the Driver class that we want to get an instance of
In the implementation class we need to use this
- String pathToJDBCJar = "/home/usr/binvij/library/mysql/mysql.jar";
- URL url[] = new URL[1];
- url[0] = new URL(pathToJDBCJar);
- //instantiate our overriden class
- JDBCClassLoader loader = new JDBCClassLoader(url);
- //this should bring the class instance
- Class cls = (Class) loader.findClass("com.mysql.jdbc.Driver");
- //get an isntance of this class
- java.sql.Driver driver = (java.sql.Driver) cls.newInstance();
- //ask the driver to connect to the database
- driver.connect(databaseURL,prop);
And this will load the driver and connect with the target database server.
Until next post..