Como descobrir o nome do processo da sua aplicação Java?

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?

isso vai te ajudar.

http://www.java-samples.com/showtutorial.php?tutorialid=298

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. :confused: 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.