style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Problema raro con los drivers JDBC.

Hola a todos antes que nada, espero y se den el tiempo de explicarme el porqué de mi problema que es un tanto raro y casi casi creo que es culpa del IDE (qué lástima si es del IDE, porqué no he encontrado uno mejor que IntelliJ).

Primero, para un trabajillo de la escuela tengo que conectar una base de datos y bla bla bla. Típico proyecto de no más de 5 tablas y tal. En fin.

Haciendo el proyecto y ya listo para probar que mis queries (hechos a pie ¬¬, véase SQL) estuvieran bien, pruebo la conexión y me da un ClassNotFoundException, probando el driver para PostgreSQL, revisé y me di cuenta que el StackBuilder de PostgreSQL 9 te da el driver de conexión para PostgreSQL 8.4; por lo que pensé que este era el problema y cómo todo mundo ay voy a la página del jdbc para PostgreSQL y a leer la documentación, y, según la documentación, mi código estaba bien y listo para conectarme con BD, claro primero había que agregar el driver a CLASSPATH o a el directorio con las extensiones de Java (que lo último fue lo que hice).
De vuelta a IntelliJ para compilar el proyecto y ver que funcionara, arranca tomcat, empieza el debugging y nada otra vez una excepción, pero ahora una de tipo NoClassDefFound; y aquí es donde viene lo raro cuando hago algo cómo:

import org.postgresql.Driver

Incluso el mismo IDE me lo sugiere, reviso en IntelliJ para ver las librerías disponibles en el SDK de Java, y si, la librería de PostgreSQL figura ahí (cómo una extensión). Y cómo caso más raro aún hice un pequeño programita para ver si en efecto el Driver era disponible, mi programita lo hice en GEdit (o sea sin ayuda de algún IDE):

class Cosa{
----public static void main(String ... args){
--------try{
------------Class.forName("org.postgresql.Driver");
------------System.out.println("No problem my friend");
--------}catch(Exception e){
------------System.out.println("Si problem my friend \n" + e.getMessage());
--------}
----}
}

Para colmo, lo compilo, lo ejecuto y el resultado es un: "No problem my friend".

Espero y me puedan ayudar.
Desde ya gracias.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Quieres decir que IDEA tiene

Quieres decir que IDEA tiene un Tomcat?

Si es así, lo que debes de hacer es listar tu jar como biblioteca de tu proyecto.

Si lo del tomcat es aparte ( por fuera de IDEA ) lo que tienes que hacer es copiar tu jar en la carpeta WEB-INF/lib de tu webapp.

En cualquiera de los casos, no se trata de IDEA y lo mismo sucederá con otros IDEs.

No es buena idea poner todo en las extensiones de Java, precisamente por eso suceden cosas como el JarHell, porque se usan las extensiones de Java indiscriminadamente.

Gracias Oscar, pero no, o sea

