Cómo instalar el controlador JDBC en un proyecto basado en servlet sin enfrentar java.lang.ClassNotFoundexception
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.Driver
con 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:
- Descargue el conector mysql.
- Ponlo en mi carpeta MySQL
C:\Program Files\MySQL\mysql-connector-java-5.1.12\mysql-connector-java-5.1.12-bin.jar
. - Abrió las propiedades del proyecto en Eclipse.
- 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?
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 /lib
carpeta 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
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 war
o 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.
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í .