Действительно ли *это* лучший способ запустить вторую JVM из кода Java?
-
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, используя независимый от системы код.Но знайте, что даже это всего лишь относительно независимая от системы.Например, в некоторых системах:
- возможно, переменная JAVA_HOME не установлена,
- имя команды, используемой для запуска JVM, может быть другим (например.если это не Sun JVM), или
- параметры командной строки могут быть разными (например.если это не Sun JVM).
Если бы я стремился к максимальной переносимости при запуске (второй) JVM, думаю, я бы сделал это с помощью сценариев-оболочек.
Чтобы найти исполняемый файл Java, под которым в данный момент работает ваш код (т.переменная «path» в примере кода вашего вопроса) в Apache ant есть служебный метод, который может вам помочь.Вам не обязательно создавать свой код с помощью ant — просто используйте его как библиотеку для этого одного метода.
Это:
org.apache.tools.ant.util.JavaEnvUtils.getJreExecutable("java")
Он учитывает особые случаи с разными поставщиками JVM, о которых упоминали другие.(И если посмотреть на исходный код, то особых случаев здесь больше, чем я мог себе представить.)
Это в ant.jar.ant распространяется по лицензии Apache, так что, надеюсь, вы сможете без проблем использовать его по своему усмотрению.