Distribuir Aplicação em Java

12 respostas
E

Creie um .jar de minha aplicação, se eu executar ele o programa é aberto normalmente, mas quando entro nas telas de cadastros ele diz q não encontra o arquivo do banco de dados (.mdb), se eu rodar a aplicaçaõ diretamente no netbeans o sistema funciona perfeitamente…
Estou usando tambem um .jar de terceiros (bematech.jar) que tambem não esta funcionando, quando mando os comandos para a impressora, nada acontece…
Então a dúvida:
Criei o .jar com todos os .class de minha aplicação, onde devo largar os arquivos que o programa necessita (.jar, .dll …)

vou postar meu arquivo Manifest.mf

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.7.1
Created-By: 11.0-b16 (Sun Microsystems Inc.)
Main-Class: Sistema.Principal
Class-Path: Bematech.jar

Aqui a String para o banco.

String dns = "jdbc:odbc:Driver="{Microsoft Access Driver (*.mdb)};DBQ=java.mdb";

Já tentei largar os arquivos no mesmo diretório onde esta o jar que executa minha aplicação e não funcionou…
O que posso fazer? o que está errado???

Obrigado.

12 Respostas

romarcio

Não sei se seria isso, mas tente o seguinte:

Vá no painel de controles, Ferramentas Administrativas e depois em Fontes de dados (ODBC) e lá vai ter uma opção para adicionar o banco *.mdb

E

Opa Romarcio… tudo bem???

Valeu pelo retorno, mas o problema não é este, pois essa conexão não nessecita de odbc para funcionoar…

O problema todo é onde devo largar meu arquivo .mdb para funcionar?

andresmafra

Evandro Sangiovo:
Opa Romarcio… tudo bem???

Valeu pelo retorno, mas o problema não é este, pois essa conexão não nessecita de odbc para funcionoar…

O problema todo é onde devo largar meu arquivo .mdb para funcionar?

Evandro, como está a Url do bd na sua aplicação?

E

Opa.. vou postar a classe Banco

package Sistema;
import java.sql.*;

/**
 * @author Evandro B. Sangiovo
 * @version 1.0
 */
public class Banco
{
        String dsn = "jdbc:odbc:Driver=" +
                     "{Microsoft Access Driver " +
                     "(*.mdb)};DBQ=java.mdb";
    /**
    * Este método é responsável pela abertura da conexão com o banco de dados.
     * @return Retorna um Objeto Connection com a conexão aberta.
    */
    private Connection AbreConexao() throws Exception
    {
        try
        {
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
            Connection con = DriverManager.getConnection(dsn);
            return con;
        }
        catch(Exception ex)
        {
            throw ex;
        }
    }

    /**
     * Este método é responsável pelo fechamento da conexão com o banco de dados.
     *@param conexao Passe por parâmentro o Objeto Connection para que seja efetuada o fechamento da conexão.
     */
    private void FechaConexao(Connection conexao) throws SQLException
    {
        try 
        {
            if (!conexao.isClosed()) 
                conexao.close();
        }
        catch(SQLException ex)
        {
            throw ex;
        }
    }

