Действительно ли *это* лучший способ запустить вторую JVM из кода Java?

StackOverflow https://stackoverflow.com/questions/1229605

  •  22-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

Это:

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top