每当我运行以下代码时:
public void insertIntoMysql() {
URLClassLoader childCl = new URLClassLoader(new URL[] {new URL("file:///myProjectDir/lib/mysql-connector-java-5.0.8-bin.jar")}, this.getClass().getClassLoader());
try {
// connect to mysql
Class.forName("com.mysql.jdbc.Driver", true, childCl);
String myUrl = "jdbc:mysql://localhost:3306/myDB";
Connection conn = DriverManager.getConnection(myUrl, "root", "adminpw");
...
} catch {
...
}
}
我在调用DriverManager时遇到“java.sql.SQLException:找不到适合jdbc:mysql:// localhost:3306 / myDB的驱动程序”错误。
我猜这与我用自定义类加载器加载驱动程序的事实有关(我无法修改调用代码,因此无法更改调用脚本时加载的类路径)。它似乎在Class.forName行中找到驱动程序就好了,但它就像那个类以后从未加载过两行。
有什么想法吗?
---更新---
我想出了如何使用BeanShell util在运行时向我的类路径添加jar,删除过时的forName,并停止使用自定义类加载器。我的更新代码如下:
import com.mysql.jdbc.Driver;
public void insertIntoMysql() {
try {
addClassPath("/lib/mysql-connector-java-5.0.8-bin.jar");
// printing out the classpath URLs here shows several
// jar files along with the one I just added:
// file:/C:/myProjectDir/lib/mysql-connector-java-5.0.8-bin.jar
// connect to mysql
String myUrl = "jdbc:mysql://localhost:3306/myDB";
Connection conn = DriverManager.getConnection(myUrl, "root", "adminpw");
...
} catch {
...
}
}
然而,即使我的类路径已经更新,我仍然得到与我最初获得的相同的SQLException。
我还尝试在添加新类路径后立即调用BeanShell的“reloadClasses()”方法,但无济于事。
答案 0 :(得分:2)
是的,这与用于加载类的自定义类加载器有关。在DriverManager
的Javadocs中也提到了这一点:
当调用方法
getConnection
时,DriverManager
将尝试从初始化时加载的那些驱动程序中找到合适的驱动程序,并使用相同的类加载器作为当前小程序或应用程序。
答案 1 :(得分:0)
jar文件应位于 classpath
中