2010-08-02 14 views
15

Wie erhält man den Speicherort der ausführbaren Datei der aktuell ausgeführten JVM zur Laufzeit? Ich möchte eine andere JVM als Subprozess mit der ProcessBuilder-Klasse instanziieren.Ermitteln des Speicherortes der ausführbaren JVM-Datei zur Laufzeit

Ich bin mir bewusst, dass es die java.home Systemeigenschaft gibt, aber dies gibt nicht den Speicherort der ausführbaren JVM-Datei an. Ich verstehe ich etwas tun könnte den Weg zu bekommen:

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

Dieser Code ist nicht plattformunabhängig, da der Name der ausführbaren Windows-java.exe ist, nicht java. Gibt es eine Möglichkeit, den Pfad der ausführbaren JVM-Datei abzurufen, der die Idiosynkrasien der Plattform berücksichtigt?

+0

JAVA_HOME verweist auf das JDK und nicht die JRE. Sie haben also kein Glück, wenn der Benutzer das JDK nicht installiert hat. Außerdem habe ich das JDK und habe keine Umgebungsvariable. Trotzdem funktioniert alles gut. Unter Windows können Sie auch den Dateinamen ".exe" für Programme, die Sie ausführen möchten, löschen. – Joey

+0

Mit der Eigenschaft 'java.home' System beziehe ich mich nicht auf eine Umgebungsvariable; ich meine vielmehr die Eigenschaft, die in 'System.getProperties()' existiert. Ich habe überprüft, dass JREs die System-Eigenschaft 'java.home' haben. Es ist nützlich zu wissen, dass die Erweiterung ".exe" in Windows optional ist. Vielen Dank. –

+0

Sie können tun, was der erste Kommentar sagt und "bin/java.exe" unter Windows annehmen und "bin/java" auf anderen Plattformen annehmen. Es gibt auch "javaw.exe" zu berücksichtigen, je nachdem, was Sie versuchen zu tun. –

Antwort

-4

Sie versuchen, die gesamte JVM zu verzweigen.

  1. Das ist äußerst ineffizient, vor allem wegen der Schwere eines weiteren Java-Prozesses. Wenn Ihr dies schwer zu tun, dann wird Ihr Programm wird wirklich langsam
  2. Themen aus diesem Grund existieren sein

Aber wenn man wirklich müssen, können Sie versuchen, nur java -arguments direkt ausgeführt wird, da die meisten Standard-Java installationen setzen java auf den cli-pfad.

+0

Die Frage sagt nichts über das Starten, also sollten Sie Sagen Sie wahrscheinlich "wenn Sie java.exe verwenden, um Vorsicht walten zu lassen ...". Die Frage bezieht sich nur auf die laufende java exe. –

+1

Zusätzlich zu dem, was jowierun schrieb, gibt es * Vorteile für das Forking einer JVM: 1. keine Klassenladekonflikte zwischen JVMs - dies ist wichtig für große Anwendungen 2. Wenn Sie einen teuren Algorithmus ausführen, führen Sie ihn als separaten Prozess aus ist eine gute Idee; es geht um die Speicherbeschränkungen –

1

Ja, es gibt eine Möglichkeit, den Pfad der ausführbaren JVM-Datei abzurufen (falls vorhanden). Fügen Sie es in die Konfiguration der Anwendung ein. Es gibt viele Möglichkeiten, dies zu tun: Befehlszeilenargument - Java myApp.Main/Pfad/zu/Java; Eigenschaften - java -Dpath.to.java =/pfad/zu/java; usw.

Wenn Sie eine echte Plattformunabhängigkeit wünschen, ist Ihr gesamtes Schema fehlerhaft, da die Existenz einer ausführbaren JVM-Datei nicht garantiert ist. Ich könnte mir eine JVM ohne Java-Executable vorstellen.

Wenn Sie wollen, 99,99% Plattformunabhängigkeit, dann denke ich, Sie haben die Werkzeuge benötigt.

+6

Dies beantwortet meine Frage nicht. Ich frage, wie man den Ort der JVM-Programmdatei * zur Laufzeit * bestimmt, nicht a priori bevor die JVM gestartet wird. Sie nehmen an, dass ich kontrolliere, wie die JVM aufgerufen wird, und das ist nicht der Fall. –

1

dieser Diskussion gibt es eine interessante Diskussion über die Frage, die mehrere Plattformen: Finding current executable's path without /proc/self/exe

, dass die Diskussion gegeben, sollte es möglich sein, wenn Sie es wirklich nötig, einige JNI-Wrapper zu schreiben, die # ifdef die aktuelle Plattform ist und macht den richtigen nativen Anruf.

Wenn Sie nur unter Linux arbeiten, ist '/ proc/self/exe' eine symbolische Verbindung zur ausführbaren Datei, die ausgeführt wird. Dies hat den Vorteil, dass keine Umgebungsvariablen verwendet werden (d. H. PATH oder JAVA_HOME). Aber wie gesagt, es ist definitiv nicht plattformunabhängig.

8

Sie könnten immer nur os.name verwenden, um zu überprüfen, ob der Benutzer Windows ausführt oder nicht. Das funktioniert unter OS X, Linux und Windows unter

String jvm_location; 
if (System.getProperty("os.name").startsWith("Win")) { 
    jvm_location = System.getProperties().getProperty("java.home") + File.separator + "bin" + File.separator + "java.exe"; 
} else { 
    jvm_location = System.getProperties().getProperty("java.home") + File.separator + "bin" + File.separator + "java"; 
} 
Verwandte Themen