问题
How does one obtain the location of the executable of the currently running JVM during runtime? I would like to instantiate another JVM as a subprocess using the ProcessBuilder class.
I am aware that there is the java.home
System property, but this doesn't specify the location of the JVM executable. I understand I could do something like this to get the path:
System.getProperties().getProperty("java.home") + File.pathSeparator + "bin" + File.pathSeparator + "java"
This code isn't platform independent, because the Windows executable's name is java.exe
, not java
. Is there a way to get the path of the JVM executable that takes the platform's idiosyncrasies into account?
回答1:
You could always just use os.name to check if the user is running Windows or not. That'll work on OS X, Linux and Windows at
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";
}
回答2:
Yes, there is a way to get the path of the JVM executable (if it exists). Include it in the configuration of the application. There are lots of ways to do that: Command line argument -- java myApp.Main /path/to/Java; Properties -- java -Dpath.to.java=/path/to/java; etc.
If you want true platform independence, then your whole scheme is flawed because the existence of a JVM executable is not guaranteed. I could imagine a JVM with no need for a java executable.
If you want 99.99% platform independence, then I think you have the tools needed.
回答3:
This thread has an interesting discussion of the issue covering several platforms: Finding current executable's path without /proc/self/exe
Given that discussion, it should be possible, if you really needed it, to write some JNI wrapper that #ifdef's the current platform and makes the proper native call.
If you're only on Linux the '/proc/self/exe' is a symbolic link to the actual executable being run. This has the advantage of not relying on any environment variables (i.e. PATH or JAVA_HOME). But as I said, it's definitely not platform independent.
回答4:
You are trying to fork the entire JVM.
- That is extremely inefficient, mainly because of the heaviness of yet another java process. If your heavily doing this, then your program is going to be really slow
- Threads exist for this very reason
But if you really must, you can try just executing java -arguments
directly, since most standard java installations put java on the cli path.
来源:https://stackoverflow.com/questions/3392416/determining-location-of-jvm-executable-during-runtime