Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Problema al crear JAR de una consulta a DB Access

Hola, ¿cómo están? Espero que bien. Verán, hace unos meses empezé con Java y ya tuve que hacer un programita para hacer consultar y modificaciones a una base de datos. El codigo funciona perfecto, pero el problema es que cuando lo comprimo en un JAR para poder usarlo facilmente en otras PC, no se muestra el contenido de las ventanas (JFrame) donde deberían estar los botones y el JTable con la informacion de las tablas de la base de dato Access (.accdb). El menu principal (compuesto unicamente de 2 botones JButton) se ve perfecto y responde bien, pero no lo demas.

¿Tendrán ideas para ayudarme con este problema? Muchas gracias desde ya a cualquier aporte.

febrero 20, 2015 | Registered Commenterarazard

Sin ver el código, creo que comprenderás que solo se puede adivinar.
De todos modos, sospecho que los constructores de esos componentes que "no se ven" no terminan su ejecución, por algún problema o excepción.
En general, no se debe incluir código de acceso a bases de datos, ni otras operaciones por el estilo, dentro de los constructores. Ese puede ser tu problema.

febrero 20, 2015 | Registered Commenterchoces

Mmmm los accesos a la base de datos están en clases aparte, una es un AbstractTableModel para llenar los JTable y la otra incluye codigo para poder modificarla. No sé si te estoy entendiendo correctamente, pido disculpas.

Te dejo los codigos:

//La conexion para modificar la base de datos.
package ErnestoService;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import ErnestoService.Clientes.VentanaClientes;

public class DbConection
{

//Metodo
public void administrarCliente(String sql)
{
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection cn=DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=D:/Java/Proyecto/ErnestoService/Ernesto.accdb","","");
Statement st=cn.createStatement();
st.execute(sql);
cn.close();
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
catch(SQLException e)
{
new VentanaSQL("ERROR: Estado:"+e.getSQLState()+" Codigo de error:"+e.getErrorCode());
}
}
}

//Esta es la heredada de AbstractTableModel
package ErnestoService;

import javax.swing.table.AbstractTableModel;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

