2010-08-02 5 views
15

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

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

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

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

+0

JAVA_HOME указывает на JDK, а не на JRE. Таким образом, вам не повезло, когда пользователь не установил JDK. Также I * do * имеет JDK и не имеет переменной окружения. Но все работает отлично. Также в Windows вы можете сбросить '.exe' на имя файла для программ, которые вы хотите запустить. – Joey

+0

По свойству 'java.home' System, я имею в виду не переменную среды; скорее, я имею в виду свойство, которое существует в 'System.getProperties()'. Я проверил, что JRE имеют свойство System 'java.home'. Полезно знать, что расширение '.exe' является необязательным в Windows. Благодарю. –

+0

Вы можете сделать wath первый комментарий говорит и предположить «bin/java.exe» в Windows и предположить «bin/java» на других платформах. Существует также «javaw.exe» для рассмотрения в зависимости от того, что вы пытаетесь сделать. –

ответ

-4

Вы пытаетесь разветвить всю JVM.

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

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

+0

Вопрос не говорит ничего о запуске, поэтому вы должны вероятно, скажите «если вы используете java.exe для запуска beware ...». Вопрос только в том, чтобы запустить java exe. –

+1

В дополнение к тому, что написал jowierun, есть * преимущества для разветвления JVM: 1. Никакие конфликты загрузки классов между JVM - это важно для больших приложений. 2. при запуске дорогостоящего алгоритма, запускающего его как отдельный процесс это хорошая идея; он обходит ограничения памяти –

1

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

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

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

+6

Это не отвечает на мой вопрос. Я спрашиваю, как определить местоположение исполняемого файла JVM * во время выполнения *, а не априори до запуска JVM. Вы предполагаете, что я контролирую, как запускается JVM, и это не так. –

1

В этой теме интересное обсуждение вопроса, охватывающих несколько платформ: Finding current executable's path without /proc/self/exe

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

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

8

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