Как я могу запустить второй процесс Java? - PullRequest
8 голосов
/ 12 декабря 2010

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

Ответы [ 3 ]

10 голосов
/ 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.

6 голосов
/ 12 декабря 2010

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

Рецепт, приведенный в ответе @ 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 в качестве имени исполняемого файла.

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

1 голос
/ 12 декабря 2010

Вы пробовали использовать библиотеки Apache Commons? Если вы еще не попробовали launcher project . Это было довольно полезно для меня некоторое время назад.

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

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

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

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

  • Вы хотите избежать необходимости определять, где находятся определенные пути приложения, например, домашний каталог вашего приложения и т. д. Динамическое определение этого в пакетных сценариях Windows очень сложно в некоторых версиях Windows или при использовании программных ссылок на платформах Unix.
  • Вы хотите избежать необходимости обрабатывать собственные разделители файлов и путей или проблемы с цитированием собственных путей.
  • Вам необходимо применить определенные системные свойства, например, java.endorsed.dirs при работе с JDK 1.4.
  • Вы хотите разрешить пользователям передавать настраиваемые аргументы JVM или системные свойства без необходимости разбирать и переупорядочивать аргументы в вашем скрипте. Это может быть сложно и / или грязно в пакетных и командных сценариях. Вы хотите загрузить системные свойства из файла конфигурации, а не жестко кодировать их в своих пакетных сценариях и сценариях оболочки.
  • Вы хотите предоставить локализованные сообщения об ошибках, которые очень сложно сделать в пакетных и командных сценариях.
...