Como implementar um software atualizavel

Bom dia meus caros,

Vou começar a dar manutenção agora em um sofware legado. É um software instalado localmente, e que sincroniza dados via internet periodicamente.

A questão é: Minha primeira demanda é fazer com que o software identifique quando houver uma versão nova do mesmo em um repositório online, e faça um auto-update, baixando e substituindo os arquivos que foram alterados.

Alguém poderia me indicar por onde começar… uma ferramenta ou framework que possa me ajudar nessa tarefa. Sempre fui programador WEB, estou um pouco perdido aqui.

Grato,
Diego

JNLP (java web start)?

Não não, é uma aplicação isntalada localmente, implementada com swt, e que sincroniza dados periodicamente com um banco de dados online.

O que eu preciso é uma forma de fazer a aplicação saber quando existe uma versão mais nova, e realizar um auto-update, baixando e substituindo os arquivos alterados.

Não não, é uma aplicação isntalada localmente, implementada com swt, e que sincroniza dados periodicamente com um banco de dados online.

O que eu preciso é uma forma de fazer a aplicação saber quando existe uma versão mais nova, e realizar um auto-update, baixando e substituindo os arquivos alterados.[/quote]

O que é que você quer atualizar, o software ou o banco?

Não não, é uma aplicação isntalada localmente, implementada com swt, e que sincroniza dados periodicamente com um banco de dados online.

O que eu preciso é uma forma de fazer a aplicação saber quando existe uma versão mais nova, e realizar um auto-update, baixando e substituindo os arquivos alterados.[/quote]

O que é que você quer atualizar, o software ou o banco?[/quote]
Ele quer atualizar o software…

Sei. Ele pode também usar uma aplicação separada que de tempos em tempos se comunica com um servidor perguntando se tem atualização. Se tiver ele baixa e substitui os arquivos. A aplicação poderia se conectar a um web service que forneça as atualizações. Bom, eu nunca usei esse JNLP, ele faz isso que eu falei?

Não, JNLP é uma solução na qual se desenvolve a aplicação, cria-se o jar e disponibiliza-a através de um link na internet.
O acesso à mesma é feito através de um navegador e podemos configurar para atualizar (baixar um novo jar) quando houver disponibilidade.

Não não, é uma aplicação isntalada localmente, implementada com swt, e que sincroniza dados periodicamente com um banco de dados online.

O que eu preciso é uma forma de fazer a aplicação saber quando existe uma versão mais nova, e realizar um auto-update, baixando e substituindo os arquivos alterados.[/quote]

O que é que você quer atualizar, o software ou o banco?[/quote]
Ele quer atualizar o software…[/quote]

Exatamente, quero atualizar o software

[quote=drsmachado]Não, JNLP é uma solução na qual se desenvolve a aplicação, cria-se o jar e disponibiliza-a através de um link na internet.
O acesso à mesma é feito através de um navegador e podemos configurar para atualizar (baixar um novo jar) quando houver disponibilidade.[/quote]

Pois é, acredito que nesse caso ja não iria servir. Pois preciso que a própria aplicação identifique que existe uma atualização e faça o update.
A ideia de fazer um outro software que monitore e faça o download é mais ou menos o que eu tinha imaginado, poderia rodar a aplicação silenciosamente quando o usuário clicasse no executavel…

Existe algum framework ou tecnologia que facilite isso? Ou uma forma simples de implementar?

Você está usando SWT puro ou em cima da Plataforma Eclipse? Se estiver usando a Plataforma Eclipse, ela fornece mecanismos de atualização dos plugins nativamente. Basta você mapear o update site e manter ele atualizado.

Estou usando puro. Na verdade usei apenas os componentes visuais do SWT. O que eu quero é poder atualizar os jars da aplicação quando necessário, e o executavel, quando for feita uma nova compilação do software.

[quote=ezaack][quote=drsmachado]Não, JNLP é uma solução na qual se desenvolve a aplicação, cria-se o jar e disponibiliza-a através de um link na internet.
O acesso à mesma é feito através de um navegador e podemos configurar para atualizar (baixar um novo jar) quando houver disponibilidade.[/quote]

