2010-08-02 12 views
15

Come si ottiene la posizione dell'eseguibile della JVM in esecuzione durante il runtime? Vorrei creare un'istanza di un'altra JVM come sottoprocesso utilizzando la classe ProcessBuilder.Determinazione della posizione dell'eseguibile JVM durante il runtime

Sono consapevole che esiste la proprietà di sistema java.home, ma questa non specifica la posizione dell'eseguibile JVM. Capisco che potrei fare qualcosa di simile per ottenere il percorso:

System.getProperties().getProperty("java.home") + File.pathSeparator + "bin" + File.pathSeparator + "java"

Questo codice non è indipendente dalla piattaforma, perché il nome del file eseguibile di Windows è java.exe, non java. Esiste un modo per ottenere il percorso dell'eseguibile JVM che tenga conto delle idiosincrasie della piattaforma?

+0

JAVA_HOME punta al JDK e non al JRE. Quindi non sei fortunato quando l'utente non ha installato il JDK. Inoltre I * do * ha il JDK e non ha la variabile di ambiente. Ancora tutto funziona bene. Anche su Windows è possibile rilasciare '.exe' sul nome del file per i programmi che si desidera eseguire. – Joey

+0

Con la proprietà di sistema 'java.home', non mi riferisco a una variabile di ambiente; piuttosto, intendo la proprietà che esiste in 'System.getProperties()'. Ho verificato che i JRE hanno la proprietà System di 'java.home'. È utile sapere che l'estensione '.exe' è facoltativa in Windows. Grazie. –

+0

Si può fare wath sul primo commento e assumere "bin/java.exe" su Windows e assumere "bin/java" su altre piattaforme. C'è anche "javaw.exe" da considerare a seconda di cosa stai provando a fare. –

risposta

-4

Si sta tentando di eseguire il fork dell'intera JVM.

  1. Questo è estremamente inefficiente, principalmente a causa della pesantezza di un altro processo java. Se il vostro pesantemente a fare questo, allora il programma sta per essere molto lento esistono
  2. Fili per questo motivo

Ma se si davvero necessario, si può provare solo l'esecuzione di java -arguments direttamente, poiché la maggior parte Java Standard installazioni mettono java sul percorso cli.

+0

La domanda non dice nulla sul lancio, quindi dovresti probabilmente dire "se stai usando java.exe per lanciare attenzione ...". La domanda riguarda solo l'esecuzione di java exe. –

+1

Oltre a ciò che ha scritto jowierun, ci * sono * i vantaggi della biforcazione di una JVM: 1. nessun conflitto di caricamento classe tra JVM - questo è importante per le grandi applicazioni 2. quando si esegue un algoritmo costoso, eseguendolo come processo separato è una buona idea; si aggira i limiti di memoria –

1

Sì, c'è un modo per ottenere il percorso dell'eseguibile JVM (se esiste). Includilo nella configurazione dell'applicazione. Ci sono molti modi per farlo: Argomento della riga di comando - java myApp.Main/path/to/Java; Proprietà - java -Dpath.to.java =/percorso/a/java; ecc.

Se si desidera una vera indipendenza dalla piattaforma, allora l'intero schema è difettoso perché l'esistenza di un eseguibile JVM non è garantita. Potrei immaginare una JVM senza bisogno di un eseguibile java.

Se si desidera il 99,99% di indipendenza dalla piattaforma, quindi penso che si abbiano gli strumenti necessari.

+6

Questo non risponde alla mia domanda. Sto chiedendo come determinare la posizione dell'eseguibile JVM * in fase di esecuzione *, non a priori prima dell'avvio della JVM. Si presuppone che io sia in grado di controllare come viene invocata la JVM, e non è questo il caso. –

1

Questo thread è una interessante discussione del problema che coprono diverse piattaforme: Finding current executable's path without /proc/self/exe

Dato che la discussione, dovrebbe essere possibile, se davvero ne avevi bisogno, a scrivere qualche JNI wrapper che #ifdef è la piattaforma corrente e fa la corretta chiamata nativa.

Se si è solo su Linux, "/ proc/self/exe" è un collegamento simbolico all'eseguibile in esecuzione. Questo ha il vantaggio di non fare affidamento su alcuna variabile di ambiente (ad esempio PATH o JAVA_HOME). Ma come ho detto, non è sicuramente indipendente dalla piattaforma.

8

Si può sempre usare os.name per verificare se l'utente sta eseguendo Windows o meno. Funzionerà su OS X, Linux e Windows a

Problemi correlati