Как я могу перезапустить приложение Java AWT? У меня есть кнопка, к которой я прикрепил обработчик событий. Какой код использовать для перезапуска приложения?
Я хочу делать то же самое, что Application.Restart()
и в приложении C #.
java
restart
application-restart
Азфар Ниаз
источник
источник
Ответы:
Конечно, можно перезапустить приложение Java.
Следующий метод показывает способ перезапуска приложения Java:
В основном он делает следующее:
MyClassInTheJar
класс для поиска самого местоположения банки)источник
System.exit(0)
завершает ли дочерний процесс, совпадает с тем, действительно ли этот ответ работает и почему. Если вы не можете дать разумное объяснение вместе со своим ответом, вы сделали плохую работу. Ответ, который дает больше вопросов, чем ответов, не является примером исчерпывающего ответа. Хорошие ответы не только показывают код, но и объясняют, как и почему они работают, какие недостатки есть и каковы альтернативы. Вы даже не пытались прикрыть эти вещи.Посвящается всем, кто говорит, что это невозможно.
Эта программа собирает всю доступную информацию для восстановления исходной командной строки. Затем он запускает ее, и, поскольку это та же самая команда, ваше приложение запускается во второй раз. Затем мы выходим из исходной программы, дочерняя программа продолжает работать (даже в Linux) и делает то же самое.
ПРЕДУПРЕЖДЕНИЕ : если вы запустите это, имейте в виду, что он никогда не завершит создание новых процессов, как форк-бомба .
источник
ManagementFactory.getRuntimeMXBean().getInputArguments()
предоставит вам только входные аргументы, переданные JVM. Он пропускает параметры, переданные вашему приложению. например,java -jar start.jar -MISSED_PARAM=true
. На Oracle JVM вы можете получить эти параметры, используяSystem.getProperty("sun.java.command")
.ProcessBuilder
иinheritIO()
, дочерняя виртуальная машина может быть запущена таким же образом, как и родительская виртуальная машина.В принципе, нельзя. По крайней мере, не надежным способом. Однако в этом нет необходимости.
Не может часть
Чтобы перезапустить программу Java, вам необходимо перезапустить JVM. Чтобы перезапустить JVM, вам необходимо
Найдите используемую
java
пусковую установку. Вы можете попробовать,System.getProperty("java.home")
но нет гарантии, что он действительно будет указывать на средство запуска, которое использовалось для запуска вашего приложения. (Возвращаемое значение может не указывать на JRE, используемую для запуска приложения, или оно могло быть переопределено-Djava.home
.)Вы бы предположительно хотите выполнить первоначальную память настроек и т.д. (
-Xmx
,-Xms
, ...) , так что вы должны выяснить , какие параметры которой используется для запуска первой виртуальной машины Java. Вы можете попробовать использовать,ManagementFactory.getRuntimeMXBean().getInputArguments()
но нет гарантии, что это будет отражать используемые настройки. Это даже прописано в документации этого метода:Если ваша программа считывает ввод с
Standard.in
исходного stdin, он будет потерян при перезапуске.Многие из этих уловок и уловок не работают при наличии файла
SecurityManager
.Не следует необходимость участвовать
Я рекомендую вам спроектировать свое приложение так, чтобы было легко очистить все, а после этого создать новый экземпляр вашего «основного» класса.
Многие приложения предназначены только для создания экземпляра в основном методе:
Используя этот шаблон, должно быть достаточно легко сделать что-то вроде:
и пусть
launch()
вернет true тогда и только тогда, когда приложение было закрыто таким образом, что его нужно перезапустить.источник
java
! Вы забываете, что Java - это спецификация языка, а не программа. Что, если я запустил вашу программу с помощью другого jvm, например, kaffe ? Все равно обновил мой ответ :-)Строго говоря, Java-программа не может перезапустить себя, поскольку для этого она должна убить JVM, в которой она запущена, а затем запустить ее снова, но как только JVM больше не работает (убита), никаких действий предпринимать нельзя.
Вы можете проделать некоторые трюки с пользовательскими загрузчиками классов для загрузки, упаковки и повторного запуска компонентов AWT, но это, вероятно, вызовет много головной боли в отношении цикла событий графического интерфейса пользователя.
В зависимости от того, как запускается приложение, вы можете запустить JVM в сценарии-оболочке, который содержит цикл do / while, который продолжается, пока JVM выходит с определенным кодом, тогда приложение AWT должно будет вызвать
System.exit(RESTART_CODE)
. Например, в псевдокоде скрипта:Приложение AWT должно выйти из JVM с чем-то другим, кроме RESTART_CODE, при "нормальном" завершении, которое не требует перезапуска.
источник
JavaApplicationStub
... Не уверен, есть ли простой способ обойти это.Eclipse обычно перезагружается после установки плагина. Они делают это с помощью оболочки eclipse.exe (приложение запуска) для Windows. Это приложение запускает базовую jar-среду eclipse runner, и если java-приложение eclipse завершается с кодом перезапуска, eclipse.exe перезапускает рабочую среду. Вы можете создать аналогичный фрагмент собственного кода, сценарий оболочки или другую оболочку кода Java для перезапуска.
источник
Windows
/ мин для запуска скрипта в свернутом окне
^ & выйти, чтобы закрыть окно cmd после завершения
образец сценария cmd может быть
спать 10 спать 10 секунд
источник
Если вам действительно нужно перезапустить приложение, вы можете написать отдельное приложение для его запуска ...
На этой странице представлено множество различных примеров для разных сценариев:
http://www.rgagnon.com/javadetails/java-0014.html
источник
Хотя этот вопрос старый и на него дан ответ, я наткнулся на проблему с некоторыми решениями и решил добавить свое предложение в смесь.
Проблема с некоторыми решениями заключается в том, что они создают единую командную строку. Это создает проблемы, когда некоторые параметры содержат пробелы, особенно java.home .
Например, в окнах строка
Может вернуть что-то вроде этого:
C:\Program Files\Java\jre7\bin\java
Эта строка должна быть заключена в кавычки или экранирована из-за пробела в
Program Files
. Не большая проблема, но несколько раздражающая и подверженная ошибкам, особенно в кроссплатформенных приложениях.Поэтому мое решение строит команду как массив команд:
источник
Я сам исследовал эту тему, когда наткнулся на этот вопрос.
Несмотря на то, что ответ уже принят, я все же хотел бы предложить альтернативный подход для полноты картины. В частности, очень гибким решением послужил Apache Ant.
По сути, все сводится к файлу сценария Ant с одной задачей выполнения Java (см. Здесь и здесь ), вызываемой из кода Java (см. Здесь ). Этот код Java, который может быть запуском метода , может быть частью приложения, которое необходимо перезапустить. Приложение должно иметь зависимость от библиотеки Apache Ant (jar).
Всякий раз, когда приложение необходимо перезапустить, оно должно вызывать метод launch и выходить из виртуальной машины. Java-задача Ant должна иметь вилку параметров и порождение. установлено значение true.
Вот пример сценария Ant:
Код для метода запуска может выглядеть примерно так:
}
Очень удобно здесь то, что один и тот же скрипт используется как для первоначального запуска приложения, так и для перезапуска.
источник
Просто добавляю информацию, которой нет в других ответах.
Если procfs
/proc/self/cmdline
доступенЕсли вы работаете в среде, которая предоставляет procfs и, следовательно, имеет
/proc
доступную файловую систему (что означает, что это не переносимое решение), вы можете прочитать Java/proc/self/cmdline
, чтобы перезапустить себя, например:В
/proc/self/cmdline
доступных системах это, вероятно, самый элегантный способ «перезапустить» текущий процесс Java из Java. Никакого JNI не требуется, не требуется угадывание путей и прочего. Это также позаботится обо всех параметрах JVM, переданных вjava
двоичный файл. Командная строка будет полностью идентична строке текущего процесса JVM.Многие системы UNIX, включая GNU / Linux (включая Android), в настоящее время имеют procfs. Однако в некоторых системах, таких как FreeBSD, она устарела и постепенно прекращается. Mac OS X является исключением в том смысле, что в ней нет procfs . В Windows также нет procfs . Cygwin имеет procfs но он невидим для Java, потому что он виден только приложениям, использующим библиотеки DLL Cygwin вместо системных вызовов Windows, а Java не знает о Cygwin.
Не забывайте использовать
ProcessBuilder.inheritIO()
По умолчанию
stdin
/stdout
/stderr
(в Java называетсяSystem.in
/System.out
/System.err
) запущенного процесса установлены каналы, которые позволяют текущему запущенному процессу взаимодействовать с вновь запущенным процессом. Если вы хотите перезапустить текущий процесс, скорее всего, это не то, что вам нужно . Вместо этого вы бы хотели, чтобыstdin
/stdout
/stderr
были такими же, как у текущей виртуальной машины. Это называется по наследству . Вы можете сделать это, вызвавinheritIO()
свойProcessBuilder
экземпляр.Ловушка на Windows
Частый случай использования
restart()
функции - перезапуск приложения после обновления. В последний раз, когда я пробовал это в Windows, это было проблематично. При замене.jar
файла приложения новой версией приложение начало вести себя неправильно и выдавать исключения для.jar
файла. Я просто говорю, на случай, если это ваш вариант использования. Тогда я решил проблему, заключив приложение в пакетный файл и используя волшебное возвращаемое значение из того,System.exit()
что я запросил в пакетном файле, и вместо этого командный файл перезапустил приложение.источник
Старый вопрос и все такое. Но это еще один способ, который дает некоторые преимущества.
В Windows вы можете попросить планировщик задач снова запустить ваше приложение. Это дает преимущество в том, что вы ждете определенное время перед перезапуском приложения. Вы можете зайти в диспетчер задач и удалить задачу, и она перестанет повторяться.
источник
Похож на « улучшенный » ответ Йоды , но с дальнейшими улучшениями (как функциональными, так и удобочитаемыми и тестируемыми). Теперь его можно запускать безопасно, и он будет перезапускаться столько раз, сколько указано в программе.
JAVA_TOOL_OPTIONS
вариантов.V1.1 Исправление: нулевой указатель, если JAVA_TOOL_OPTIONS не установлен
Пример:
источник
Я полагаю, вы действительно хотите не останавливать приложение, а «перезапустить» его. Для этого вы можете использовать это и добавить свой «Сброс» перед сном и после невидимого окна.
источник