0

我有一个尝试连接到数据库的简单示例,只有在解压缩工作目录中的 mysql*.jar 文件时才能执行此操作。

  1. 我试图将 /path/to/mysql.jar.file 导出到 $PATH 和 $CLASSPATH 并且没有用。
  2. 我尝试使用包含这样的路径,但它不起作用: javac -cp ".:/usr/share/java/" HelloWorld.java

可能是什么问题。为什么找不到jar文件?

有什么想法吗?

4

1 回答 1

1

在运行 JVM 以及运行编译器时,您需要设置类路径。类路径必须包含 JAR 本身,而不是包含 JAR 的文件夹。

你的线

javac -cp ".:/usr/share/java" HelloWorld.java

表明您正在将类路径传递给javacJava 编译器,而不是 JVM。

让我们使用以下简单的类,它只是连接到 MySQL,然后再次断开连接:

import java.sql.*;

public class HelloWorld {
    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
        Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/db", "user", "password");
        System.out.println("Got connection");
        con.close();
    }
}

当我开始运行它时会发生以下情况:

C:\Users\Luke\Java>echo %CLASSPATH%
.;C:\Program Files (x86)\Java\jre6\lib\ext\QTJava.zip;C:\Users\Luke\stuff\ojdbc6.jar

C:\Users\Luke\Java>java HelloWorld
Exception in thread "main" java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.net.URLClassLoader$1.run(Unknown Source)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
        at java.lang.ClassLoader.loadClass(Unknown Source)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Unknown Source)
        at HelloWorld.main(HelloWorld.java:5)

在这种情况下,MySQL 驱动程序 JAR 不在类路径中,因此当我们尝试加载驱动程序类 ( com.mysql.jdbc.Driver) 时会出现错误。

如果我使用命令行开关将驱动程序 JAR 添加到类路径-cp(我在当前目录中有此 JAR 的副本),它可以工作:

C:\Users\Luke\Java>java -cp .;mysql-connector-java-5.1.18-bin.jar HelloWorld
Got connection

(我在 Windows 上,所以我;用作路径分隔符。你似乎在使用 Unix 的某些方言,所以你应该:改用。)

同样,如果我们将 JAR 添加到CLASSPATH环境变量中,它也可以:

C:\Users\Luke\Java>set CLASSPATH=%CLASSPATH%;mysql-connector-java-5.1.18-bin.jar

C:\Users\Luke\Java>java HelloWorld
Got connection
于 2012-08-12T08:16:19.563 回答