* Это * действительно лучший способ запустить вторую JVM из кода Java? - PullRequest
37 голосов
/ 05 августа 2009

Это продолжение моего собственного предыдущего вопроса , и я немного стесняюсь спросить это ... Но в любом случае: как бы вы запустили вторую 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 не знала бы.

Ответы [ 3 ]

6 голосов
/ 05 августа 2009

Я думаю, что ответ «Да». Это, вероятно, так же хорошо, как вы можете сделать в Java, используя системно-независимый код. Но имейте в виду, что даже это только относительно системно-независимый. Например, в некоторых системах:

  1. переменная JAVA_HOME, возможно, не была установлена,
  2. имя команды, используемой для запуска JVM, может отличаться (например, если это не Sun JVM), или
  3. параметры командной строки могут отличаться (например, если это не Sun JVM).

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

5 голосов
/ 28 июля 2011

Чтобы найти исполняемый файл java, под которым в данный момент выполняется ваш код (т.е. переменная 'path' в примере кода вашего вопроса), в apache ant есть вспомогательный метод, который может вам помочь. Вам не нужно создавать свой код с помощью ant - просто используйте его как библиотеку для этого одного метода.

Это:

org.apache.tools.ant.util.JavaEnvUtils.getJreExecutable ( "Java")

В нем рассматриваются особые случаи с различными поставщиками JVM, о которых упоминали другие. (И, глядя на исходный код, есть больше особых случаев, чем я мог себе представить.)

Это в ant.jar. Ant распространяется по лицензии Apache, так что, надеюсь, вы сможете использовать его так, как хотите, без хлопот.

5 голосов
/ 05 августа 2009

Мне не ясно, что вы всегда хотели бы использовать точно такие же параметры, classpath или что-то еще (особенно -X-вид материала - например, зачем ребенку такие же настройки кучи, как его родителям) при запуске вторичный процесс.

Я бы предпочел использовать внешнюю конфигурацию, чтобы определить эти свойства для детей. Это немного больше работы, но я думаю, что в конце вам понадобится гибкость.

Чтобы увидеть степень возможных настроек конфигурации, вы можете посмотреть их настройки «Run Configurations» в Eclipse. Там стоит несколько закладок для настройки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...