Как я могу запустить второй независимый от платформы процесс Java? В идеале это должна быть та же версия Java, которая работает в данный момент. Есть ли полезные системные свойства?
Как я могу запустить второй процесс Java?
Ответы (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
в качестве имени исполняемого файла.
(Примечание: это всего лишь примеры, которые выделяются при беглом чтении соответствующей онлайн-документации.)
Вы можете использовать системное свойство 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.
Вы пытались использовать библиотеки Apache Commons? Если вы еще не пробовали проект запуска. Некоторое время назад мне это очень пригодилось.
Вот описание проекта с их сайта:
Компонент Launcher предназначен для запуска кросс-платформенных Java-приложений.
Оригинальные классы Java взяты из проекта Tomcat 4.0.
Commons-launcher устраняет необходимость в пакетном сценарии или сценарии оболочки для запуска класса Java. Вот некоторые ситуации, в которых может быть желательным устранение пакетного сценария или сценария оболочки:
- Вы хотите избежать необходимости определять, где находятся определенные пути приложений, например. домашний каталог вашего приложения и т. д. Динамическое определение этого в пакетных сценариях Windows очень сложно в некоторых версиях Windows или при использовании программных ссылок на платформах Unix.
- Вы хотите избежать необходимости обрабатывать собственные разделители файлов и путей или проблемы с цитированием собственных путей.
- Вам необходимо применить определенные системные свойства, например. java.endorsed.dirs при работе с JDK 1.4.
- Вы хотите разрешить пользователям передавать пользовательские аргументы JVM или системные свойства без необходимости анализировать и изменять порядок аргументов в вашем сценарии. Это может быть сложно и/или запутанно в пакетных сценариях и сценариях оболочки. Вы хотите загружать системные свойства из файла конфигурации, а не жестко кодировать их в пакетных сценариях и сценариях оболочки.
- Вы хотите предоставить локализованные сообщения об ошибках, что очень сложно сделать в пакетных сценариях и сценариях оболочки.