ClassNotFound & No Suitable Driver,我哪里出错了?
ClassNotFound & No Suitable Driver, where did I go wrong?
我创建了一个在 NetBeans IDE 中完美运行的程序,但是每当我构建 .jar 文件时,数据库连接都会停止工作。我已经将 CLASSPATH 添加到 MySQL 连接器,并定义了 Class.forName("com.mysql.jdbc.Driver");还是什么都没有..
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/gearheads";
Connection conn = DriverManager.getConnection(url,"root","HellOnEarth202021");
Statement stmt = conn.createStatement();
ResultSet rs;
String pid = txt_staffID.getText();
rs = stmt.executeQuery("SELECT name,timeraccess FROM staff WHERE staffid = '"+pid+"'");
while ( rs.next() ) {
String timeraccess = rs.getString("timeraccess");
String staffName = rs.getString("name");
getLogin = staffName;
System.out.println(staffName);
System.out.println("Users Admin Level: " + timeraccess);
if ( timeraccess.equals("1")) {
this.dispose();
new menu().setVisible(true);
System.out.println("Access Granted");
}else
System.out.println("Access Restricted.");
}
conn.close();
} catch (Exception e) {
System.err.println("Got an exception! ");
txt_staffID.setText(e.toString());
System.err.println(e.getMessage());
}
就目前而言,输出:
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
取出 Class.forName 输出的地方:
java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/gearheads
请帮助我。这个 link 是我的图书馆的截图。
我的图书馆:
如果它在 Netbeans 中正确运行,那么 MySQL 驱动程序是正确的。
您必须搜索清单文件 (MANIFEST.MF),并且可能 必须将驱动程序的内容解压到您自己的 JAR 文件中。
我现在会留下这个答案,但会尝试收集详细信息以将其带回这里。
我也使用 NetBeans,当我生成 JAR 文件时,它已经复制了依赖库并生成了正确的 MANIFEST.MF。
我最终得到了以下结构
MyProject\dist\lib\JdbcDriver.jar
and
MyProject\dist\MyProject.jar
在MyProject.jar里面,我有以下MANIFEST.MF:
Manifest-Version: 1.0
Ant-Version: Apache Ant 1.9.7
Created-By: 1.8.0_201-b09 (Oracle Corporation)
Class-Path: lib/JdbcDriver.jar
X-COMMENT: Main-Class will be added automatically by build
Main-Class: myproject.MyMainClass
请确认您是否将 lib 文件夹与您的 JAR 文件一起复制。
在这里留下最终解决方案(@Nick Media 最后的评论):您必须在“构建”>“打包项目属性”中选中“复制依赖库”。
不清楚你到底做错了什么,但你显然做错了什么:
通常使用 DriverManager.getConnection
比 Class.forName
和特定的驱动程序 class 名称更好。这是 Oracle Java 教程推荐的方法;参见 https://docs.oracle.com/javase/tutorial/jdbc/basics/connecting.html
如果您通过其 class 名称加载驱动程序,请使用 com.mysql.jdbc.Driver
和 MySQL Connector/J 5.x 和 com.mysql.cj.jdbc.Driver
与 MySQL Connector/J 8.x.
如果这是一个网络应用程序,请确保相关的驱动程序 JAR 文件确实在您的 WAR 文件中,and/or 它已正确部署。
如果这是命令行应用程序,请确保在 运行time classpath 中包含驱动程序 JAR . (特别是如果您尝试在 IDE 之外 运行 它。)或者,考虑创建一个包含所有应用程序依赖项的阴影 JAR。 (很难给出建议,因为您没有告诉我们您是否使用 Ant、Maven、Gradle 等构建工具)
驱动程序实际上不需要是编译时依赖项,尽管这样做没什么坏处。 (危害在于,您可能会不小心将导入 MySQL 实现 classes 添加到您的应用中……并 运行 出现问题。)
我创建了一个在 NetBeans IDE 中完美运行的程序,但是每当我构建 .jar 文件时,数据库连接都会停止工作。我已经将 CLASSPATH 添加到 MySQL 连接器,并定义了 Class.forName("com.mysql.jdbc.Driver");还是什么都没有..
try {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/gearheads";
Connection conn = DriverManager.getConnection(url,"root","HellOnEarth202021");
Statement stmt = conn.createStatement();
ResultSet rs;
String pid = txt_staffID.getText();
rs = stmt.executeQuery("SELECT name,timeraccess FROM staff WHERE staffid = '"+pid+"'");
while ( rs.next() ) {
String timeraccess = rs.getString("timeraccess");
String staffName = rs.getString("name");
getLogin = staffName;
System.out.println(staffName);
System.out.println("Users Admin Level: " + timeraccess);
if ( timeraccess.equals("1")) {
this.dispose();
new menu().setVisible(true);
System.out.println("Access Granted");
}else
System.out.println("Access Restricted.");
}
conn.close();
} catch (Exception e) {
System.err.println("Got an exception! ");
txt_staffID.setText(e.toString());
System.err.println(e.getMessage());
}
就目前而言,输出:
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
取出 Class.forName 输出的地方:
java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/gearheads
请帮助我。这个 link 是我的图书馆的截图。
我的图书馆:
如果它在 Netbeans 中正确运行,那么 MySQL 驱动程序是正确的。
您必须搜索清单文件 (MANIFEST.MF),并且可能 必须将驱动程序的内容解压到您自己的 JAR 文件中。
我现在会留下这个答案,但会尝试收集详细信息以将其带回这里。
我也使用 NetBeans,当我生成 JAR 文件时,它已经复制了依赖库并生成了正确的 MANIFEST.MF。
我最终得到了以下结构
MyProject\dist\lib\JdbcDriver.jar and MyProject\dist\MyProject.jar
在MyProject.jar里面,我有以下MANIFEST.MF:
Manifest-Version: 1.0 Ant-Version: Apache Ant 1.9.7 Created-By: 1.8.0_201-b09 (Oracle Corporation) Class-Path: lib/JdbcDriver.jar X-COMMENT: Main-Class will be added automatically by build Main-Class: myproject.MyMainClass
请确认您是否将 lib 文件夹与您的 JAR 文件一起复制。
在这里留下最终解决方案(@Nick Media 最后的评论):您必须在“构建”>“打包项目属性”中选中“复制依赖库”。
不清楚你到底做错了什么,但你显然做错了什么:
通常使用
DriverManager.getConnection
比Class.forName
和特定的驱动程序 class 名称更好。这是 Oracle Java 教程推荐的方法;参见 https://docs.oracle.com/javase/tutorial/jdbc/basics/connecting.html如果您通过其 class 名称加载驱动程序,请使用
com.mysql.jdbc.Driver
和 MySQL Connector/J 5.x 和com.mysql.cj.jdbc.Driver
与 MySQL Connector/J 8.x.如果这是一个网络应用程序,请确保相关的驱动程序 JAR 文件确实在您的 WAR 文件中,and/or 它已正确部署。
如果这是命令行应用程序,请确保在 运行time classpath 中包含驱动程序 JAR . (特别是如果您尝试在 IDE 之外 运行 它。)或者,考虑创建一个包含所有应用程序依赖项的阴影 JAR。 (很难给出建议,因为您没有告诉我们您是否使用 Ant、Maven、Gradle 等构建工具)
驱动程序实际上不需要是编译时依赖项,尽管这样做没什么坏处。 (危害在于,您可能会不小心将导入 MySQL 实现 classes 添加到您的应用中……并 运行 出现问题。)