[DÚVIDA] .jar com bd anexo

Olá, fiz um programinha bem simples no netbeans ja com uma conexão com um bd … como eu faço pra colocar o bd no .jar?

por exemplo, quando eu crio o .jar dele, se eu removo o banco de dados da pasta que está, ele nao funciona.

Quero mandar o .jar pra alguem ja com o bd junto

oO tem como ?

Olá tsalsicha!

Confesso que fiquei curioso com a sua dúvida também. Nunca vi a possibilidade de um banco
em um .jar
De qualquer modo se existe a possibilidade posta pra gente ou então esperamos alguém
tirar essa dúvida.

Até mai!

também no aguardo.

nada ? =/

oi,

qual é o banco de dados que está usando? se não sabe olhe a configuração no netbeans e coloque aqui

banco de dados não vai empacotado junto com a aplicação, ele é instalado em um servidor e o cliente só configura ele na aplicação

é impossível colocar um banco de dados relacional em um jar

[]´s

To usando acess … mas desconfiava que nao tinha como.

Então eu tenho que ir até a máquina do cliente, instalar o BD e deixar oculto é isso ?

Oi,

Aproveitando o tópico,gostaria de saber se tem como colocar tudo em um instalador,como no VB,não lembro o termo correto. :roll:
Acho que não,mas não custa perguntar…

Não é necessário deixar oculto. Só deixar em algum lugar que você saiba onde, se for necessário copiar ou fazer alguma coisa do tipo pra dar manutenção na base.

Tem. Você pode fazer um jar com um instalador feito em Java mesmo, e dentro do jar (que seria como um zip) ter uma base ‘zerada’, que você decide onde colocar. Algo como:

-Instalador.jar:
-- Instalador (arquivo java que vai executar o processo de instalação);
-- Banco zerado;
-- Jar da sua aplicação;
-- Outros arquivos de configuração, caso necessários.

Ou você pode usar esses instaladores que existem por aí, tipo o InnoSetup.

Oi Andre Brito ,

Obrigada… :wink:

Se alguem tiver interesse http://xuti.net/2006/07/31/inno-setup-faca-uma-instalacao-profissional-para-seu-programa/

Só uma obs,não entendi como que faz com java(sem um programa)… :roll:

Eu fiz um instalador prum sistema que era chato demais… Tinha que colocar uns jars numas pastas, uns arquivos de configuração deviam ser atualizados e outros deviam ser deletados. Além disso, como era uma versão somente de testes, o banco sempre deveria sofrer o dump.

Então o jar possui algumas coisas:

- Um script que faz o dump (é um arquivo);
- O executor do dump (uma classe java que tem um método que executa o script - por meio da linha de comando);
- Uns jars;
- A classe que colocava os jars nos diretórios corretos;
- A classe que sabia quais arquivos deveria ser alterados;
- A classe principal, que comandava tudo.

Quando executava o jar, tudo era configurado. Quando foi necessário colocar num cliente, foi só excluir a operação do banco e das configurações. O resto fazia tudo e, no final das contas, até subia o servidor. Acho que dá pra dizer que isso é um instalador, que nada mais é que pedir uns paths, algumas configurações e descompactar alguns arquivos nos diretório escolhidos.

aproveitando a pergunta o amigo salscha.

Banco de dados junto ao .jar , acho meio dificil de acontecer … mas quem sabe algum doido ai faz.

Mas gostaria de saber se a fonte de dados ODBC ja poderia ser criada quando a aplicação for iniciada.

Alguma dica?

[quote=makecio]aproveitando a pergunta o amigo salscha.

Banco de dados junto ao .jar , acho meio dificil de acontecer … mas quem sabe algum doido ai faz.

Mas gostaria de saber se a fonte de dados ODBC ja poderia ser criada quando a aplicação for iniciada.

Alguma dica? [/quote]

existem alguns banco de dados que podem ser embutidos na aplicação, mas são mais utilizados para testes e não para sistemas em produção

