Определение местоположения исполняемого файла JVM во время выполнения
Как получить местоположение исполняемого файла текущей запущенной JVM во время выполнения? Я хотел бы создать экземпляр другого JVM в качестве подпроцесса, используя класс ProcessBuilder.
Мне известно, что существует свойство java.home
System, но это не указывает местоположение исполняемого файла JVM. Я понимаю, что мог бы сделать что-то подобное, чтобы получить путь:
System.getProperties().getProperty("java.home") + File.pathSeparator + "bin" + File.pathSeparator + "java"
Этот код не является независимым от платформы, поскольку исполняемое имя Windows java.exe
, а не java
. Есть ли способ получить путь к исполняемому файлу JVM, который учитывает особенности платформы?
Ответы
Ответ 1
Вы всегда можете просто использовать os.name, чтобы проверить, работает ли пользователь под управлением Windows или нет. Это будет работать на OS X, Linux и Windows в
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
Да, есть способ получить путь к исполняемому файлу JVM (если он существует). Включите его в конфигурацию приложения. Есть много способов сделать это: аргумент командной строки - java myApp.Main/path/to/Java; Свойства - java -Dpath.to.java =/path/to/java; и др.
Если вам нужна истинная независимость от платформы, тогда вся ваша схема ошибочна, потому что существование исполняемого файла JVM не гарантируется. Я мог бы представить себе JVM без необходимости использования исполняемого файла Java.
Если вам нужна независимость платформы 99.99%, я думаю, что у вас есть необходимые инструменты.
Ответ 3
В этой теме есть интересное обсуждение проблемы, охватывающей несколько платформ:
Поиск текущего пути исполняемого файла без /proc/self/exe
Учитывая это обсуждение, должно быть возможно, если вам действительно нужно, написать некоторую JNI-оболочку, которая #ifdef для текущей платформы и делает правильный собственный вызов.
Если вы только в Linux, '/proc/self/exe' является символической ссылкой на текущий исполняемый исполняемый файл. Это имеет то преимущество, что не полагается на любые переменные среды (например, PATH или JAVA_HOME). Но, как я уже сказал, он определенно не является независимым от платформы.
Ответ 4
Вы пытаетесь разветкить всю JVM.
- Это крайне неэффективно, главным образом из-за тяжести еще одного Java-процесса. Если вы сильно это сделаете, ваша программа будет очень медленной.
- Темы существуют именно по этой причине
Но если вам действительно нужно, вы можете попробовать просто выполнить java -arguments
напрямую, так как большинство стандартных java-установок помещают java в путь cli.