Como faço uma autoatualização de aplicativo Java?

Problema: Eu tenho um aplicativo Java independente (daqui em diante conhecido como "o agente") que é executado como um serviço em servidores internos da empresa. Ele atua como um agente remoto para alguns servidores centrais. À medida que o agente é implantado em mais lugares, gerenciá-los fica mais complicado. Especificamente: o envio de atualizações é doloroso porque é um processo bastante manual, e obter acesso aos logs e outras informações sobre os ambientes em que os agentes estão sendo executados é problemático, dificultando a depuração. Os servidores em discussão são headless e autônoma, o que significa que isso deve ser um processo totalmente automatizado, sem intervenção manual.O Java Web Start não é uma solução viável.

Solução proposta: Faça com que o agente ligue para casa (para os servidores centrais) periodicamente para fornecer o status do agente e verificar se há atualizações.

Estou aberto a outras soluções sugeridas para o problema, mas já tenho um protótipo funcional para a ideia de "status e atualizações automáticas", sobre a qual esta questão está focada.

O que eu criei é na verdade um projeto separado que funciona como um wrapper para o agente. O wrapper chama periodicamente o servidor central via HTTP para verificar se há uma versão atualizada do agente. Ao encontrar uma atualização, ele faz o download da nova versão, desliga o agente em execução e inicia o novo. Se isso parecer uma solução estranha ou indireta, veja algumas outras considerações / restrições que merecem ser observadas:

Quando o wrapper obtém uma nova versão do agente, pode haver novas dependências JAR, o que significa alterações de caminho de classe, o que significa que provavelmente quero gerar um processo Java separado em vez de mexer com ClassLoaders e correr o risco de um vazamento de memória de geração permanente, exigiria intervenção manual - exatamente do que estou tentando me livrar. É por isso que acabei com um processo "wrapper" separado para gerenciar as atualizações do agente no meu protótipo.Alguns servidores em que os agentes são implantados são limitados por recursos, portanto, qualquer solução precisa estar com pouca utilização de CPU e memória. Isso me faz querer uma solução que não envolva criar uma nova JVM e é um golpe contra um processo de empacotamento separado.O agente já está implantado nos servidores Windows e RHEL, portanto, a solução deve ser de plataforma cruzada, embora eu não tenha um problema ao duplicar uma quantidade razoável do processo em scripts batch e bash para fazer as coisas acontecerem.

Questão: Como dito, quero saber como fazer um aplicativo Java de atualização automática. Mais especificamente, existem alguns frameworks / bibliotecas por aí que me ajudariam com isso? Alguém com experiência nesta área pode me dar algumas dicas?

questionAnswers(5)

yourAnswerToTheQuestion