LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (https://www.linuxquestions.org/questions/programming-9/)
-   -   java cannot find mysql connector (https://www.linuxquestions.org/questions/programming-9/java-cannot-find-mysql-connector-885950/)

jordanwb 06-12-2011 07:41 PM

java cannot find mysql connector
 
I'm trying to use MySQL's JDBC connector for java but even though I set the CLASSPATH variable, java cannot find the com.mysql.jdbc.Driver class.

Code:

[jordan@Jordan-Laptop java-stuff]$ ls /usr/share/java
cal10n                          geronimo-jta.jar            java_cup-runtime.jar  js-1.7.jar        mysql-connector-java-5.1.15.jar  rhino-examples.jar
gcj-endorsed                    java_cup-0.11a.jar          jaxp_parser_impl.jar  js.jar            mysql-connector-java.jar        rhino.jar
geronimo-jta-1.1.1.jar          java_cup.jar                jline-0.9.94.jar      jta.jar          rhino-1.7.jar                    sinjdoc.jar
geronimo-jta_1.1_spec-1.1.1.jar  java_cup-runtime-0.11a.jar  jline.jar            libgcj-4.5.1.jar  rhino-examples-1.7.jar          slf4j
[jordan@Jordan-Laptop java-stuff]$ echo $CLASSPATH
/usr/share/java
[jordan@Jordan-Laptop java-stuff]$ java  -jar my-jar.jar
Exception in thread "main" java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
        at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:186)
        at Server.loadMysqlDriver(Server.java:29)
        at Server.<init>(Server.java:23)
        at Server.main(Server.java:42)

I installed the jre and the mysql connector package via Fedora's package manager

dwhitney67 06-12-2011 08:09 PM

EDIT (sorry)... I did not see where you echo-ed the CLASSPATH. It should be set to (something like):
Code:

CLASSPATH=./:/usr/share/java/mysql-connector-java.jar
It also would be helpful to know whether the mysqld service is running on your system. Lastly, it wouldn't hurt to post the relevant Java source code of your application.

jordanwb 06-12-2011 08:27 PM

Quote:

Originally Posted by dwhitney67 (Post 4383703)
It also would be helpful to know whether the mysqld service is running on your system.

I'm running MySQL on another machine.

Quote:

Originally Posted by dwhitney67 (Post 4383703)
Lastly, it wouldn't hurt to post the relevant Java source code of your application.

Code:

import java.sql.*;
import java.util.Properties;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.Socket;
/**
 * Write a description of class Server here.
 *
 * @author (your name)
 * @version (a version number or a date)
 */
public class Server
{
    private Connection db;
    private Properties settings;
   
    public Server() throws Exception
    {
        this.settings = new Properties();
        this.settings.load (new FileInputStream ("settings.conf"));
       
        try
        {
            this.loadMysqlDriver();
        }
        catch (ClassNotFoundException cnfe)
        {
            System.out.println ("The MySQL driver could not be found. Are you sure its installed?");
            return;
        }
       
        try
        {
            this.connectToMysqlServer();
        }
        catch (SQLException sqle)
        {
            System.out.println ("A connection could not be made with the MySQL server.");
            return;
        }
    }
   
    private void loadMysqlDriver () throws ClassNotFoundException, InstantiationException, IllegalAccessException, ClassNotFoundException
    {
        Class.forName("com.mysql.jdbc.Driver").newInstance();
    }
   
    private void connectToMysqlServer () throws SQLException
    {
        String url = "jdbc:mysql://" + this.settings.getProperty ("mysql-location") + ":" + this.settings.getProperty ("mysql-port") + "/" + this.settings.getProperty ("mysql-database");
           
        this.db = DriverManager.getConnection (url, this.settings.getProperty ("mysql-username"), this.settings.getProperty ("mysql-password"));
    }
   
    public static void main(String args[]) throws Exception
    {
        new Server();
    }
}

I tried

Code:

CLASSPATH=./:/usr/share/java/mysql-connector-java.jar
but the same thing happened.

Thanks

dwhitney67 06-12-2011 09:43 PM

Quote:

Originally Posted by jordanwb (Post 4383713)
... but the same thing happened.

I presume you mean the "class not found" exception. Please verify that you have setup the CLASSPATH correctly, perhaps even making sure that it is exported.

I just installed the relevant MySql packages on my other machine, setup the class-path, and then executed a program similar to yours. The application ran successfully.

oposit 06-12-2011 10:19 PM

Maybe you need MySQL connector for Java
 
Take a look at http://www.mysql.com/downloads/connector/j/

jordanwb 06-13-2011 08:48 AM

Quote:

Originally Posted by dwhitney67 (Post 4383749)
I presume you mean the "class not found" exception. Please verify that you have setup the CLASSPATH correctly, perhaps even making sure that it is exported.

I just installed the relevant MySql packages on my other machine, setup the class-path, and then executed a program similar to yours. The application ran successfully.

Yes I got a Class Not Found Exception. This is what I've done:

Code:

[jordan@Jordan-Laptop java-stuff]$ export CLASSPATH=./:/usr/share/java/mysql-connector-java.jar
[jordan@Jordan-Laptop java-stuff]$ echo $CLASSPATH
./:/usr/share/java/mysql-connector-java.jar
[jordan@Jordan-Laptop java-stuff]$ java -jar ./my-jar.jar
Exception in thread "main" java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
        at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:186)
        at Server.loadMysqlDriver(Server.java:29)
        at Server.<init>(Server.java:23)
        at Server.main(Server.java:42)

