Atualizar o próprio jar (Gravar por cima)

Pessoal,

Na realidade não tenho dúvidas de programação, queria mais era trocar uma idéia, receber idéias na verdade.

O ambiente

Eu tenho um software desktop cliente (Swing) e um servidor. O cliente deve ser atualizado de tempos em tempos, para isto tenho que ir no computador onde o cliente está sendo usado e gravar o novo jar.

Meu desejo

Fazer o cliente identificar que existe uma atualização no servidor e se auto-atualizar.

O problema

Não tenho dúvidas de programação, fazer o cliente perguntar pro servidor se tem atualização (via socket) é tranquilo, enviar os bytes do novo jar do cliente para o cliente também é tranquilo. Porém após o cliente receber os bytes eu teria que sobrescrever o próprio jar com os novos bytes recebidos via socket. Não tem como fazer isso pois o programa já está aberto.

O que eu pensei em fazer

Pensei em fazer assim: O cliente recebe o array de bytes do novo jar (que é ele mesmo porém atualizado), eu gravo um novo jar do lado dele que seria o “atualizador” e gravo o novo jar do cliente que substituirá o cliente atual. Após esses dois jars gravados eu executo o atualizador que irá fechar o meu cliente atual, deleta-lo e renomear o novo cliente para o nome do antigo, dai o atualizador executa novamente o cliente.

Cabuloso né? uhAHUaHUaHUa

Não sei se fui claro, enfim, eu consigo programar isso na boa, só não sei se é a melhor tática, por favor me ajudem!

Obrigado.

não sei qual é a real aplicação. mais não daria de usar JNLP (Java Web Start)? ele ja abstrai tudo isso.

Mas aí teria que usar mais um software. Queria um tipo de atualizador como o Google Chrome se atualiza por exemplo, sozinho. Apenas informa o usuário que tem uma atualização e precisa ser reiniciado, ou se o usuário fechar a próxima vez que abrir estará atualizado. Manja?

Mas aí teria que usar mais um software. Queria um tipo de atualizador como o Google Chrome se atualiza por exemplo, sozinho. Apenas informa o usuário que tem uma atualização e precisa ser reiniciado, ou se o usuário fechar a próxima vez que abrir estará atualizado. Manja?[/quote]

da uma olhada/pesquisada, isso já vem com a JRE, tu cria um arquivo .jnlp com as dependencias (inclusive o teu jar), dai o usuario vai em um site simples ou direto no caminho do jnlp do servidor na primeira vez, em seguinda se tu quiser ele ja cria um link na área de trabalho, e nas proximas vezes o usuario vai so clicar no atalho e ele ja vai se encarregar de atualizar/baixar o jar automaticamente junto com as dependencias alteradas …

A técnica que você propõe não é tão ruim. Inclusive o navegador que você cita tem um servico no windows dedicado a isso.
Talvez tenha como ficar mais elegante mais pra frente. Você pode, por exemplo, no instalador colocar um jar “starter” em um diretório do sistema onde ficam os programas e ele executar um jar que tem a aplicacão em outro diretório (indicado em um arquivo de configuracão). O atualizador vai baixar a atualizacao, quando terminar vai mudar o caminho do arquivo da aplicacão para o que terminou de baixar, e avisar ao usuário que deve reiniciar para completar a atualizacão. Isso é apenas uma sugestão.