Olá pessoal.
Estou criando uma aplicação para update de uma outra aplicação Java que possuo, porém, para que o atualizador funcione preciso fechar a aplicação que quero atualizar, e gostaria de identificar se ela já está aberta nos processos do Windows. Eu descobri que através do jps é possível listar o nome dos processos sendo executados pela Java Machine e os seus PIDS, todavia, não há um padrão para o nome da aplicação aberta, pois pelo que percebi os nomes dados são genéricos, e não necessariamente o nome que o seu .Jar tem. Sabem se existe alguma maneira de fixar um valor estático para o nome da aplicação nos processos da JM?
Utilizo o Netbeans.
se vc colocar o aplicativo de update dentro do aplicativo que vai ser atualizado, nao terá problemas.
outra opção é colocar um nome para a thread main do seu app.
[quote=kdoigor]se vc colocar o aplicativo de update dentro do aplicativo que vai ser atualizado, nao terá problemas.
outra opção é colocar um nome para a thread main do seu app.[/quote]
Sim, mas o aplicativo de atualizar realmente roda dentro da pasta do aplicativo “mãe”, por assim dizer. Mas ele recebe nomes genéricos, isso é o mais estranho. Quando eu o executo através do Netbeans ele pega o nome do projeto na lista de processos do jps, mas quando eu o executo através do Windows não.
Mas não entendi isso de renomear a thread main. Como assim?
Da uma olhada na classe Process.
Todos os processos executados pelo java.exe (ou javaw.exe) têm o mesmo nome (basta olhar o Gerenciador de Tarefas - Windows ou o ps - Linux), e isso é que dificulta as coisas.
Uma forma muito tosca de resolver esse problema, se você não deseja analisar a linha de comando completa do java.exe (ou javaw.exe), é fazer cópias do java.exe (ou javaw.exe) privadas para a sua aplicação, e então renomeá-las, de modo que os executáveis usados para rodar cada aplicação tenham nomes distintos. Obviamente isso dá uma certa dor de cabeça.
O jps ajuda um pouco nesse ponto, porque ele se conecta a cada instância da JVM e consegue determinar alguns dos parâmetros usados para iniciar a aplicação.
[quote=kdoigor]isso vai te ajudar.
http://www.java-samples.com/showtutorial.php?tutorialid=298[/quote]
Ainda assim não funcionou.
Ele continua pegando nomes randomicos, como por exemplo o nome da pasta do usuário a executar a aplicação.
se vc deu um set no nome da thread corrente o nome ta lá. como vc ta buscando a thread ? olha no visualvm ou no jconsole
Eu instancio um objeto Thread dentro do Main e com o método currentThread passo a referencia pro objeto instanciado. Após isso seto um nome diferente para a thread e tento ver nos processos do jsp. Nada. Continuam nomes que não tem nada haver com o projeto.
cara, conecta na jvm e pega o pid da thread e o nome.
http://www.guj.com.br/java/101569-pid-processo
[quote=kdoigor]cara, conecta na jvm e pega o pid da thread e o nome.
http://www.guj.com.br/java/101569-pid-processo
[/quote]
Sim, eu faço isso mesmo, mas não dá pra saber o PID do processo se eu não souber o nome. Esse é o problema. Quero saber o PID através do nome e fechar a aplicação.
Andei dando uma lida em alguns fóruns gringos e realmente acho que não tem jeito. Conectando à JM e tentando ler o processo não adianta, ele não mostra o que eu quero, nem com parâmetros. Vou ter que trabalhar é com Socket mesmo. Ridículo esse negócio do Java. A Oracle deveria arrumar isso.
Valeu pela ajuda, galera.