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

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:

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

	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) {
}[/code]

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!

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

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

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

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.

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

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

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().[/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?

Obrigada

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

“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?

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!

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:

[code]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;

}[/code]

Obrigada a todos que me ajudaram.