Nick Media
Nick Media

Reputation: 3

ClassNotFound & No Suitable Driver, where did I go wrong?

I have created a program that works perfectly in the IDE on NetBeans, but anytime I build the .jar file, the database connection stops working. I've already added the CLASSPATH to the MySQL Connector, as well as defined Class.forName("com.mysql.jdbc.Driver"); Still nothing..

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());
    }

This, as it stands, outputs:

java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

Where taking out the Class.forName outputs:

java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/gearheads

Please help me. This link is a screenshot of my libraries.

My Libraries:

enter image description here

Upvotes: 0

Views: 554

Answers (2)

Ramon Chiara
Ramon Chiara

Reputation: 656

If its runnning correctly inside Netbeans, then the MySQL driver is correct.

You have to search for Manifest file (MANIFEST.MF) and probably will have to unjar the contents of the driver inside your own JAR file.

I'll leave this answer by now, but will try to gather the details to bring it back here.

I also use NetBeans and when I generate the JAR file, its already copying the dependant libraries and generating the correct MANIFEST.MF.

I ended up with the following structure

MyProject\dist\lib\JdbcDriver.jar
and
MyProject\dist\MyProject.jar

Inside MyProject.jar, I have the following 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

Please, verify with you are copying the lib folder altogether with your JAR file.


Just to leave here the final solution (@Nick Media final comment): you have to check "Copy Dependent Libraries" in Build>Packaging Project Properties.

Upvotes: 1

Stephen C
Stephen C

Reputation: 718678

It is not clear exactly what you are doing wrong, but you are clearly doing something incorrectly:

  1. It is often better to use DriverManager.getConnection rather than Class.forName and a specific driver class name. This is the approach recommended by the Oracle Java Tutorial; see https://docs.oracle.com/javase/tutorial/jdbc/basics/connecting.html

  2. If you are loading the driver via its classname, use com.mysql.jdbc.Driver with MySQL Connector/J 5.x and com.mysql.cj.jdbc.Driver with MySQL Connector/J 8.x.

  3. If this is a webapp, make sure that the relevant driver JAR file is actually in your WAR file, and/or that it is being deployed correctly.

  4. If this is a command line app, make sure that you include the driver JAR on the runtime classpath. (Especially if you are trying to run it outside of your IDE.) Alternatively, consider creating a shaded JAR that included all of the apps dependencies. (It is a bit hard to advise since you haven't told us if you are using a build tool like Ant, Maven, Gradle, etc.)

  5. The driver doesn't actually need to be a compile time dependency, though there is little harm in doing that. (The harm is that you might accidentally add imports to the MySQL implementation classes to your app ... and run into problems.)

Upvotes: 0

Related Questions