dois dos mais famosos:

http://hsqldb.org/

http://db.apache.org/derby/

tem um tutorial aqui no guj sobre o primeiro, apesar de estar um pouco desatualizado

Bom dia!

Consegui uma solução para esse problema na semana passada, em uma mini aplicação que fiz para controle pessoal de ponto.
Valeu a pena fazer a aplicação, porquê me ajudou a aprender, pelo menos, a fazer um banco de dados embedded automatizado (sem ter que ficar copiando arquivo de banco de dados para a máquina ou fazer isso manualmente)… que seria o mínimo necessário para rodar um pequeno programa que se “virasse” com isso.
Para programas distribuídos em rede e que acessam uma mesma base de dados, exigem a instalação de um SGBD mais completo e impreterivelmente não dá para utilizar essas soluções. Você precisaria instalar o SGBD em rede, configurá-lo e poderia haver uma aplicação adminitrativa para rodar “scripts” para criar as tabelas e configurar o ambiente local…algo do tipo.
A solução que encontrei para banco de dados embedded foi o SQLite http://www.sqlite.org/ (e há outras opções, como H2 e as citadas nos tópicos acima). Os bancos embedded são bancos em arquivos, assim como o ACCESS (mas muito melhores, é claro :smiley: ).

Para todos os passos abaixo, você deve executá-los na inicialização do programa, de forma que caso haja algum erro, sua aplicação possa informar o usuário logo no início, evitando que o mesmo insira dados no programa a toa…

Antes de iniciar, adicione ao CLASSPATH do programa o jar do driver JDBC do SQLite: http://www.zentus.com/sqlitejdbc/. Ele que fará o trabalho de criar as tabelas e rodará suas consultas

  1. Na inicialização instancio um arquivo .db com uma localização relativa (desse modo, posso usar em diversas máquinas - isso é importante, porquê as pastas de usuário podem ser locais ou em rede, assim como os sistemas operacionais podem variar a pasta).
    Esse arquivo será o meu banco de dados. Ele, inicialmente será um arquivo vazio, sem nada:
    private static final java.io.File DATABASE = new java.io.File(
            System.getProperty("user.home")
            + System.getProperty("file.separator")
            + ".pontoj2se"
            + System.getProperty("file.separator")
            + "ponto.db");

Na minha máquina, ficou esse caminho: C:\Users\diego.queres.pontoj2se\ponto.db
Esse arquivo pode existir ou não (caso seja a primeira execução do programa).

  1. Se o arquivo DATABASE não existir, chamo uma função que irá criar os diretórios pais (.pontoj2se) e que criará as tabelas. Ele irá fazer uma conexão JDBC com o arquivo DATABASE recém criado e os comandos SQL que você enviar irão alterar o arquivo para comportar as tabelas.
    Na inicialização do programa, chamo:
    a) o método checkDatabase() para verificar a existência do bd. Caso não exista:
    b) chamo o método createNewDatabase()
    A seqüência está indicada nos comentários dos métodos abaixo:

    //a) - Rodo na inicialização do programa
    //Se não existir o arquivo de banco de dados, o programa roda o método para criar um arquivo de banco de dados
    public static void checkDatabase() throws Exception {
        if (!DATABASE.exists()) {
            createNewDatabase();
        }
    }

    //Cria conexões com o banco
    public static Connection getConnection() throws Exception {

        Class.forName("org.sqlite.JDBC");
        Connection conn =
                DriverManager.getConnection("jdbc:sqlite:" + DATABASE.getPath());
        return conn;

    }

    /*  b) - Cria um novo banco de dados
         Você deve rodar aqui todos os comandos necessários para fazer a configuração inicial do banco - criação de tabelas, usuários (se o banco comportar esse recurso), inserção de registros iniciais, etc.
    */
    public static void createNewDatabase() throws Exception {
        try {

            DATABASE.getParentFile().mkdirs();      //Cria os diretórios pai do arquivo (caso não existam)
            DATABASE.createNewFile();                  //Cria o arquivo do banco
            if (!DATABASE.exists()) {                      //Caso o arquivo ainda não exista, após os comandos acima, dispara exceção
                throw new Exception("Erro ao gravar o arquivo de banco de dados.");
            }

            Connection conn = getConnection();
            Statement s = conn.createStatement();

            //Execução dos comandos sql para configuração inicial do banco
            s.execute("CREATE TABLE IF NOT EXISTS PONTO ("
                    + "DIA DATETIME PRIMARY KEY, "
                    + "ENTRADA DATETIME, "
                    + "SAIDA_ALMOCO DATETIME, "
                    + "RETORNO_ALMOCO DATETIME, "
                    + "SAIDA DATETIME"
                    + ")");

        } catch (Exception ex) {
            throw new Exception("Erro na criação do banco de dados\n" + ex.getMessage());
        }
    }

