Подтвердить что ты не робот

Это * этот * действительно лучший способ запустить второй 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.

4b9b3361

Ответ 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, поэтому, надеюсь, вы сможете использовать его так, как хотите, без хлопот.