Quote:

Originally Posted by oposit (Post 4383765)

Fedora's repos have the mysql connector. Thanks though.

dwhitney67 06-13-2011 09:11 AM

The only other thing I can think of is that there is a firewall blocking the port on at least one of your machines.

Can you get the application to connect to MySQL if you run it on the localhost where mysqld is running?

jordanwb 06-13-2011 10:40 AM

Quote:

Originally Posted by dwhitney67 (Post 4384191)
The only other thing I can think of is that there is a firewall blocking the port on at least one of your machines.

Why would that prevent java from finding the MySQL driver? That's the problem I'm having.

Quote:

Originally Posted by dwhitney67 (Post 4384191)
Can you get the application to connect to MySQL if you run it on the localhost where mysqld is running?

No because on that machine java can't find the MySQL driver either.

dwhitney67 06-13-2011 11:21 AM

Quote:

Originally Posted by jordanwb (Post 4384281)
Why would that prevent java from finding the MySQL driver? That's the problem I'm having.

You're right; it shouldn't make a difference.


Quote:

Originally Posted by jordanwb (Post 4384281)
No because on that machine java can't find the MySQL driver either.

I do not know what else to suggest. What version of Java do you have installed? On my system I have:
Code:

java -version
java version "1.6.0_20"
OpenJDK Runtime Environment (IcedTea6 1.9.7) (6b20-1.9.7-0ubuntu1~10.04.1)
OpenJDK Client VM (build 19.0-b09, mixed mode, sharing)


jordanwb 06-13-2011 11:26 AM

Code:

$java -version
java version "1.6.0_20"
OpenJDK Runtime Environment (IcedTear6 1.9.8) (fedora-53.1.9.8.fc14-x86_64)
OpenJDK 64-bit Server VM (build 19.0-b09, mixed mode)


dwhitney67 06-13-2011 11:41 AM

As I stated earlier, I used a similar app to yours to test. I got it working on both under Ubuntu systems (10.04 and 10.11). Here's the code:
Code:

import java.sql.*;
import java.util.Properties;
import java.io.FileInputStream;

public class DB
{
  private Connection dbConn;

  public DB()
  {
      try {
        Properties settings = new Properties();
        settings.load(new FileInputStream("db_credentials.conf"));

        Class.forName("com.mysql.jdbc.Driver").newInstance();

        String url = "jdbc:mysql://" + settings.getProperty("mysql-location") +
                      ":" + settings.getProperty("mysql-port") +
                      "/" + settings.getProperty("mysql-database");

        dbConn = DriverManager.getConnection(url,
                                              settings.getProperty("mysql-user"),
                                              settings.getProperty("mysql-password"));

        if (dbConn != null)
        {
            System.out.println("Success!");
            dbConn.close();
        }
      }
      catch (SQLException e) {
        System.err.println("SQLException: " + e.getMessage());
        System.err.println("SQLState    : " + e.getSQLState());
        System.err.println("Vendor Error: " + e.getErrorCode());
      }
      catch (Exception e) {
        System.err.println("unable to load jdbc driver.");
      }
  }