Pois é, acredito que nesse caso ja não iria servir. Pois preciso que a própria aplicação identifique que existe uma atualização e faça o update.
A ideia de fazer um outro software que monitore e faça o download é mais ou menos o que eu tinha imaginado, poderia rodar a aplicação silenciosamente quando o usuário clicasse no executavel…

Existe algum framework ou tecnologia que facilite isso? Ou uma forma simples de implementar?[/quote]

Rapaz, depende muito de como tu pretende disponibilizar as atualizações. Mas chutando uma possível solução, tu poderia fazer um programa que verifica a disponibilidade da atualização e caso haja faz o download da mesma via FTP e depois atualiza os arquivos nos locais devidos. Se for o caso tu pode até criar um serviço no windows que verifique essas atualizações.

A primeira coisa a fazer é distribuir teu software em várias partes. Isso fará com que você tenha partes distintas que podem ser atualizadas de forma independente.
A segunda é definir uma estratégia de atualização (lembrando que você deve considerar os riscos e permitir que um “downgrade” seja possível).

Eu fiz isto para uma aplicação Android, ela é fechada e não pode ser disponibilizada no Play. Basicamente, ao iniciar, uma thread busca novas versões num servidor ftp (comparando número de versões). Caso exista, ela faz o download pro aparelho e, quando terminar, notifica o usuário para atualizar. No Android isto é mais simples porque esta parte de “substituir” a antiga versão é feita automaticamente, uma vez que eu mando abrir o aplicativo baixado.

A aplicação que eu fiz é offline, então eu preciso executar estas tarefas de atualizações somente se houver internet disponível. A atualização só deve ser executada se o usuário quiser (ele pode estar fazendo outra coisa e preferir atualizar depois). O “inconveniente” deste caso é que eu preciso suportar um upgrade de qualquer versão para a nova -por exemplo, ele pode estar na versão 1 e subir para a 5, sendo que tudo o que foi feito na 2, 3 e 4 precisa estar disponível - o que é um pouco chato quando se usa um banco de dados local e precisa atualizá-lo.

No caso do Android eu sempre atualizo a aplicação inteira. Não atualizo somente partes, fica bem mais simples. Será que no teu caso não tem como fazer isto também? Com que frequência tu precisa atualizar esta aplicação?

[quote=wagnerfrancisco]Eu fiz isto para uma aplicação Android, ela é fechada e não pode ser disponibilizada no Play. Basicamente, ao iniciar, uma thread busca novas versões num servidor ftp (comparando número de versões). Caso exista, ela faz o download pro aparelho e, quando terminar, notifica o usuário para atualizar. No Android isto é mais simples porque esta parte de “substituir” a antiga versão é feita automaticamente, uma vez que eu mando abrir o aplicativo baixado.

A aplicação que eu fiz é offline, então eu preciso executar estas tarefas de atualizações somente se houver internet disponível. A atualização só deve ser executada se o usuário quiser (ele pode estar fazendo outra coisa e preferir atualizar depois). O “inconveniente” deste caso é que eu preciso suportar um upgrade de qualquer versão para a nova -por exemplo, ele pode estar na versão 1 e subir para a 5, sendo que tudo o que foi feito na 2, 3 e 4 precisa estar disponível - o que é um pouco chato quando se usa um banco de dados local e precisa atualizá-lo.

No caso do Android eu sempre atualizo a aplicação inteira. Não atualizo somente partes, fica bem mais simples. Será que no teu caso não tem como fazer isto também? Com que frequência tu precisa atualizar esta aplicação?

[/quote]
A questão é que atualizações completas em softwares não mobile podem ser um problema. Ainda mais se forem muito grandes.
Modularizar permite que parte da aplicação seja atualizada.
Ele pode disponibilizar o jar funcional e quando a aplicação for iniciada, verificar se há atualização, havendo, ela só faz o download, renomeia o .jar antigo (compras.jar.old) e copia o novo jar para o lugar do antigo. Ao invés de 100MB, apenas 5MB e menos dor de cabeça se for preciso realizar downgrade…

Outro ponto que se deve tomar cuidado é que você precisa definir o que fazer após a atualização. Você tem, basicamente, duas opções:

1- Reiniciar a aplicação (ou solicitar ao usuário que o faça)
2- Carregar as classes do jar atualizado novamente

