Это * этот * действительно лучший способ запустить второй JVM из Java-кода?
Это продолжение моего собственного предыдущего вопроса, и я немного смущен, чтобы спросить об этом... Но так или иначе: как бы вы начали вторую JVM из автономная Java-программа независимым от системы способом? И не полагаясь, например, на переменную env, такую как JAVA_HOME, поскольку это может указывать на другую JRE, чем та, которая в настоящее время работает. Я придумал следующий код, который действительно работает, но чувствует себя немного неудобно:
public static void startSecondJVM() throws Exception {
String separator = System.getProperty("file.separator");
String classpath = System.getProperty("java.class.path");
String path = System.getProperty("java.home")
+ separator + "bin" + separator + "java";
ProcessBuilder processBuilder =
new ProcessBuilder(path, "-cp",
classpath,
AnotherClassWithMainMethod.class.getName());
Process process = processBuilder.start();
process.waitFor();
}
Кроме того, запущенная JVM может быть запущена с некоторыми другими параметрами (-D, -X...,...), о которых не будет знать вторая JVM.
Ответы
Ответ 1
Мне не ясно, что вы всегда захотите использовать точно такие же параметры, classpath или что-то еще (особенно, например, -X типа вещей, например, почему ребенку нужны такие же настройки кучи, что и его родители) при запуске вторичный процесс.
Я бы предпочел использовать внешнюю конфигурацию некоторого типа для определения этих свойств для детей. Это немного больше работы, но я думаю, что в конечном итоге вам понадобится гибкость.
Чтобы увидеть размер возможных параметров конфигурации, вы можете посмотреть настройки "Запуск конфигурации" в Eclipse. Здесь есть несколько настроек табуляции.
Ответ 2
Я думаю, что ответ "Да". Это, вероятно, так хорошо, как вы можете сделать в Java, используя системный независимый код. Но имейте в виду, что даже это относительно независимо от системы. Например, в некоторых системах:
- Возможно, не была задана переменная JAVA_HOME,
- имя команды, используемое для запуска JVM, может быть разным (например, если это не JVM Sun) или
- параметры командной строки могут быть разными (например, если это не Sun JVM).
Если бы я стремился к максимальной переносимости при запуске (второй) JVM, я бы сделал это с помощью сценариев-оболочек.
Ответ 3
Чтобы найти исполняемый файл java, в котором работает ваш код (т.е. переменная path в вашем примере кода), в apache ant есть полезный метод, который может вам помочь. Вам не нужно создавать свой код с помощью ant - просто используйте его как библиотеку для этого метода.
Это:
org.apache.tools.ant.util.JavaEnvUtils.getJreExecutable( "Java" )
Он заботится о специальных случаях с разными поставщиками JVM, о которых говорили другие. (И, глядя на исходный код для этого, есть более особые случаи, чем я мог себе представить.)
В ant.jar. ant распространяется под лицензией Apache, поэтому, надеюсь, вы сможете использовать его так, как хотите, без хлопот.