  public static void main(String[] args)
  {
      DB db = new DB();
  }
}


P.S. Check the file permissions for /usr/share/java/mysql-connector-java.jar to ensure that you can read it.

jordanwb 06-13-2011 11:59 AM

Code:

[jordan@Jordan-Laptop java-stuff]$ ls -FGg /usr/share/java/mysql-connector-java.jar
lrwxrwxrwx. 1 31 Jun 12 18:29 /usr/share/java/mysql-connector-java.jar -> mysql-connector-java-5.1.15.jar*
[jordan@Jordan-Laptop java-stuff]$ ls -FGg /usr/share/java/mysql-connector-java-5.1.15.jar
-rwxr-xr-x. 1 817285 Feb 10 02:12 /usr/share/java/mysql-connector-java-5.1.15.jar*
[jordan@Jordan-Laptop java-stuff]$ export CLASSPATH=./:/usr/share/java/mysql-connector-java.jar
[jordan@Jordan-Laptop java-stuff]$ java -jar ./my-jar.jar
Exception in thread "main" java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
        at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:186)
        at Server.loadMysqlDriver(Server.java:29)
        at Server.<init>(Server.java:23)
        at Server.main(Server.java:42)

Huh.

paulsm4 06-13-2011 04:33 PM

Jordanwb - Please execute and cut/paste the exact output of these three commands:
Code:

export CLASSPATH=./:/usr/share/java/mysql-connector-java.jar; echo $CLASSPATH

ls -l /usr/share/java/mysql-connector-java.jar

java -cp $CLASSPATH -jar ./my-jar.jar


jordanwb 06-13-2011 09:38 PM

Sure:

Code:

[jordan@Jordan-Laptop ~]$ cd ~/Desktop/java-stuff/
[jordan@Jordan-Laptop java-stuff]$ export CLASSPATH=./:/usr/share/java/mysql-connector-java.jar; echo $CLASSPATH
./:/usr/share/java/mysql-connector-java.jar
[jordan@Jordan-Laptop java-stuff]$
[jordan@Jordan-Laptop java-stuff]$ ls -l /usr/share/java/mysql-connector-java.jar
lrwxrwxrwx. 1 root root 31 Jun 12 18:29 /usr/share/java/mysql-connector-java.jar -> mysql-connector-java-5.1.15.jar
[jordan@Jordan-Laptop java-stuff]$
[jordan@Jordan-Laptop java-stuff]$ java -cp $CLASSPATH -jar ./my-jar.jar
Exception in thread "main" java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
        at java.net.URLClassLoader$1.run(URLClassLoader.java:217)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:186)
        at Server.loadMysqlDriver(Server.java:29)
        at Server.<init>(Server.java:23)
        at Server.main(Server.java:42)
[jordan@Jordan-Laptop java-stuff]$


paulsm4 06-13-2011 10:54 PM

Cool - thanx.

Code:

ls -l /usr/share/java/mysql-connector-java.jar
lrwxrwxrwx. 1 root root 31 Jun 12 18:29 /usr/share/java/mysql-connector-java.jar -> mysql-connector-java-5.1.15.jar

Soooooo -

"mysql-connector-java.jar" is a symbolic link (NOT the .jar file itself).

Q: Do you know if the file it's pointing to, "mysql-connector-java-5.1.15.jar" exists?

Please run these commands (cut/paste both the command and the output, as you did before):
Code:

ls -l /usr/share/java/mysql-connector-java.jar

ls -lL /usr/share/java/mysql-connector-java.jar

ls -l /usr/share/java/mysql-connector-java-5.1.15.jar

My guess is that maybe the whole problem has been a bad symbolic link :)

PS:
There's no reason you couldn't just (re) download the MySql JDBC connector, and put it wherever you want. Just make sure your $CLASSPATH variable (or, better, "-cp" command-line option) points to it.


All times are GMT -5. The time now is 08:52 AM.