我有一个处理jdbc的应用程序。它假设在任何有JRE的PC中使用,但它不会假设use将使用-cp命令行或更改他/她的类路径变量。因此用户在文件系统中的某个地方有我的应用程序,JRE和jdbc驱动程序。现在,他或她输入数据库连接信息,包括jdbc驱动程序jar的路径,然后发出sql请求。问题是我现在不知道如何在这个应用程序中访问jdbc驱动程序类。与用户显式将驱动程序添加到类路径的方式相同。
答案 0 :(得分:2)
我刚刚为您的其他帖子更改了部分miks answer。
执行以下代码让我获得了成功。
import java.io.File;
import java.lang.reflect.Constructor;
import java.net.URL;
import java.net.URLClassLoader;
public class URLClassLoaderSample {
public static void main( String [] args ) throws Exception {
File f = new File( "/home/ravinder/Desktop/mysql-connector-java-5.1.18-bin.jar" );
URLClassLoader urlCl = new URLClassLoader( new URL[] { f.toURL() }, System.class.getClassLoader() );
Class mySqlDriver = urlCl.loadClass( "com.mysql.jdbc.Driver" );
System.out.println( mySqlDriver.newInstance() );
System.out.println( "Is this interface? = " + mySqlDriver.isInterface() );
Class interfaces[] = mySqlDriver.getInterfaces();
int i = 1;
for( Class _interface : interfaces ) {
System.out.println( "Implemented Interface Name " + ( i++ ) + " = " + _interface.getName() );
} // for(...)
Constructor constructors[] = mySqlDriver.getConstructors();
for( Constructor constructor : constructors ) {
System.out.println( "Constructor Name = " + constructor.getName() );
System.out.println( "Is Constructor Accessible? = " + constructor.isAccessible() );
} // for(...)
} // psvm(...)
} // class URLClassLoaderSample
看到的输出如下:
com.mysql.jdbc.Driver@60aeb0
Is this interface? = false
Implemented Interface Name 1 = java.sql.Driver
Constructor Name = com.mysql.jdbc.Driver
Is Constructor Accessible? = false
And I don't understand what I should with log4jClass variable in my case *(com.mysql.jdbc.Driver)
现在让我希望你能得到它。
答案 1 :(得分:1)
此实例中的最佳解决方案是使用您的应用程序分发所需的驱动程序,并包含可执行包装程序或相应设置所需变量的shell脚本。这样,用户就可以直接使用它,而不必处理任何复杂的配置,也不需要他们下载任何其他文件。
答案 2 :(得分:0)
好吧,jdbc使用Class.forName("org.postgresql.Driver");
来加载驱动程序。所以,有一次,你有jar文件,并将它添加到类路径,这部分很容易。只需将驱动程序fqn类名的哈希值保存到jar文件名即可。或者您可以扫描jar类以获取Driver类。
Here's a convienent回答了如何在找到jar文件后将其添加到类路径中。