Получение NoClassDefFoundError: com.mysql.jdbc.Driver
В настоящее время я пишу клиент-серверное приложение jdbc в Java. У меня возникли некоторые проблемы с инициализацией jdbc, так как я не использую ide, просто текстовый редактор и jdk. Я поместил свой драйвер jdbc в мои пути к классам jdk и jre C:\Program Files\Java\jdk1.6.0_20\jre\lib\ext и \jre\lib\ext . Я также переименовал банку в com.mysql.jdbc.driver, но мне все еще не повезло. Это проблема с драйвером не найден или это что то другое?
Вот моя ошибка:
C:\Users\imallin\My Documents>java Provider
Waiting for connection
Connection received from 127.0.0.1
server>Hi welcome to the Cyfieithu Eadar-Theangachadh translation server, please
enter a command. Type cmd to see a list of commands
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
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 Provider.insertData(Provider.java:82)
at Provider.run(Provider.java:40)
at Provider.main(Provider.java:118)
Вот мой код:
import java.io.*;
import java.net.*;
import java.util.Scanner;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Provider{
ServerSocket providerSocket;
Socket connection = null;
ObjectOutputStream out;
ObjectInputStream in;
String message;
Connection con;
Provider(){}
void run()
{
Console c = System.console();
if (c == null) {
System.err.println("No console.");
System.exit(1);
}
try{
//1. creating a server socket
providerSocket = new ServerSocket(2004, 10);
//2. Wait for connection
System.out.println("Waiting for connection");
connection = providerSocket.accept();
System.out.println("Connection received from " + connection.getInetAddress().getHostName());
//3. get Input and Output streams
out = new ObjectOutputStream(connection.getOutputStream());
out.flush();
in = new ObjectInputStream(connection.getInputStream());
sendMessage("Hi welcome to the Cyfieithu Eadar-Theangachadh translation server, please enter a command. Type cmd to see a list of commands");
//4. The two parts communicate via the input and output streams
do{
try{
insertData();
message = (String) in.readObject();
System.out.println("client>" + message);
if (message.equals("register"))
sendMessage("first name?");
String firstName = (message);
sendMessage("first name = " + firstName);
insertData();
if (message.equals("listlanguages"))
sendMessage("English \n Thai \n Geordia \n Gaelic \n Welsh \n Gaelic \n Urdu \n Polish \n Punjabi \n Cantonese \n Mandarin");
if (message.equals("bye"))
sendMessage("bye");
}
catch(ClassNotFoundException classnot){
System.err.println("Data received in unknown format");
}
catch (Exception e){
System.err.println("Error: " + e.getMessage());
}
}while(!message.equals("bye"));
}
catch(IOException ioException){
ioException.printStackTrace();
}
finally{
//4: Closing connection
try{
in.close();
out.close();
providerSocket.close();
}
catch(IOException ioException){
ioException.printStackTrace();
}
}
}
private void insertData()
{
try
{
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection(
"jdbc:mysql://localhost/translator","root","");
String sql = "Insert INTO users (ID, firstName) VALUES ('123','123')";
Statement statement = con.createStatement();
statement.execute(sql);
}
catch (Exception e){
System.err.println("Error: " + e.getMessage());
}
}
void sendMessage(String msg)
{
try{
out.writeObject(msg);
out.flush();
System.out.println("server>" + msg);
}
catch(IOException ioException){
ioException.printStackTrace();
}
}
public static void main(String args[])
{
Provider server = new Provider();
while(true){
server.run();
}
}
}
3 ответа
Как уже намекали другие ответы, jdbc Jar не находится на вашем пути к классам.
Чтобы это исправить, вам нужно объявить при запуске основного файла Java, что он должен использовать этот Jar, выполнив:
java -cp "nameOfJar.jar" Provider
Это предполагает, что ваш jar находится в том же каталоге, что и ваш файл провайдера, если нет, вы должны указать путь к нему.
Это совершенно необязательно, но мне нравится иметь каталог с именем "lib", куда я помещаю все jar-файлы, необходимые для запуска моего проекта, а затем вы можете добавить его в classpath, выполнив:
java -cp "./lib/*;." NameOfJavaClassWithMain
В конечном итоге вы можете получить несколько каталогов или jar-файлов, которые нужно добавить в путь к классам. Это можно сделать с помощью ;
(:
в Linux) разделитель, как:
java -cp "./lib/*;./conf/configurationFile.properties;." NameOfJavaClassWithMain
Если ваш.class не находится на одном из Jar-файлов, вам, возможно, придется добавить локальный каталог в ваш classpath:
java -cp "./lib/*;." NameOfJavaClassWithMain
Если у вас есть объявление пакета в вашем классе (вы должны это сделать), вам нужно ссылаться на класс по этому полностью классифицированному имени (package+ClassName), например, так:
java -cp "./lib/*;." my.package.NameOfJavaClassWithMain
В конечном итоге ваш classpath для jdbc не установлен.
Это то, что я делаю (плохая практика)
Извлеките свой JAR-файл. (скажем, вы работаете в домашнем каталоге ~, а имя каталога, в который извлекается jar-файл - odbc), затем установите для вашего classpath значение
export CLASSPATH=~/odbc:
(не забудьте добавить :
после пути;-))
Ох, не мог понять, что вы работаете на машине Windows. Затем установите переменную среды (создайте, если не существует) CLASSPATH в c:\odbcdir
или другой способ заключается в использовании java -cp pathToJAR.jar Main
,
Флажок MySQL Driver не находится на пути к классам. Вы должны исправить это, используя -cp
аргументjava
,