Eu tenho um programa em Java funcionando aqui na minha máquina (Vamos chamar de programa A). Criei, então, outro programinha (programa B) responsável por baixar as atualizações da internet e copiar os JARs para a pasta do programa. Mas o problema é que não está funcionando como deveria, porque, quando eu tento substituir os JARs do programa atualizado, dá erro de “Acesso Negado”.
Eu estou tentando fechar o programa atual antes de copiar os arquivos, mas não está fechando.
Esse é meu código:
[code]
try {
Updater updater = new Updater(new URL(“http://www.meusite.com.br/atualizacao/meus-pacotes.zip”));
if (updater.hasUpdate()) {
int option = JOptionPane.showConfirmDialog(this, “Existe uma atualização disponível.\nDeseja atualizar o sistema?”,
“Confirmação”, JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
Esse código está rodando dentro do programa A. A classe Updater é uma classe que eu fiz, que verifica se existe uma atualização, caso exista, ela baixa a atualização.
updater.jar é meu programa B, que descompacta os JARs e tenta substituir os atuais. Mas, infelizmente o System.exit(0) não fecha o programa A porque o Runtime.getRuntime().exec(command); está em execução ainda.
Alguém tem alguma idéia de como que eu posso fazer isso funcionar?
Olá, bezier curve!
Mesmo usando a classe ProcessBuilder, o programa principal não fecha. Ele não executa o System.exit(0) porque o processo está sendo executado pelo programa principal.
Eu quero fazer assim: quero executar o programa de atualização, fechar o programa principal e que o programa de atualização ainda continue aberto.
Acho que não é isso, porque já estou executando isso numa Thread separada.
O código que eu coloquei aí é só o que está dentro do método run().[/quote]
Mas o que quis dizer foi: Será que o runtime não é bloqueante? Fica esperando terminar o outro programa pra depois continuar a execução?
Não sei como ele funciona haha, mas foi só um chute =P
[quote=felipeaps]Mas o que quis dizer foi: Será que o runtime não é bloqueante? Fica esperando terminar o outro programa pra depois continuar a execução?
Não sei como ele funciona haha, mas foi só um chute =P[/quote]
Felipe, desculpe-me a ignorância, mas como que faço pra minha Thread não ser bloqueante?
[quote=eliangela][quote=felipeaps]Mas o que quis dizer foi: Será que o runtime não é bloqueante? Fica esperando terminar o outro programa pra depois continuar a execução?
Não sei como ele funciona haha, mas foi só um chute =P[/quote]
Felipe, desculpe-me a ignorância, mas como que faço pra minha Thread não ser bloqueante?
Obrigada[/quote]
Não a Thread, mas o método “exec” do Runtime. Como vc sabe que o exec ainda está executando (Que foi o que vc disse no primeiro post)?
Eu fiz um teste besta aqui e consegui fechar o primeiro programa normalmente.
Faz o seguinte, logo abaixo do seu Runtime.getRuntime.exec(), coloca um printf e ve se ele aparece no console.
De duas uma, se ele nao aparecer, realmente o exec ta travado, se ele aparecer tem alguma outra coisa errada =P
[quote=felipeaps]Não a Thread, mas o método “exec” do Runtime. Como vc sabe que o exec ainda está executando (Que foi o que vc disse no primeiro post)?
Eu fiz um teste besta aqui e consegui fechar o primeiro programa normalmente.
Faz o seguinte, logo abaixo do seu Runtime.getRuntime.exec(), coloca um printf e ve se ele aparece no console.
De duas uma, se ele nao aparecer, realmente o exec ta travado, se ele aparecer tem alguma outra coisa errada =P[/quote]
Eu sei que o meu programa continua aberto, porque o JFrame fecha, mas no Netbeans mostra o programa em execução.
E o exec() não tá travando porque executa tudo depois do exec().
Eu já fiz isso no Delphi, e foi muito fácil… não sei porque é tão difícil fazer isso aqui no Java
Do jeito que meu código estava aí, o Frame não estava fechando, mas eu mudei esse código para dentro do meu JFrame e o Frame passou a fechar. O problema é que, mesmo com o Frame fechado, não está funcionando.
Vou ver se eu consigo usar o Java Web Start.
Alguém tem alguma idéia de como posso fazer atualização usando essa ferramenta?
Eu resolvi da seguinte maneira: Criei um executável pra chamar o JAR, porque eu percebi que o processo Java.exe não finalizava quando eu chamava um JAR a partir de outro JAR.