ClassNotFoundException error despite having MySQL connector JAR file in classpath

I’m trying to establish a connection to my local MySQL database using Java but keep running into issues.

I have MySQL connector jar file version 8.0.20 saved in /usr/share/java/mysql-connector-java-8.0.20.jar on my Ubuntu 18.04 system.

My compilation works fine when I use:
javac -cp "/usr/share/java/mysql-connector-java-8.0.20.jar" DatabaseTest.java

But when I try to run it with:
java DatabaseTest

I get this error:

Exception in thread "main" java.lang.NoClassDefFoundError: com/mysql/cj/jdbc/MysqlDataSource
        at DatabaseTest.main(DatabaseTest.java:12)...

Here’s my simple test code:

import java.sql.Connection;
import java.sql.SQLException;
import com.mysql.cj.jdbc.MysqlDataSource;

public class DatabaseTest {
    public static void main(String[] args) {
        MysqlDataSource source = new MysqlDataSource();
        source.setUser("admin");
        source.setPassword("password123");
        source.setServerName("127.0.0.1");
        
        Connection connection;
        try {
            connection = source.getConnection();
            connection.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
}

The jar file definitely exists at that location. What am I missing here?

You need the classpath when running, not just compiling. javac found the MySQL connector during compilation, but Java can’t locate it at runtime. Change your run command to: java -cp "/usr/share/java/mysql-connector-java-8.0.20.jar:." DatabaseTest. The colon and dot are crucial - they tell Java to check the current directory for your compiled DatabaseTest.class file. Without it, Java won’t find your main class even with the MySQL jar included. I hit this same issue when I started using external libraries. Compilation just verifies the classes exist, but runtime needs the actual bytecode from the jar.