Gracias Oscar, pero no, o sea el tomcat no está incluido en IDEA, lo que hice fue ligarlos para el debugging y testing. Me doy cuenta que al compilar dice algo cómo "USING CLASSPATH=" y por lo que veo son directorios de tomcat, no usa a $CLASSPATH :(.

Y lo raro es que cómo he comentado, puedes verlo desde el IDE y que si lo creo fuera del IDE (cómo el pequeño programita que puse de ejemplo) no me tira esa excepción e incluso puedo hacer la conexión. De hecho sigo en mi sospecha del IDE porqué ya mavenizé el proyecto y naranjas la clase sigue sin estar disponible o encontrada. Y le voy a ese cuento del CLASSPATH, voy a ver si no existe otra configuración para decirle al IDE que use de CLASSPATH algo cómo "CLASSPATH=$CLASSPATH:[lo que el ide quiera o necesite agregar]".

Y pues lo puse en las extensiones porqué yo jamás he tenido ese problema (contando que RARA VEZ utilizo el CLASSPATH; en estos casos en cuando digo "Ivy, Maven; los echo de menos" XD).

En fin si encuentro solución la posteo, gracias de nuevo Oscar.

Como un plugin? Igual, ya

Como un plugin? Igual, ya intentaste listarlo en las bibliotecas del proyecto?

Re: Como un plugin? Igual, ya

Si, ya lo había agregado a las librerías del proyecto y nap, no fue por ahí. Sin embargo te digo todo funciona muy bonito desde cualquier otro programa, tal pareciera que hay una configuración rara en el proyectillo. Ahorita me pongo a ver que ondas.

Imagen de Nopalin

Pues compilar no es lo mismo

Pues compilar no es lo mismo que ejecutar, checa si se estan cargando las mismas dependencias cuando lo ejecutas. Pon en la clase inicial lo siguiente:

System.out.println("CLASSPATH: " + System.getProperty("java.classpath"));

Ojo, no recuerdo el nombre del property que tiene el classpath, así que busca el correcto, pero asi te darás cuenta cuales jars estas cargando.

sobres

Re: Pues compilar no es lo mismo

Eso ya lo había comentado, de una manera un tanto extraña no está usando a $CLASSPATH sino a una variable CLASSPATH creada dentro del mismo entorno de desarrollo (en este caso IDEA), que cuelga de los directorios de $CATALINA_HOME. Pero está bien, ay imprimiremos en el logger que jars está usando (y casi creo que saldrá el de postgres).

Muchas gracias compañero @Nopalin.

SOLUCIÓN CHILERA (proceed at your own risk)

Bueno, pues después de tanto buscar y de cambiar de IDE para ver si no era bronca, el meollo del asunto era que Tomcat, no reconocía la conexión a la BD, dado que Tomcat usa (al menos en tiempo de debugging) su propio CLASSPATH (por seguridad). Lo que hay que hacer para resolver este problema (que les digo Prosigan bajo su propio riesgo, ya que no sé que tan fiable, seguro o estable sea) es agregar el archivo jar de nuestra librería de conexiones jdbc (en mi caso sería el Driver archivo postgresql-9.0-801.jdbc4.jar) a nuestro directorio lib que cuelga de tomcat.

Con esto ya pude realizar las conexiones. Pero, le voy a buscar a ver si esto es correcto y bien hecho o si es una barrabasada (o si ustedes saben pues hagan el favor de responder).

Segun yo basta con que se

Segun yo basta con que se ponga en el lib de la webapp

WEB-INF/lib/aquo.tuJarDriverJdbcvX.y.z.jar

Imagen de neko069

Pues eso que comentas, no es

Pues eso que comentas, no es una barrabasada (???) como tal, yo lo he hecho a veces de esa forma, y me ha funcionado, si mal no recuerdo, cuando inicias el tomcat, éste te carga jars primeramente de su directorio lib, y después carga los jars de la carpeta lib de tu proyecto... a mi alguna vez me llegó a pasar cosas así como la que mencionas, y en algún foro llegué a ver que es válido hacerlo de esa forma, lo que sí es que lo tienes que documentar, por si después hay que montar tu applicación en un tomcat limpio, pues ya sepas que modificaciones tienes que hacer....si hay alguien que esté en desacuerdo que hable ahora o calle para siempre!!!!
....
¬¬U
Ya en serio, si hay alguien que diga que está mal, ps que diga el porqué, sería muy útil...

Imagen de ezamudio

es una opción

Una opción es que pongas el driver JDBC en el lib del contenedor. La otra es que lo pongas en el lib de tu WAR/EAR.

Imagen de neko069

Re: es una opción

Va, siendo así entonces.... pues a lo que sigue no?

Imagen de Nopalin

Ya vez, entonces

Ya vez, entonces efectivamente el jar del postgres no estaba en el classpath, por algo se empieza el debugging.

sobres

Si, pero eso es ya en

Si, pero eso es ya en producción. Parece que en development/debuggin time IDEA no te crea la carpeta lib...además que así nos da la ventaja de usar ese mismo Driver en distintos proyectos sin necesidad de estarlo copiando y copiando a los WEB-INF/lib/; claro esto es cómo cultura general. Y aún creando la carpeta y pegando ahí el driver no me funcionó. Pero si en teoría debería ser así.

Más bien, parece que Tomcat

Más bien, parece que Tomcat no está tomando o tengo mal configurada mi variable $CLASSPATH. Porqué si puedo hacer conexiones desde otros archivos (java se) sin problemas.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">