Определение местоположения исполняемого файла 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.