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 最后的评论):您必须在“构建”>“打包项目属性”中选中“复制依赖库”。

不清楚你到底做错了什么,但你显然做错了什么:

  1. 通常使用 DriverManager.getConnectionClass.forName 和特定的驱动程序 class 名称更好。这是 Oracle Java 教程推荐的方法;参见 https://docs.oracle.com/javase/tutorial/jdbc/basics/connecting.html

  2. 如果您通过其 class 名称加载驱动程序,请使用 com.mysql.jdbc.Driver 和 MySQL Connector/J 5.x 和 com.mysql.cj.jdbc.Driver 与 MySQL Connector/J 8.x.

  3. 如果这是一个网络应用程序,请确保相关的驱动程序 JAR 文件确实在您的 WAR 文件中,and/or 它已正确部署。

  4. 如果这是命令行应用程序,请确保在 运行time classpath 中包含驱动程序 JAR . (特别是如果您尝试在 IDE 之外 运行 它。)或者,考虑创建一个包含所有应用程序依赖项的阴影 JAR。 (很难给出建议,因为您没有告诉我们您是否使用 Ant、Maven、Gradle 等构建工具)

  5. 驱动程序实际上不需要是编译时依赖项,尽管这样做没什么坏处。 (危害在于,您可能会不小心将导入 MySQL 实现 classes 添加到您的应用中……并 运行 出现问题。)