O Eclipse, por exemplo, utiliza a segunda opção sempre que possível, mas ela dá um trabalho considerável para você implementar do zero.

[quote=drsmachado]
A questão é que atualizações completas em softwares não mobile podem ser um problema. Ainda mais se forem muito grandes.
Modularizar permite que parte da aplicação seja atualizada.
Ele pode disponibilizar o jar funcional e quando a aplicação for iniciada, verificar se há atualização, havendo, ela só faz o download, renomeia o .jar antigo (compras.jar.old) e copia o novo jar para o lugar do antigo. Ao invés de 100MB, apenas 5MB e menos dor de cabeça se for preciso realizar downgrade…[/quote]
Nesse caso creio que usar alguma coisa baseada na arquitetura OSGI irá facilitar a vida dele. Fazer uma aplicação baseada em Eclipse ou Netbeans talvez seja a solução. Agora mesmo facilitando ainda dá um bocado de trabalho. Pricipalmente porque nem sabemos se o software que ele fez foi projetado para ser atualizável.

[quote=drsmachado]A primeira coisa a fazer é distribuir teu software em várias partes. Isso fará com que você tenha partes distintas que podem ser atualizadas de forma independente.
A segunda é definir uma estratégia de atualização (lembrando que você deve considerar os riscos e permitir que um “downgrade” seja possível).[/quote]

Comecei a desenvolver um atualizador que segue mais ou menos esse principio, mas ainda estou bem no inicio. No caso optei com gerar um rash de todos os arquivos do sistema(jar, executaveis, bancos embarcados, etc), e armazar esse rash em um xml que mapeia a localização dos arquivos. Então, quando o usuário iniciar o programa ele starta o atualizador primeiro, semelhante um cliente de MMO por exemplo. Se houver internet ele vai baixar o xml de um ftp, e comprar os rashs. Os que estiverem diferentes ele faz o download do respectivo arquivo, verifica se esta ok(não corrompeu), substitui o antigo e atualiza o xml. Então o atualizador starta o sistema ja atualizado e fecha.

Uma vez iniciado o sistema verificará se existe atualização do atualizador, num processo parecido.

Se alguem tiver dicas para facilitar o desenvolvimento, ou achar que não é uma boa estratégia, por favor, contribua =D

Grato a todos,
Diego

[quote=drsmachado][quote=wagnerfrancisco]Eu fiz isto para uma aplicação Android, ela é fechada e não pode ser disponibilizada no Play. Basicamente, ao iniciar, uma thread busca novas versões num servidor ftp (comparando número de versões). Caso exista, ela faz o download pro aparelho e, quando terminar, notifica o usuário para atualizar. No Android isto é mais simples porque esta parte de “substituir” a antiga versão é feita automaticamente, uma vez que eu mando abrir o aplicativo baixado.

A aplicação que eu fiz é offline, então eu preciso executar estas tarefas de atualizações somente se houver internet disponível. A atualização só deve ser executada se o usuário quiser (ele pode estar fazendo outra coisa e preferir atualizar depois). O “inconveniente” deste caso é que eu preciso suportar um upgrade de qualquer versão para a nova -por exemplo, ele pode estar na versão 1 e subir para a 5, sendo que tudo o que foi feito na 2, 3 e 4 precisa estar disponível - o que é um pouco chato quando se usa um banco de dados local e precisa atualizá-lo.

No caso do Android eu sempre atualizo a aplicação inteira. Não atualizo somente partes, fica bem mais simples. Será que no teu caso não tem como fazer isto também? Com que frequência tu precisa atualizar esta aplicação?

[/quote]
A questão é que atualizações completas em softwares não mobile podem ser um problema. Ainda mais se forem muito grandes.
Modularizar permite que parte da aplicação seja atualizada.
Ele pode disponibilizar o jar funcional e quando a aplicação for iniciada, verificar se há atualização, havendo, ela só faz o download, renomeia o .jar antigo (compras.jar.old) e copia o novo jar para o lugar do antigo. Ao invés de 100MB, apenas 5MB e menos dor de cabeça se for preciso realizar downgrade…[/quote]

Pois é, é preciso verificar o tamanho da aplicação e a frequência de atualização…

O problema é que implementar OSGi corretamente em um sistema legado é muito caro. Seria bacana em um processo de reescrita do software.