Localizar o java.exe em tempo de execução

Pessoal, eu preciso saber em que pasta está localizado o java.exe que está rodando a minha aplicação em tempo de execução. Eu sei que ele fica no system32, mas, o caso é que eu posso usar outra cópia do executável de outro lugar, por isso eu preciso descobrir em tempo de execução a sua localização. Alguém tem ideia de como fazer isso?

Boa tarde,

Você tem muitas opções para fazer isso, por exemplo, voce setou uma variavel de ambiente certo?
EX: .;%JAVA_HOME%.

Voce poderia acessar diretamente do Path como bin.
Apenas digitando java.exe (via cmd Windows).

Entendeu a lógica?

Sim, mas o caso é que no meu programa java eu quero saber onde está o java.exe e não para executar ele. O problema é o seguinte, eu acabei de realizar a integração do me aplicativo com o sistema de Tef dedicado Scope da Itautec, o Scope usa JNI para acessar dlls que fazem a comunicação com o servidor de Tef, essas dlls usam um arquivo chamado scope.ini para fazer a configuração da comunicação ( IP por exemplo) o caso é que esse scope.ini tem que ficar junto do executável do aplicativo, no caso do java não é o .jar ou o .class, e sim o java.exe que está sendo usado. No meu caso para facilitar a implantação do sistema o usuário faz essas configuração no próprio sistema que escreve esse arquivo antes de inicializar o Tef, por isso é que eu quero saber onde está o java.exe em tempo de execução, para milhas classes java saberem onde escrever esse .ini. Sacou?

o java.exe vai estar sempre onde vc setou seu caminho do Path,
por isso que falei pra usar o patch como o caminho.
=|

Eu sei, mas, não sou eu que instalo o aplicativo, o usuário faz isso da forma que lhe convir, por isso que eu quero esse informação em tempo de execução como quando vc usa o System.getProperty(“java.home”) pra descobrir onde foi instalada a jre, sacou?

Você pode criar um programa que leia essa informação a partir do registro do windows. Existe uma chave dentro de Software chamada /JavaSoft/Java Runtime Environment/1.6/JavaHome, que diz onde a JRE tá instalada. Eu vi essa chave no Windows 7, veja se nos outros Windows essa chave está no mesmo lugar, e de posse dessa informação, você pode fazer um algoritmo em Delphi ou VB que leia essas informações e salve, por exemplo, em um arquivo .ini para ser usado pelo seu programa.

Mesmo assim isso não vai resolver o problema, pois, por mais que eu saiba onde está o java.home eu não tenho como saber, em tempo de execução, se o java.exe executado é o da pasta java.home ou outra cópia. O jeito vai ser mesmo padronizar o comando de execução do aplicativo e presumir que o java.exe será sempre o mesmo.

Infelizmente isso não é possível.
Podemos até detectar onde está a instalação “oficial” do java, através da variável JAVA_HOME ou do registry do Windows.

Mas como você bem observou, pode ser chamado um java.exe de qualquer lugar. Isso é muito fácil de acontecer, principalmente porque o JRE/JDK não precisa de instalação, basta copiar o diretório.

O que eu faria é o seguinte: Crie o arquivo nos diretórios previsíveis (como indicado no decorrer do tópico). Isso deverá cobrir uma grande maioria dos casos, afinal os usuários não são desenvolvedores que ficarão criando cópias do java pela máquina. Para os demais casos (provavelmente serão usuários avançados), tente documentar claramente que ações podem ser tomadas, se possível capturando o erro da DLL e transformando em uma mensagem explicativa. Poderia pensar também em fornecer (para os tais usuários avançados) um configurador stand-alone para gerar os arquivos .ini em qualquer diretório, à escolha do usuário.