【发布时间】:2015-03-25 19:50:25
【问题描述】:
每当我运行以下代码时:
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 实用程序将 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()”方法,但无济于事。
【问题讨论】:
-
“/myProjectDir/lib/mysql-connector-java-5.0.8-bin.jar”是jar的绝对路径吗?
-
是的。我知道这很糟糕,但是当我开始工作时我会担心清理它。
-
为什么需要使用自定义类加载器?您可以删除该行并调用 Class.forName("com.mysql.jdbc.Driver") 吗?
-
@exxodus7 让它工作的唯一方法就是清理它。
-
@exxodus7 我的意思和你所说的“清理它”完全一样。你是介绍这个词的人。事实是您将不得不将 JAR 文件添加到应用程序的 CLASSPATH 中,这不需要更改调用此方法的代码,然后您可以删除
Class.forName()调用,这还没有从 2007 年开始需要。