Aplicação .jar com hsqldb não funciona!

15 respostas
A

Bom dia pessoal,
Estou precisando muito da ajuda de vcs e o mais rapido possivel.

Tenho um projeto aqui no trabalho onde eu desenvolvi uma aplicação em Swing utilizando HSQLDB, no eclipse a aplicação funciona normalmente, tudo bonitinha… porem quando eu exporto para o .jar é como se o hsqldb n funciona-se… ele n consegue se conectar.

Gostaria de saber como eu faço para que o hsqldb empacotado dentro da minha aplicação funciona-se…

Se alguem poder ajudar eu ficaria muito agradecido.

15 Respostas

F

Qual erro ocorre?

Para empacotar uma dependência (o jar do hsql) junto vc precisa acertar o
Class-Path:
Do MANIFEST.MF

E copiar o jar junto. Por exemplo, eu costumo colocar dentro do diretório da aplicação uma pasta
lib
E dentro dessa pasta lib está todas as dependências do meu projeto. Então o Class-Path fica + ou - assim:
Class-Path: ./lib/spring.jar ./lib/hsql.jar

E por ai vai.

Agora, pode ser um erro do próprio hsql, como é uma aplicação swing, pressumo que seja standalone, certo?
Então na string de connection do banco vc tem que dizer em qual pasta está o teu banco (vc está usando banco em file ou mem?)
Pode ser algo de permissão de arquivo, o hsql tenta criar uma pasta e não pode.

A

Então é isto mesmo estou usando ele em moto standalone utilizando file

Tentei setar o meu classpath assim:

Porem ele não funcionou, está dando o seguinte erro:

um e como seria isto de permissão de arquivo ? Minha classe de Conexão está assim:

package model.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
	
public class Conexao {
		
		 
	private Conexao(){  
	}
	
	static public Connection abrirConexao() throws ClassNotFoundException, SQLException{
		Class.forName("org.hsqldb.jdbcDriver");
		Connection conn = DriverManager.getConnection("jdbc:hsqldb:file:src/model/database/financeiro", "sa", "");
	    conn.setAutoCommit(false);
	    System.out.println("Conectado");
	    return conn;
	}
		
	static public void fecharConexao(Connection conn) throws ClassNotFoundException, SQLException{
			Statement stmt = conn.createStatement();
			stmt.execute("SHUTDOWN");
			conn.close();
			System.out.println("Desconectou");
	}
	    
	static public void commitConexao(Connection conn) throws SQLException{
		conn.commit();
	}
	
	static public void rollbackConexao(Connection conn) throws SQLException{
		conn.rollback();
	}
	
}//fim classe

Precisava muito arrumar isto mas não estou conseguindo achar uma solução :s mais de 2 dias pesquisando e nada ainda :S

F

O teu caso é que ele não achou o jar do hsql mesmo.

Como vc está inicializando a aplicação?

?

A

Isto mesmo Fabio, estou inicializando assim mesmo

O meu hsqldb.jar esta dentro da minha aplicação.

TEm algum solução ou ideia para acertar isto ? :S

F

Tenta rodar assim então

Ou seja, vc estará definindo na própria linha de comando o teu class path e a tua classe Main.
Isto é trabalho do Manifest, dai o ‘java -jar FluxoCaixa.jar’ resolveria… mas já que não está funcionando…

edit: o que vc quer dizer com
"O meu hsqldb.jar esta dentro da minha aplicação. "

Não está dentro do teu jar né? Mas sim num diretório fora?

A

Então ele está empacotado dentro do meu App.jar sim. Pq não poderia ser assim ? eu teria que deixar ele fora do app.jar ?

Rodei deste jeito que vc falou e ele conectou, porem ele n consegue acessar a tabela que existe dentro do jar, ele diz que ela n existe mais ela está la:

ERRO

F

Sim, fora do jar. A não ser que use algo como http://fjep.sourceforge.net/
mas esse nunca usei.

O diretório da tua aplicação deve ter a seguinte estrutura:
/FluxoCaixa.jar
/model/hsqldb/hsqldb.jar

F

Agora sim! Ele se acertou com o class-path.

O que ele não conseguiu foi achar uma table tua. Verifique a tua string de connection

Ele vai tentar achar o banco no arquivo src/model/database/financeiro

Existe os arquivos desse banco? Fora do jar! Se não me engano se o hsql não achar ele cria um vazio, então tu teria
que ter uma rotina para criá-lo nesse casos, não?

Ou vc empacota o banco junto, dai a estrutura da tua aplicação ficaria algo assim:
/FluxoCaixa.jar
/model/hsqldb/hsqldb.jar
/src/model/database/financeiro

A

Hum o que seria este Fat Jar não entendi, poderia falar alguma coisa dele ?

Hum e o que aconteceria com os meus arquivos.proporties e .script que o hsqldb cria ? Tb deveria ficar fora ?

A

Puts calma ai que eu me perdi no que vc falou,

A minha estrutura ta assim:

FluxoCaixa.jar dentro do jar existe estes diretorios

/model/hsqldb/hsqldb.jar
/src/model/database

na pasta database esta o financeiro.scrip e financeiro.proporties

estes dois arquivos tem as tabelas que foram criadas e tal.

Qual é o jeito certo de montar ?

Eu n posso colocar dentro do jar da minha aplicação o hsql e o banco que ele cria ?

F

Deves colocar fora do jar, tanto o jar do hsql como do banco.

Pensa assim, como o hsql vai editar os arquivos do banco se eles estão dentro do jar?

O Fatjar é para colocar todas as dependencias dentro do jar, mas nunca usei,
não posso opiniar sobre ele.

A

Opa entendi já, vou dar uma olhada neste Fat Jar aqui, só mais uma pergunta será que utilizando este Fat Jar eu poderia colocar os arquivos do meu banco dentro dele ? ou ele teria só a funcinalidade que o meu Manifest editado com o classpath ?

F

Não pode colocar o banco dentro do jar, o Fatjar só vai resolver as dependencias para outros jars.
O banco não tem jeito, tem que colocar fora.

A

hum blz, fiz o que vc disse mesmo…

criei um manifest

Manifest-Version: 1.0
Main-Class: controller.ControllerMain
Class-Path: ./lib/hsqldb.jar

que chama o hsqldb do diretorio lib fora da minha app.jar
Vou deixar assim mesmo já que não há como fazer de outro modo !!

Muito Obrigado Fabio por ter me ajudado tando ^^

F

É isso ai cara! Tranquilo!

Essa digamos é a forma ‘padrão’ de se usar. Qualquer outra, usando o FatJar ou OneJar são ‘curvas’ que o pessoal
fez para tentar distribuir um único jar.

Criado 15 de julho de 2009
Ultima resposta 15 de jul. de 2009
Respostas 15
Participantes 2