Bom dia a todos
Este é a minha primeira participação neste forum e desejo, antes de mais nada, poder ser utíl também a todos desta grande comunidade.
Sou iniciante em Java e estou com um problema um pouco dificil de resolver. Estou utilizando o NetBeans 5.5, MySql, e Linux. Para realizar a conexão com o MySql estou utilizando o mysql-connector-java-3.2.0-alpha-bin.jar e por meio do NetBeans eu associei este connector à aplicação, fazendo com que o NetBeans adicionasse este connector ao classPath. Quando executo a aplicação pela IDE funciona tudo correto mas quando eu mando gerar o arquivo jar a aplicação trava na parte onde tenho de ler o driver do mysql. Quando digo trava quer dizer isto mesmo...não dá nenhuma mensagem de erro (apesar de em minhas classes, quando ocorrer algum erro eu estou gerando uma exceção para transmitir esta exceção para um bloco superior que mostraria a mensagem. Vou postar parte do código para ficar mais claro.
package brc.database;
/**
* @author Ubiraci Lage Brandão Júnior ([email removido])
* @version 1.0.0 - 03/08/2007
*/
public final class LoadDriver {
public static boolean MySql() throws Exception {
try {
//Class.forName("com.mysql.jdbc.Driver");
Class.forName("org.gjt.mm.mysql.Driver");
return true;
}
catch(Exception e) {
throw new Exception("Não foi possível carregar o driver do MySql");
}
}
}
Esta classe acima faz parte de um framework que estou escrevendo para automatizar a criação de aplicações. Esta classe acima é quem faz a leitura do driver do mysql.
package brc.database;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* @author Ubiraci Lage Brandão Júnior ([email removido])
* @version 1.0.0 - 03/08/2007
*/
public final class LoadConnection {
public static Connection MySql(String hostIP, String port, String dataBase) throws Exception {
User user = new User(enmDatabase.enmTypeDatabase.MySql);
String strConn = "jdbc:mysql://" + hostIP;
if (port != "") {
strConn += ":" + port + "/";
}
strConn += dataBase;
try {
return DriverManager.getConnection(strConn, user.get_User(), user.get_Password());
}
catch(SQLException sqle) {
throw new Exception("Nao foi possivel conectar à base de dados");
}
}
}
Esta outra classe retorna para mim o objeto connection. A classe user é apenas uma classe que retorna o nome e senha do usuário do banco. Como pode ser visto, as duas classes acima estão com o código protegido por try..catch e caso ocorra algum erro, este erro é propagado acima com uso da instrução throw.
Tenho uma classe que gerencia todos os bancos de dados que minha aplicação irá trabalhar. Abaixo está o constructor da classe:
public DatabaseConnection(confManager configurator) throws Exception {
this.config = configurator;
this.typeDatabase = this.getTypeDatabase(this.config.getprops().getProperty("typeDatabase"));
switch(this.typeDatabase) {
case MySql: {
try {
this.db = new MySql(this.config.getprops().getProperty("hostIP"),
this.config.getprops().getProperty("port"),
this.config.getprops().getProperty("dataBase"));
}
catch(Exception e) {
throw new Exception(e.getMessage());
}
break;
}
case Interbase: {
break;
}
}
}
O objeto config é uma classe que lê um arquivo de configuração (.conf) onde estão as informações do hostIP, port, Database. O objeto db é de um tipo de classe Base que serve como interface para todos os bancos de dados. A classe MySql extende a classe Base. Como dá pra ver no código, a criação da classe MySql também está protegida. Se ocorrer uma exceção, ela é propagada para algum bloco superior. Abaixo eu mostro o constructor da classe MySql:
public MySql(String hostIP, String port, String dataBase) throws Exception {
super(hostIP, port, dataBase);
try {
LoadDriver.MySql(); // Lê o driver do MySql
}
catch(Exception e) {
this.saveLog(e);
throw new Exception(e.getMessage());
}
try {
this.setConn(LoadConnection.MySql(hostIP, port, dataBase));
}
catch(Exception e) {
this.saveLog(e);
throw new Exception(e.getMessage());
}
}
Como pode ser visto, se ocorrer uma exceção ao ler o driver do MySql eu gero uma execeção e caso tenha passado sem erros na leitura do driver eu tento criar o objeto de conexão. Se ocorrer um erro também neste ponto, eu gero novamente um erro. Estas classes estão no framework. Agora abaixo eu vou colocar o constructor de uma classe de um aplicativo que eu estou criando utilizando o framework.
public Global() throws Exception {
applicationPath = this.getApplicationPath();
CONFIGURATOR_FILENAME = System.getProperty("user.home") + "/jtm.conf";
File f = new File(CONFIGURATOR_FILENAME);
if (f.exists()) {
config = new confManager(CONFIGURATOR_FILENAME);
try {
db = new DatabaseConnection(config);
}
catch (Exception ex) {
throw new Exception("O arquivo de configuração não contém dados para realizar a conexão ao banco de dados. Favor verificar!");
}
}
else {
throw new Exception("Não foi possível encontrar o arquivo de configuração (jtm.conf). Favor verificar!");
}
}
Como pode ser visto, o objeto db é criado em um bloco protegido; caso ocorra alguns dos erros gerados no framework, este bloco é que irá receber e tratar a exceção, mostrando uma mensagem ao usuário. A criação desta classe é feita dentro da tela de Splash. Existe um método que é chamado para realizar as inicializações da aplicação. Esta classe (Global) tem um constructor pois eu utilizo um método para ler o diretorio atual do arquivo jar e este método não funciona se for estático. Mas eu chamo o construtor apenas 1 vez e armazeno o retorno do método numa variável estática. Todos os fields desta classe são estáticos. Abaixo eu coloco o método que cria a classe Global:
public void userInitialization() {
try {
Global glb = new Global();
}
catch(Exception ex) {
screen.setVisible(false);
screen.dispose();
msg.Error(ex.getMessage());
System.exit(0);
}
//screen.setProgress("Yo " + i, i); // ProgressBar com mensagem
screen.setProgress(1); // ProgressBar sem mensagem
}
Como pode ser visto, se ocorrer um erro ao criar a classe global a tela splash é escondida (screen.setVisible(false)), depois é retirada da memória (screen.dispose), é mostrada a mensagem de erro e depois sai do programa.
O problema é este: funciona tudo correto quando estou dentro da IDE mas quando executo de fora não funciona...acontece algum erro e a tela splash fica parada no meio do desktop e não consigo nem sequer retirar esta tela. Só fazendo logoff no sistema. Sei que o erro acontece ao ler o driver do MySql pois executei uma vez colocando mensagens (JOptionPane) em cada ponto (antes e depois de passar pelo ponto que estava sendo testado). E vi que o erro ocorreu quando chega na parte de ler o driver do MySql (Class.for....) só que está funcionando se executo pela IDE.
Analisando os arquivos gerados na pasta dist, eu verifiquei que existe o arquivo jar, um arquivo txt gerado automaticamente pelo NetBeans e uma pasta lib onde dentro tem o connector do MySql e o jar do meu framework.
Onde foi que eu errei? Será que alguém pode me dar uma luz sobre este prolema? Sinceramente eu não sei como resolve-lo!!!
Fico no aguardo e desde já agradeço as respostas e a paciencia por terem lido um post tão grande.



