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
bom dia, fim um atualizador com base neste seu exemplo, ele trava e nao faz nada, poderia me dar uma mao?