Определение местоположения исполняемого файла JVM во время выполнения - PullRequest
18 голосов
/ 03 августа 2010

Как получить местоположение исполняемого файла работающей в данный момент JVM во время выполнения?Я хотел бы создать экземпляр другой JVM в качестве подпроцесса с использованием класса ProcessBuilder.

Я знаю, что существует системное свойство java.home, но это не указывает местоположение исполняемого файла JVM.Я понимаю, что мог бы сделать что-то подобное, чтобы получить путь:

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

Этот код не зависит от платформы, потому что имя исполняемого файла Windows - java.exe, а не java,Есть ли способ получить путь к исполняемому файлу JVM, который учитывает особенности платформы?

Ответы [ 4 ]

10 голосов
/ 19 июня 2014

Вы всегда можете просто использовать 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";
}
1 голос
/ 03 августа 2010

Да, есть способ получить путь к исполняемому файлу JVM (если он существует).Включите его в конфигурацию приложения.Есть много способов сделать это: Аргумент командной строки - java myApp.Main / path / to / Java;Свойства - java -Dpath.to.java = / path / to / java;и т. д.

Если вы хотите истинную независимость от платформы, тогда вся ваша схема имеет недостатки, поскольку существование исполняемого файла JVM не гарантируется.Я мог бы представить JVM без необходимости в исполняемом Java-файле.

Если вы хотите независимости от платформы на 99,99%, то я думаю, что у вас есть необходимые инструменты.

1 голос
/ 13 мая 2013

В этой теме интересно обсудить проблему, касающуюся нескольких платформ: Поиск пути текущего исполняемого файла без / proc / self / exe

Учитывая это обсуждение, должно быть возможно, если вам это действительно нужно, написать какую-нибудь оболочку JNI, которая # ifdef является текущей платформой и делает правильный собственный вызов.

Если вы работаете только в Linux, '/ proc / self / exe' является символической ссылкой на выполняемый исполняемый файл. Это имеет то преимущество, что не полагается ни на какие переменные окружения (т.е. PATH или JAVA_HOME). Но, как я уже сказал, он определенно не зависит от платформы.

0 голосов
/ 03 августа 2010

Вы пытаетесь раскошелиться на всю JVM.

  1. Это крайне неэффективно, в основном из-за тяжести еще одного Java-процесса. Если вы интенсивно делаете это, то ваша программа будет работать очень медленно
  2. По этой причине существуют темы

Но если вы действительно должны, вы можете попробовать просто выполнить java -arguments напрямую, так как большинство стандартных установок java ставят java на путь cli.

...