Как перезапустить программу Java изнутри Java? - PullRequest
3 голосов
/ 10 января 2011

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

То, что я думал, было бы самым простым - просто остановить приложение и запустить новый виртуальный компьютер. Тем не менее, кажется удивительно трудным остановить приложение и запустить одно и то же приложение при закрытии текущего. У кого-нибудь есть опыт в этом деле?

РЕДАКТИРОВАТЬ: мы продолжаем использовать Runtime.exec для повторного вызова того же приложения, но exec () хочет заблокировать, поэтому нам нужно перепрыгнуть через обручи, чтобы заставить его работать на любой платформе (Windows, Mac, Linux). Я бы предпочел независимый от платформы способ сделать это.

Ответы [ 4 ]

2 голосов
/ 10 января 2011

Если вы можете изменить код, возможно, вы можете выйти из программы и использовать класс Runtime (java.lang.Runtime), чтобы снова запустить ту же программу (с теми же аргументами?), Используя метод exec().

http://download.oracle.com/javase/6/docs/api/java/lang/Runtime.html

Редактировать: То есть сначала вы запускаете новый процесс, а , а затем выходите из программы.Другой путь, конечно, будет гораздо сложнее или невозможнее (?).:)

1 голос
/ 10 января 2011

Если вы действительно хотите остановить JVM и перезапустить его, вам придется написать скрипт-оболочку (скрипт оболочки или пакетный файл, в зависимости от вашей ОС), который это делает. Вы можете использовать специальный код возврата из System.exit(), чтобы указать, что приложение должно быть перезапущено.

И это, наверное, лучший способ сделать это. Вы могли бы сыграть несколько трюков с загрузчиком классов, в которых вы можете создать собственный загрузчик классов, чтобы загрузить классы приложения. Однако есть много способов, как это может пойти не так: например, код приложения может вызвать System.exit() в каком-то скрытом месте, или он может содержать код, который сохраняет внутренние ссылки в классах, загруженных загрузчиком классов начальной загрузки.

0 голосов
/ 10 января 2011

Вы можете использовать Runtime или ProcessBuilder , чтобы перезапустить приложение, но вам, вероятно, придется немного изменить приложение, так как я уверен, что у вас нет способаполучить полный путь к исполняемому файлу Java из JVM.

Я предлагаю вам внедрить модуль запуска (как исполняемый файл или скрипт) и использовать код возврата Java, чтобы узнать, нужно ли вам выйти или нужно ливыход или перезапуск.

0 голосов
/ 10 января 2011

Статические члены связаны с загрузчиком классов: имя класса.Вы можете создать свой собственный загрузчик классов и создать экземпляр своего приложения через него.Затем, когда вы хотите перезагрузить компьютер, выбросьте загрузчик классов и создайте новый.Вот как движки приложений, такие как JBoss, могут загружать приложения на лету.

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