Cómo instalar el controlador JDBC en un proyecto basado en servlet sin enfrentar java.lang.ClassNotFoundexception

Resuelto Kiril asked hace 14 años • 13 respuestas

Hay una pregunta MUY similar a la mía, pero en mi caso no tengo ningún archivo jar duplicado en mi ruta de compilación, por lo que la solución no me funciona. He buscado en Google durante un par de horas, pero ninguna de las soluciones que encontré allí resuelve mi problema. Estoy creando un sitio web con conectividad a una base de datos para una tarea. Estoy usando una base de datos MySQL, desarrollando en Eclipse y ejecutándola en Windows.

Sigo saliendo java.lang.ClassNotFoundException: com.mysql.jdbc.Drivercon el siguiente código:

import java.sql.*;
//...
public void someMethodInMyServlet(PrintWriter out)
{
    Connection connection = null;
    PreparedStatement query = null;
    try {

        out.println("Create the driver instance.<br>");
        Class.forName("com.mysql.jdbc.Driver").newInstance();

        out.println("Get the connection.<br>");
        connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "secret");
        query = connection.prepareStatement( "SELECT * FROM customers");

        //...
    } catch (Exception e)
    {
        out.println(e.toString()+"<br>");
    }
}
//...

Cuando ejecuto el código anterior obtengo el siguiente resultado:

Create the driver instance.
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

¡No pasa la Class.forName...línea y no puedo entender por qué! Aquí esta lo que hice:

  1. Descargue el conector mysql.
  2. Ponlo en mi carpeta MySQL C:\Program Files\MySQL\mysql-connector-java-5.1.12\mysql-connector-java-5.1.12-bin.jar.
  3. Abrió las propiedades del proyecto en Eclipse.
  4. Agregue Jar externo a mi ruta de compilación y seleccioné mysql-connector-java-5.1.12-bin.jar.

Cada vez que intento utilizar el servlet aparece el mismo error independientemente de si tengo el jar ahí o no. ¿Podrías ayudarme a resolver esto?

Kiril avatar Mar 01 '10 06:03 Kiril
Aceptado

En cuanto a cada biblioteca de "terceros" en forma de un archivo JAR que será utilizado por la aplicación web, simplemente copie/suelte el archivo JAR físico en el archivo /WEB-INF/lib. Luego estará disponible en la ruta de clase predeterminada de la aplicación web. Además, Eclipse es lo suficientemente inteligente como para notarlo. No hay necesidad de molestarse con buildpath. Sin embargo, asegúrese de eliminar todas las referencias innecesarias que agregó antes; de lo contrario, podrían colisionar.

En caso de que esté utilizando Maven como herramienta de gestión de dependencias, entonces es suficiente básicamente agregar las coordenadas de Maven del archivo JAR del controlador JDBC deseado como nuevo <dependency>en el archivo pom.xml. Eventualmente terminará automáticamente en el archivo /WEB-INF/lib. En el caso del controlador MySQL JDBC puedes encontrar las coordenadas aquí .

Una alternativa es instalarlo en el servidor colocando el archivo JAR físico en la propia /libcarpeta del servidor. Esto es necesario cuando se utiliza la fuente de datos del grupo de conexiones JDBC proporcionada por el servidor, que a su vez necesita el controlador MySQL JDBC. Consulte también los siguientes enlaces.

Ver también:

  • ¿Cómo agregar bibliotecas JAR al proyecto WAR sin enfrentar java.lang.ClassNotFoundException? Classpath vs Build Path vs /WEB-INF/lib
  • ¿Cómo debo conectarme a la base de datos/fuente de datos JDBC en una aplicación basada en servlet?
  • ¿Dónde tengo que colocar el controlador JDBC para el grupo de conexiones de Tomcat?
  • CLASSPATH JDBC no funciona
BalusC avatar Mar 01 '2010 00:03 BalusC

Dado que lo está ejecutando servlet, necesita que el contenedor de servlets pueda acceder al jar . Puede incluir el conector como parte de su aplicación waro colocarlo como parte de la biblioteca extendida del contenedor de servlets y del material de administración de fuentes de datos, si lo tiene. La segunda parte depende totalmente del contenedor que tengas.

DJ. avatar Feb 28 '2010 23:02 DJ.

Los demás tienen razón al hacer que el controlador JAR esté disponible para su contenedor de servlets. Mi comentario pretendía sugerir que verifique desde la línea de comando si el controlador está intacto.

En lugar de un vacío main(), prueba algo como esto, adaptado de la documentación incluida:

public class LoadDriver {
    public static void main(String[] args) throws Exception {
        Class.forName("com.mysql.jdbc.Driver");
    }
}

En mi plataforma, haría esto:

$ ls conector-mysql-java-5.1.12-bin.jar
conector-mysql-java-5.1.12-bin.jar
$ javac LoadDriver.java
$ java -cp mysql-connector-java-5.1.12-bin.jar:. Controlador de carga

En su plataforma, debe utilizarlo ;como separador de ruta, como se explica aquí y aquí .

trashgod avatar Mar 01 '2010 01:03 trashgod