Как я могу запустить второй процесс Java?

Как я могу запустить второй независимый от платформы процесс Java? В идеале это должна быть та же версия Java, которая работает в данный момент. Есть ли полезные системные свойства?


person Horcrux7    schedule 12.12.2010    source источник


Ответы (3)


Это невозможно, в общем.

Рецепт, приведенный в ответе @khachik, не обязательно будет работать для реализации Java, отличной от Sun.

  • Исполняемый файл Java не обязательно называется java и не обязательно находится в подкаталоге bin. Даже с Sun Java в Windows есть два исполняемых файла; java и javaw.

  • Параметры команды для запуска JVM различаются для разных реализаций Java. Таким образом, шаг ProcessBuilder может включать непереносимые аргументы.


Хотя большинство JVM используют основные параметры команды Sun java, между ними есть множество отличий. Например:

  • IBM J9 использует j9 и j9w в качестве имен исполняемых файлов.
  • BEA / Oracle JRockit имеет разные -X и -XX вариантов.
  • Jikes RVM использует rvm в качестве имени исполняемого файла и поддерживает только подмножество из java вариантов Sun.
  • IKVM использует ikvm в качестве имени исполняемого файла.

(Примечание: это всего лишь примеры, которые выделяются при беглом чтении соответствующей онлайн-документации.)

person Stephen C    schedule 12.12.2010
comment
Любые ссылки в поддержку вашего первого утверждения? - person Sanjay T. Sharma; 12.12.2010

Вы можете использовать системное свойство java.home, чтобы найти текущую JVM:

String jvm = new java.io.File(new java.io.File(System.getProperty("java.home"),
                                               "bin"),
                              "java").getAbsolutePath();

а затем запустите его, используя ProcessBuilder (или Runtime.exec).

Обратите внимание, что для JDK java.home указывает на каталог JRE, включенный в JDK.

person khachik    schedule 12.12.2010

Вы пытались использовать библиотеки Apache Commons? Если вы еще не пробовали проект запуска. Некоторое время назад мне это очень пригодилось.

Вот описание проекта с их сайта:

Компонент Launcher предназначен для запуска кросс-платформенных Java-приложений.

Оригинальные классы Java взяты из проекта Tomcat 4.0.

Commons-launcher устраняет необходимость в пакетном сценарии или сценарии оболочки для запуска класса Java. Вот некоторые ситуации, в которых может быть желательным устранение пакетного сценария или сценария оболочки:

  • Вы хотите избежать необходимости определять, где находятся определенные пути приложений, например. домашний каталог вашего приложения и т. д. Динамическое определение этого в пакетных сценариях Windows очень сложно в некоторых версиях Windows или при использовании программных ссылок на платформах Unix.
  • Вы хотите избежать необходимости обрабатывать собственные разделители файлов и путей или проблемы с цитированием собственных путей.
  • Вам необходимо применить определенные системные свойства, например. java.endorsed.dirs при работе с JDK 1.4.
  • Вы хотите разрешить пользователям передавать пользовательские аргументы JVM или системные свойства без необходимости анализировать и изменять порядок аргументов в вашем сценарии. Это может быть сложно и/или запутанно в пакетных сценариях и сценариях оболочки. Вы хотите загружать системные свойства из файла конфигурации, а не жестко кодировать их в пакетных сценариях и сценариях оболочки.
  • Вы хотите предоставить локализованные сообщения об ошибках, что очень сложно сделать в пакетных сценариях и сценариях оболочки.
person Chris Ciesielski    schedule 12.12.2010
comment
Насколько я понимаю, это не помогает запустить процесс Java, другой внешний процесс, исполняемый файл которого я знаю. Но в этом проблема. Я не знаю текущий исполняемый файл. - person Horcrux7; 12.12.2010