    /**
     * Este método é responsavel p/ construir um objeto PreparedStatement.
     * @param sql Passe por parâmetro a string SQL para ser constuído o Objeto PreparedStatement.
     * @return O método retorno um Objeto PreparedStatement.
     */
    public PreparedStatement RetornaStatement(String sql) throws SQLException, Exception
    {
        Connection conexao = AbreConexao();
        try
        {
            PreparedStatement pStatement = conexao.prepareStatement(sql);
            return pStatement;
        }
        catch(SQLException ex)
        {
             throw ex;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    /**
     * Este método é responsavel p/ executar os comandos (Insert, Update, Delete) no banco.
     * Para o comando "Select" use o método "ExecutaSqlQuery".
     * @param pStatement Passe por parâmentro o Objeto PreparedStatement para a execução do comando.
     */
    public void ExecutaSqlUpdate(PreparedStatement pStatement) throws SQLException
    {
        try
        {
            pStatement.executeUpdate();
        }
        catch(SQLException ex)
        {
            throw ex;
        }
        finally
        {
            FechaConexao(pStatement.getConnection());
            pStatement.close();
        }
    }

    /**
     * Este método é responsavel p/ executar comandos que retornam registros do banco (Select).
     * Para outros comandos use o método "ExecutaSqlUpdate".
     * @param pStatement Passe por parâmentro o Objeto PreparedStatement para a execução do comando.
     * @return Este Método retorna um ResultSet com os registros da consulta efetuada.
     */
    public ResultSet ExecutaSqlQuery(PreparedStatement pStatement) throws SQLException
    {
        try
        {
            ResultSet resultSet = pStatement.executeQuery();
            return resultSet;
        }
        catch(SQLException ex)
        {
            throw ex;
        }
        finally
        {
            //FechaConexao(pStatement.getConnection());
            //pStatement.close();
        }
    }
}

Abraços

romarcio
Connection conexao = DriverManager.getConnection("jdbc:odbc:bancoCadastro","","");

Você talvez deva passar além do nome do banco de dados, o user e o password. Caso não tenha em seu banco, passa mesmo assim como no exemplo acima.

Ou tenta assim, passando a URL de onde se encontra o arquivo .mdb:

DriverManager.getConnection("jdbc:odbc:Driver={MicroSoft Access Driver (*.mdb)};DBQ=C:/data/Access/test1.mdb","dba","sql");
E

Romarcio… Se eu colocar o caminho completo de onde esta o banco funciona perfeitamente…

Mas gostaria que o arquivo de banco de dados ficasse juntamente com o .jar…

existe alguma maneira de descobrir onde o java esta buscando o arquivo?

romarcio

Evandro Sangiovo:

existe alguma maneira de descobrir onde o java esta buscando o arquivo?

Agora vc me pegou, não sei dizer.

Para você salvar o arquivo dentro do jar, vai ter que criar uma pasta dentro do projeto, dentro do seu resource(src), mas dai não sei se vai conseguir ler o arquivo de dentro do .jar.

E outra, caso vc consiga, conforme for adicionando dados no banco, seu .jar acabaria aumentando de tamanho, é outro motivo que eu acho que acaba não sendo possivel salvar o banco dentro do jar.

romarcio

Cara, acho que quando vc não utiliza a URL com o caminho, ele procura no mesmo nível que está o arquivo .jar

Então faz um teste, tira a URL do seu código, gera o .jar novo e coloca o banco na pasta DIST, onde é gerado o . jar e ve se funciona.

E

Cara… Não funciono ehueheuehueheuh

fiz o seguinte… veja só:

JOptionPane.showMessageDialog(null, System.getProperty("user.dir"));

pra buscar o caminho, se eu executar diretamente pelo netbeans ele retorna o diretório correto…

se eu executar pelo .jar ele me retorno o caminho “C:\Windows\System32” não sei pq…

to ficando louco já!

Abraços

sergiotaborda

Os arquivos têm que estar no seu classpath.
Quando vc roda o programa fora do netbeans vc tem que defenir esse classpath quando chama a classe main. Normalmente isso se faz com um .bat no windows ou um .sh no linux.

Procura na documentação do executor “java” para saber mais, normalmente o comando é algo assim

java . meupacote.MinhaClassPrincipal

o ponto significa “usa esta pasta como classpath”

romarcio

Evandro Sangiovo:
Cara… Não funciono ehueheuehueheuh

fiz o seguinte… veja só:

JOptionPane.showMessageDialog(null, System.getProperty("user.dir"));

pra buscar o caminho, se eu executar diretamente pelo netbeans ele retorna o diretório correto…

se eu executar pelo .jar ele me retorno o caminho “C:\Windows\System32” não sei pq…

to ficando louco já!

Abraços

Isso pq no C:\Windows\System32 é onde se encontram as dll’s do ODBC, para que a conexão funcione. O netbeans faz essa conexão por trás dos panos, por isso que pela ide funciona.

Acho que vc vai ter que acabar indicando o caminho pela URL mesmo. Ou então, fazer aquela conexão que citei anteriormente, “Ferramentas Administrativas e depois em Fontes de dados (ODBC)…”, pq dai não precisa setar o caminho do banco pela URL.

E

Bom dia pessoal…

Consegui resolver meu problema, achei um método… vou postar, caso alguem mais tenha o mesmo problema.

public String getApplicationPath() {
        String url = getClass().getResource(getClass().getSimpleName() + ".class").getPath();
        File dir = new File(url).getParentFile();
        String path = null;

        if (dir.getPath().contains(".jar"))
            path = findJarParentPath(dir);
        else
            path = dir.getPath();

        try {
            return URLDecoder.decode(path, "UTF-8");
        }
        catch (UnsupportedEncodingException e) {
            return path.replace("%20", " ");
        }
    }

    private String findJarParentPath(File jarFile) {
        while (jarFile.getPath().contains(".jar"))
            jarFile = jarFile.getParentFile();

        return jarFile.getPath().substring(6);
    }

Este método retorna exatamente onde etá sendo executado… aí é só fazer o seguinte:

String dsn = "jdbc:odbc:Driver=" +
                     "{Microsoft Access Driver " +
                     "(*.mdb)};DBQ=" + m.getApplicationPath() + "\java.mdb";

Valeu a ajuda gelera…

Abraços!

Criado 28 de novembro de 2009
Ultima resposta 30 de nov. de 2009
Respostas 12
Participantes 4