RESOLVIDO: Ajuda para desenvolver um atualizador para meu sistema Java

Pessoal, deixa comigo, estou quase chegando lá, assim que finalizar posto o código fonte aqui para todos.

Galera, pegando um pouco da dica de cada um aqui cheguei num resultado satisfatório, rodando tudo conforme eu queria, abaixo vou tentar explicar passo a passo do que foi feito para caso alguém pesquisar sobre o tema consiga essa ajuda adicional.

1-Criei uma nova tabela no meu BD chamada update, nesta tabela eu vou informar a nova versão do sistema a ser atualizada e o caminho em que se encontra o “.jar” atualizado:

CREATE TABLE `update` (
	`cod` INT(11) NOT NULL AUTO_INCREMENT,
	`versao` VARCHAR(50) NOT NULL,
	`origem` VARCHAR(9000) NOT NULL,
	`observacao` VARCHAR(9000) NOT NULL,
	PRIMARY KEY (`cod`)
)

2-No meu sistema principal desenvolvi na classe main um método que consulta na tabela update a nova versão e confronta com a versão do .jar em execução, caso seja igual não faz nada, apenas abre o formulário de login, caso a versão .jar em execução seja diferente da versão informada na tabela update fecho o jar em execução e abro um segundo jar chamado “Updater.jar”.

2.1-Método no main do meu sistema principal que faz a verificação da versão:

Variáveis globais

private static String APP_PATCH = System.getProperties().getProperty("user.dir");//Diretório deste .jar
    private static String VERSAO_ATUAL = "4.7";//Versão deste .jar
    private static String NOVA_VERSAO = "";

No main chamo o método carregaVersao().

Método carregaVersao():

//Carrega os dados da versão presente no BD
    public static void carregaVersao() {
        try {
            Connection conn = Conexao.getConnection();
            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery(""
                    + " SELECT versao, origem, observacao "
                    + " FROM `update` "
                    + " ORDER BY cod "
                    + " DESC LIMIT 1");
            while (rs.next()) {
                NOVA_VERSAO = rs.getString("versao");
            }
            st.close();
            rs.close();
            conn.close();

            //Verifica se a versão atual confere com a nova para realizar ou não a atualização
            if (VERSAO_ATUAL.equalsIgnoreCase(NOVA_VERSAO)) {//Mesma versão, 
                new CircleFrameLogin().setVisible(true);//Apenas abre a tela de Login
            } else {//Se as versões forem diferentes
                java.awt.Desktop.getDesktop().open(new File(APP_PATCH + "\\Updater.jar"));//Abre o Updater
                System.exit(0);//Fecha este .jar
                new Control().fecharApp();
            }

        } catch (Exception e) {
            System.err.println("Erro " + e);
        }
    }

Agora vamos pro sistema de atualização, trata-se de um projeto separado, crie um novo projeto para desenvolver este atualizador:

3-No novo projeto crie um JFrame e dentro dele crie algumas variáveis globais e dois métodos:

3.1-Variáveis globais:

private static String APP_PATCH = System.getProperties().getProperty("user.dir");//Diretório deste .jar
private static String NOVA_VERSAO = "";
private static String ORIGEM = "";
private static String OBSERVACAO = "";
SwingWorker worker;

3.2-Agora crie o método carregaVersao()

//Carrega os dados da versão presente no BD
    public void carregaVersao() {
        try {
            Connection conn = Conexao.getConnection();
            Statement st = conn.createStatement();
            ResultSet rs = st.executeQuery(""
                    + " SELECT versao, origem, observacao "
                    + " FROM `update` "
                    + " ORDER BY cod "
                    + " DESC LIMIT 1");
            while (rs.next()) {
                NOVA_VERSAO = rs.getString("versao");
                ORIGEM = rs.getString("origem");
                OBSERVACAO = rs.getString("observacao");
                txtVersao.setText("Nova versão: " + NOVA_VERSAO);
            }
            st.close();
            rs.close();
            conn.close();
        } catch (Exception e) {
            System.out.println("Erro");
        }
    }

3.3-Agora crie o método copyFile(File source, File destination)

//Método que copia e substitui o arquivo jar
    public static void copyFile(File source, File destination) throws IOException {
        if (destination.exists()) {
            destination.delete();
        }
        FileChannel sourceChannel = null;
        FileChannel destinationChannel = null;
        try {
            sourceChannel = new FileInputStream(source).getChannel();
            destinationChannel = new FileOutputStream(destination).getChannel();
            sourceChannel.transferTo(0, sourceChannel.size(), destinationChannel);
        } finally {
            if (sourceChannel != null && sourceChannel.isOpen()) {
                sourceChannel.close();
            }
            if (destinationChannel != null && destinationChannel.isOpen()) {
                destinationChannel.close();
            }
        }
    }

4-Agora no inicializador do formulário você chama os métodos:

public formUpdate() {
        initComponents();
        carregaVersao();

System.out.println("Começou");
        worker = new SwingWorker() {
            @Override
            protected Object doInBackground() throws Exception {
                try {
                    //Thread.sleep(5000);
                    File source = new File(ORIGEM);
                    File destination = new File(APP_PATCH + "\\PCP.jar");
                    copyFile(source, destination);
                } catch (IOException ex) {
                    Logger.getLogger(formUpdate.class.getName()).log(Level.SEVERE, null, ex);
                }
                return null;
            }

            @Override
            public void done() {
                try {
                    System.out.println("Finalizou a atualização");
                    java.awt.Desktop.getDesktop().open(new File(APP_PATCH + "\\PCP.jar"));//Abre o Updater
                    worker.cancel(true);
                    System.exit(0);
                    new Control().fecharApp();
                } catch (IOException ex) {
                    Logger.getLogger(formUpdate.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        };
        worker.execute();
    }

É isso, espero que ajude quem precisar, obrigado @rodriguesabner, @ViniGodoy, @staroski, @javaflex

4 curtidas

bom dia, fim um atualizador com base neste seu exemplo, ele trava e nao faz nada, poderia me dar uma mao?