Serviço completo. Agora as próximas conexões com o banco, você chama o método getConnection() e o arquivo estará salvo. O bom é que o banco fica salvo no computador, mesmo que o programa seja atualizado ou sofra algum dano.
Estou usando um jar em WEBSTART e ele se autoconfigura (e cria o banco) em qualquer máquina que testei o programa.

Seria interessante criar métodos para backup também… porquê nunca se sabe, mas o arquivo do banco um dia pode ser corrompido… Seguem os métodos que criei:



    //Cria um backup do banco de dados.
    //O parâmetro arquivoBkp é o novo arquivo que receberá os dados de backup.
    public static void backupDatabase(File arquivoBkp) throws Exception {

        //Verificações iniciais
        if (!DATABASE.exists()) {
            throw new Exception("Não foi possível fazer backup porquê o arquivo de dados não foi localizado!");
        }
        if (!arquivoBkp.isDirectory() && !arquivoBkp.getName().toLowerCase().endsWith(".db")) {
            arquivoBkp = new File(arquivoBkp.getPath() + ".db");
        }

        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        
        try {

            bis = new BufferedInputStream(new FileInputStream(DATABASE), BUFFER);
            bos = new BufferedOutputStream(new FileOutputStream(arquivoBkp), BUFFER);

            int byteLido; 
            while ((byteLido = bis.read()) != -1)
            {
                bos.write(byteLido);
            }

        } finally {
            if (bos != null) {
                bos.flush();
                bos.close();
            }
            if (bis != null) {
                bis.close();
            }
        }

    }

    //Recupera o backup e salva por cima do arquivo de banco de dados DATABASE.
    public static void recoverBackupDatabase(File arquivoBkp) throws Exception {

        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;

        try {

            bis = new BufferedInputStream(new FileInputStream(arquivoBkp), BUFFER);
            bos = new BufferedOutputStream(new FileOutputStream(DATABASE), BUFFER);

            int byteLido;
            while ((byteLido = bis.read()) != -1)
            {
                bos.write(byteLido);
            }

        } finally {
            if (bos != null) {
                bos.flush();
                bos.close();
            }
            if (bis != null) {
                bis.close();
            }
        }

    }

O arquivo da classe completa está no anexo.

Também se pode criar o arquivo do bd, estabelendo a conexão com o path (caminho completo) do arquivo do bd (mesmo se ele não existisse) e rodando os scripts de criação de tabelas. No entanto, se as pastas “pai” não existissem, ele não seria capaz de criar o arquivo do bd. Por isso, os passos que estou usando para criar o arquivo do bd são mais garantidos.

Obs: Eu poderia criar um artigo no GUJ com esse passo a passo??

Como devo proceder?

[quote=diego_qmota]Obs: Eu poderia criar um artigo no GUJ com esse passo a passo??

Como devo proceder?[/quote]

Opa,

Sinta-se a vontade para criar o artigo

http://www.guj.com.br/posts/list/40119.java

Ok,

Vou preparar um artigo mais simples para postar. Grato!