Java mysql-connector ClassNotFoundException尽管提交了帖子

时间:2019-01-26 23:17:14

标签: java jar classnotfoundexception mysql-connector ubuntu-18.04

仍然从ClassNotFoundException获得编译错误com.mysql.cj.jdbc.Driver

来自java-8 mysql-connector-java-5.1.147.jarmysql-connector-java-5.1.47-bin.jar(尽管大多数帖子都说需要bin.jar)

我解压缩了tar文件并将两个mysql-connector jar文件复制到/usr/lib/jvm/java-8-oracle/lib和我的执行文件夹/var/www/html中,以防万一 另外,我将classpath放在/etc/environment中,并在Java文件中以及进行编译时放置(首先分别尝试)。

然后编译,在有编译和无编译的情况下尝试

在所有这些情况下(以及其他排列)都得到相同的错误:

  

线程“ main”中的异常java.lang.ClassNotFoundException:   com.mysql.cj.jdbc.Driver

... 最初是从bbfq.main

调用的

关于我在哪里没有正确编码类路径的其他想法? (此发布内容可能未显示我编写时的代码间距和缩进)

谢谢。

In /etc/environment:  
JAVA_HOME="/usr/lib/jvm/java-8-oracle/bin"  
export JAVA_HOME  
CLASSPATH=".:/usr/lib/jvm/java-8-oracle/lib:/var/www/html"  
export CLASSPATH

in java file:
import java.sql.*;
import java.io.*;
public class bbfq {
....
Connection con=null;
...
try {
   Class.forName("com.mysql.cj.jdbc.Driver");
   con=DriverManager.getConnection("jdbc:mysql//localhost:3306/drupal7" "id" "password");
....

Manifest file bbfq.mf:
Manifest-Version: 1.0
Class-Path: phidget22.jar mysql-connector-java-5.1.47.jar mysql-connector-java-5.1.47-bin.jar

compiled with and without declaring classpath:
sudo javac -classpath bbfq.java    
or    
sudo javac -classpath .:mysql-connector-java-5.1.47.jar:mysql-connector-java-5.1.47-bin.jar bbfq.java

and tried to run with or without classpath:
sudo java -jar bbfq.jar   
or    
sudo java -classpath .:bbfq:mysql-connector-java-5.1.47-bin.jar -jar bbfq.jar

谢谢。

1 个答案:

答案 0 :(得分:3)

首先,删除Class.forName("com.mysql.ch.jdbc.Driver");。多年来并不需要这样做,因为JDBC驱动程序是使用service provider进程定位的。

即使有保证,您的Class.forName调用也假定驱动程序类为com.mysql.ch.jdbc.Driver。情况不再如此,实际上,驱动程序.jar文件中没有此类,因此Class.forName调用将始终失败。

第二,使用-classpath选项时,将忽略-jar选项。来自documentation

  

使用-jar时,指定的JAR文件是所有用户类的源,而其他类路径设置将被忽略。

使用-jar选项时,仅清单的Class-Path属性用于将其他文件添加到类路径。

Class-Path属性实际上是a list of relative URLs,用空格分隔。它们相对于包含清单的.jar文件。

因此,您必须将mysql-connector-java-5.1.47-bin.jar放置在与bbfq.jar相同的目录中,以使其在读取Class-Path清单属性时被类加载器拾取。 / p>