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.
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
alchemistPJ
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:
packagemodel.util;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importjava.sql.Statement;publicclassConexao{privateConexao(){}staticpublicConnectionabrirConexao()throwsClassNotFoundException,SQLException{Class.forName("org.hsqldb.jdbcDriver");Connectionconn=DriverManager.getConnection("jdbc:hsqldb:file:src/model/database/financeiro","sa","");conn.setAutoCommit(false);System.out.println("Conectado");returnconn;}staticpublicvoidfecharConexao(Connectionconn)throwsClassNotFoundException,SQLException{Statementstmt=conn.createStatement();stmt.execute("SHUTDOWN");conn.close();System.out.println("Desconectou");}staticpublicvoidcommitConexao(Connectionconn)throwsSQLException{conn.commit();}staticpublicvoidrollbackConexao(Connectionconn)throwsSQLException{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
fabiofalciPJ
O teu caso é que ele não achou o jar do hsql mesmo.
Como vc está inicializando a aplicação?
?
A
alchemistPJ
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
fabiofalciPJ
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
alchemistPJ
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:
O diretório da tua aplicação deve ter a seguinte estrutura:
/FluxoCaixa.jar
/model/hsqldb/hsqldb.jar
F
fabiofalciPJ
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
alchemistPJ
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
alchemistPJ
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
fabiofalciPJ
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
alchemistPJ
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
fabiofalciPJ
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.
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
fabiofalciPJ
É 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.