public class ModeloTable extends AbstractTableModel
{
Connection cn;
Statement st;
ResultSet rs;
ResultSetMetaData rsmd;

public ModeloTable(String sql)
{
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
cn=DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=D:/Java/Proyecto/ErnestoService/Ernesto.accdb","","");
st=cn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs=st.executeQuery(sql);
rsmd=rs.getMetaData();
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
catch(SQLException e)
{
System.out.println("ERROR: Estado:"+e.getSQLState());
System.out.println("Codigo de error:"+e.getErrorCode());
}
}

public int getColumnCount()
{
int c=0;
try
{
c=rsmd.getColumnCount();
}
catch(SQLException e)
{
e.printStackTrace();
}
return c;
}

public int getRowCount()
{
int r=0;
try
{
rs.last();
r=rs.getRow();
}
catch(SQLException e)
{
e.printStackTrace();
}
return r;
}

public String getColumnName(int columna)
{
String name=null;
try
{
name=rsmd.getColumnName(columna+1);
}
catch(SQLException e)
{
e.printStackTrace();
}
return name;
}

public Object getValueAt(int x, int y)
{
Object ob=null;
try
{
rs.absolute(x+1);
ob=rs.getObject(y+1);
}
catch(SQLException e)
{
e.printStackTrace();
}
return ob;
}

public Class<?> getColumnClass(int c)
{
Class<?> cl=null;
String name;
try
{
name=rsmd.getColumnClassName(c+1);
cl=Class.forName(name);
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
catch(SQLException e)
{
e.printStackTrace();
}
return cl;
}
}

Te dejo un rar de todo el programa para que los pruebes: https://www.dropbox.com/s/8z8asa3yst64es0/ErnestoService%20v1.1.N.rar?dl=0

Solo deberías cambiar las rutas en las clases que copié mas arriba para acceder a DB.

Muchas gracias por la ayuda.

febrero 20, 2015 | Unregistered CommenterArazard

No se trata de cómo o dónde están declaradas, sino de cómo y dónde se usan.
Por ejemplo, he visto el código siguiente en el constructor de VentanaClientes

String sql="SELECT * FROM Clientes";
mt=new ModeloTable(sql);
Clientes=new JTable();
Clientes.setModel(mt);
js=new JScrollPane(Clientes);

Si falla la conexión, por ejemplo, en el constructor de ModeloTable. o si hay un problema con el acceso a la DB

public ModeloTable(String sql)
{
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
cn=DriverManager.getConnection("jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)}; DBQ=D:/Java/Proyecto/ErnestoService/Ernesto.accdb","","");
st=cn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
rs=st.executeQuery(sql);
rsmd=rs.getMetaData();
}
catch(ClassNotFoundException e)
{
e.printStackTrace();
}
catch(SQLException e)
{
System.out.println("ERROR: Estado:"+e.getSQLState());
System.out.println("Codigo de error:"+e.getErrorCode());
}

La VentanaClientes no se crea.
Es a esto a lo que me refería. En estos casos, deberías depurar los constructores, para ver dónde están fallando.
Por otra parte, te recomiendo que evites este tipo de código en los constructores de componentes visuales:
1º creas el componente vacío,
2º le añades, una vez creado, el modelo de datos
3º si no es posible, añade el modelo en el constructor, pero en una tarea paralela

febrero 20, 2015 | Registered Commenterchoces

Perfecto, me voy a poner a arreglarlo. De todos modos me queda la duda de por qué funciona compilando el codigo simplemente pero no cuando lo comprimo en un JAR.

Si me quitas la duda te lo agradeceré mucho :D

febrero 20, 2015 | Unregistered CommenterArazard

"... por qué funciona compilando el codigo simplemente pero no cuando lo comprimo en un JAR."

No entiendo esta cuestión. ¿Quieres decir que te funciona si lo ejecutas dentro de IDE, pero no cuando creas una distribución?. Necesitas ver la salida de consola, para analizar las excepciones que se producen, porque no veo que uses ningún "logger".

febrero 20, 2015 | Registered Commenterchoces

Exacto, compilando desde el IDE (probé con NetBeans y JGrasp) todo se ejecuta perfectamente. Pero no las "ventanas vacías" aparecen cuando comprimo todo en el JAR y lo ejecuto desde allí. Si no es mucha molestia prueba con el programa entero que te pasé. No se produce ni una excepcion.

P.D: Disculpa la ignorancia pero no sé qué es un logger.

febrero 20, 2015 | Unregistered CommenterArazard

Veré si puedo probarlo; pero me suena a que no conecta con la base de datos.

http://docs.oracle.com/javase/8/docs/api/java/util/logging/Logger.html

febrero 20, 2015 | Registered Commenterchoces

Me da la impresión de que ese driver de Microsoft no funciona en sistemas de 64 bits como el mío.

febrero 20, 2015 | Registered Commenterchoces

Es lo que creo yo también, por eso consultaba ya que es la primera vez que hago un JAR. Si se te ocurre algo nuevo comentalo n.n

¡Muchas gracias por el interés en ayudarme y todos tus comentarios!

febrero 20, 2015 | Unregistered CommenterArazard

¿Eso explicaría el hecho de que funcione en el IDE y no en el JAR? Lamentablemente no tengo una pc con windows 32bits para probarlo en este momento.

febrero 20, 2015 | Unregistered CommenterArazard

Tanto mi sistema operativo como el runtime de Java son de 64 bits, y no consigo que conecte ni desde el IDE.

Si desde el IDE funciona, y ejecutando el jar no, lo más probable es que no realice la conexión cuando se ejecuta el jar. Solo se puede determinar mirando los mensajes de la consola, a ver qué excepciones se lanzan.

febrero 20, 2015 | Registered Commenterchoces

Disculpa que no pude seguir respondiendo, tuve que cumplir con mi deber jajaja Siguiendo con el hilo, intenté ejecutar el programa desde CMD y me arroja esto:


java.lang.ClassNotFoundException: sun.jdbc.odbc.JdbcOdbcDriver
at java.net.URLClassLoader$1.run(Unknown Source)
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 ErnestoService.ModeloTable.(ModeloTable.java:23)
at ErnestoService.Clientes.VentanaClientes.(VentanaClientes.java:2
9)
at ErnestoService.gestionBotonCliente.actionPerformed(gestionBotonClient
e.java:19)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Sour
ce)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at ErnestoService.ModeloTable.getColumnCount(ModeloTable.java:45)
at javax.swing.JTable.createDefaultColumnsFromModel(Unknown Source)
at javax.swing.JTable.tableChanged(Unknown Source)
at javax.swing.JTable.setModel(Unknown Source)
at ErnestoService.Clientes.VentanaClientes.(VentanaClientes.java:3
1)
at ErnestoService.gestionBotonCliente.actionPerformed(gestionBotonClient
e.java:19)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Sour
ce)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Sour
ce)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)


La verdad no me explico a que se debe, ya que en el IDE sale todo bien, pero corriendo el MAIN.java fuera del IDE (no el JAR, por lo que supongo que este ya no sería el problema) me sale esto.

¿Alguna idea de como solucionarlo?

febrero 21, 2015 | Unregistered CommenterArazard

sun.jdbc.odbc.JdbcOdbcDriver ya no existe en JavaSE 1.8, lo que podría explicar ese error.
Lo que no entiendo es cómo desde el IDE sí funciona... a menos que en el IDE uses una versión de JavaSE diferente del runtime del sistema.
¿Tienes varias versiones de JavaSE instaladas?

febrero 21, 2015 | Registered Commenterchoces

Me acabo de dar cuenta que tengo instalado el JDK 1.7.0_65 de 32 bits con el JRE 1.8.0_31 y de 64 bits solo tengo el JRE 1.8.0_31. Ahora corrijo esto dejando solo el JDK y JRE de 64 bits (tardo en descargar desde mi casa, tengo 512kbps de conexion jajaja).

Ahora la cuestión es: ¿Con que driver debo configurar mi programa para acceder a la base de datos Access?

febrero 21, 2015 | Unregistered CommenterArazard