[RESOLVIDO] Abrir outro JAR a partir do meu programa Java e fechar o programa atual

13 respostas
E

Olá, pessoal!

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:
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);

		if (option == JOptionPane.YES_OPTION) {
			updater.update();
			updater.close();

			String command = "java -jar updater.jar temp/meus-pacotes.zip";
			Runtime.getRuntime().exec(command);
			
			System.exit(0);
		}
	}
} catch (MalformedURLException ex) {
} catch (IOException ex) {
}

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.

Olhem essa parte:
String command = "java -jar updater.jar temp/meus-pacotes.zip";
Runtime.getRuntime().exec(command);
System.exit(0);

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?

Obrigada!

13 Respostas

B

Em vez de Runtime.exec dá para usar http://docs.oracle.com/javase/6/docs/api/java/lang/ProcessBuilder.html#start() ?

L

win ou linux? num teria q dar acesso as pastas?

E

É no Windows. E as permissões estão corretas. :frowning:

E

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.

F

Não sei se seria esse o problema, mas tenta executar o runtime em uma thread separada.

E

Olá, felipeaps!

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().

F

Olá, felipeaps!

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().

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

E

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

Felipe, desculpe-me a ignorância, mas como que faço pra minha Thread não ser bloqueante?

Obrigada

F

eliangela:
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

Felipe, desculpe-me a ignorância, mas como que faço pra minha Thread não ser bloqueante?

Obrigada

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

E

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

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 :frowning:

F

“executa tudo depois do exec()”

Depois do exec só tem o System.exit(0) certo?
Como fecha o frame? Ele realmente fecha ou tá sendo minimizado?

E

Olá, Felipe!

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?

Obrigada!

E

Olá, pessoal!

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.

Então eu usei este comando pra chamar o EXE:
Runtime.getRuntime().exec("cmd /c start updater.exe");
E este é o código do meu EXE:
int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     int       nCmdShow){
 
    STARTUPINFO info = {sizeof(info)};
    PROCESS_INFORMATION processInfo;
    info.dwFlags = STARTF_USESHOWWINDOW;
    info.wShowWindow = SW_HIDE;
 
    if (CreateProcessW(NULL, _tcsdup(TEXT("java -jar updater.jar")), NULL, NULL, FALSE, 0, NULL, NULL,
            &info, &processInfo)) {
        CloseHandle(processInfo.hProcess);
        CloseHandle(processInfo.hThread);
    }
    return 0;
 
}

Obrigada a todos que me ajudaram.

Criado 2 de abril de 2012
Ultima resposta 3 de abr. de 2012
Respostas 13
Participantes 4