Выполнить основной метод Java из приложения рабочего стола Java в другой JVM - PullRequest
5 голосов
/ 30 ноября 2010

У меня есть настольное приложение, и когда кто-то нажимает кнопку, я хочу, чтобы оно запустило другую виртуальную машину Java, которая выполняет основной метод класса.Мое настольное приложение уже зависит от фляги, содержащей класс с методом main, который я хочу выполнить.

В настоящее время у меня есть следующий код, однако я надеялся, что это был более элегантный способ сделать это:

Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("java -jar another.jar");

Я знаю, что тоже могу использовать ProcessBuilder.

Нет ли такого способа (извините за псевдокод):

Jvm.execute(Main.class);

Поскольку основной класс, который я хочу вызвать, уже существует в моем пути к классам, просто кажется странным, чтовыполните команду java через Runtime.

Ответы [ 3 ]

2 голосов
/ 01 декабря 2010

Зачем вам нужно выполнять этот основной класс в другой JVM?Это только усложняет ситуацию.

Обычно просто Main.main (args) будет в порядке, однако:

Если вы хотите изолировать эту программу от вашей программы, просто запустите ее под другим загрузчиком классов - смотритеДокументация URLClassLoader.Обратите внимание, что даже сложные серверы приложений Java не создают много процессов (обычно это всего лишь один процесс JVM) и изолируют развернутые WAR и EAR только с помощью загрузчиков классов.Вы можете думать о загрузчике классов как о эквиваленте процесса в JVM.

Если другая программа выполняет некоторые «небезопасные» операции, используйте механизм безопасности Java из java.security и не позволяйте этой программе выполнять эти операции.1008 * Если эта другая программа вызывает System.exit () и это останавливает вашу программу, достаточно использовать механизм безопасности и запретить этой программе вызывать System.exit () - см. System.exit () Javadoc.Тогда вы можете просто перехватить SecurityException и игнорировать его.

1 голос
/ 30 ноября 2010

Очень хороший вопрос.Попробуйте поискать в API управления: http://cupi2.uniandes.edu.co/javadoc/j2se/1.5.0/docs/api/javax/management/package-frame.html

Удачи.

Я не уверен, что этот API существует, но если он есть, он должен быть там.Я лично использовал ProcessBuilder как вы, но указывал явный путь к java, получая системные свойства текущего процесса.

0 голосов
/ 01 декабря 2010

HSQLDB имеет общее решение для вызова основных методов для нескольких различных процессов. Используйте этот класс для вызова любого процесса Источник класса MainInvoker

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