Как перезапустить java windows

Обновлено: 05.07.2024

Как я могу перезапустить приложение Java AWT? У меня есть кнопка, к которой я прикрепил обработчик событий. Какой код использовать для перезапуска приложения?

Может я не понимаю твой вопрос. Вы хотите, чтобы в вашем приложении была кнопка, которая перезапускает приложение? Итак, после того, как приложение перестанет работать, оно сможет перезапуститься? Для меня это кажется невозможным. Я не спрашиваю, что после остановки JVM я спрашиваю, как я могу возродить свой основной java-фрейм? Не возможно. Я вижу, что верстак eclipse часто перезагружается, даже Windows делает этот трюк после обновлений. Ложное предположение состоит в том, что приложение - это единственное, что работает, под ним ничего нет. Нам понадобится пусковая установка с возможностью перезапуска, черепахи до упора. @aniaz, тогда вам следует обновить вопрос, чтобы указать, что вы хотите показать / скрыть рамку. Приложение НЕ Фрейм.

Конечно, можно перезапустить приложение Java.

Следующий метод показывает способ перезапуска приложения Java:

В основном он делает следующее:

  1. Найдите исполняемый файл java (здесь я использовал двоичный файл java, но это зависит от ваших требований)
  2. Найдите приложение (в моем случае банку, используя MyClassInTheJar класс для поиска самого местоположения банки)
  3. Создайте команду для перезапуска jar (в этом случае используя двоичный файл java)
  4. Выполните это! (и, таким образом, завершение текущего приложения и его повторный запуск)
Разве не существует небольшого временного интервала, в течение которого одновременно работают две версии одного и того же приложения? Так много комментариев, в которых обсуждается, отвечать на вопрос @Horcrux7 или нет. Вы могли бы просто сказать ему ответ с самого начала, лол. Что ж, я пойду и сделаю это (вроде поздно, я знаю): нет, это не так. Там. Чтобы ответить на мои вопросы самостоятельно. Не работает образец . 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.exe. Строго говоря, это не перезапуск, а запуск новой JVM с теми же аргументами, что и этот. Какая разница? Есть ли разница между перезагрузкой ПК и выключением ОС + повторной загрузкой?

В принципе, нельзя. По крайней мере, не надежным способом. Однако в этом нет необходимости.

Не может часть

Чтобы перезапустить программу Java, вам необходимо перезапустить JVM. Чтобы перезапустить JVM, вам необходимо

Найдите используемую java пусковую установку. Вы можете попробовать, System.getProperty("java.home") но нет гарантии, что он действительно будет указывать на средство запуска, которое использовалось для запуска вашего приложения. (Возвращаемое значение может не указывать на JRE, используемую для запуска приложения, или оно могло быть переопределено -Djava.home .)

Вы бы предположительно хотите выполнить первоначальную память настроек и т.д. ( -Xmx , -Xms , . ) , так что вы должны выяснить , какие параметры которой используется для запуска первой виртуальной машины Java. Вы можете попробовать использовать, ManagementFactory.getRuntimeMXBean().getInputArguments() но нет гарантии, что это будет отражать используемые настройки. Это даже прописано в документации этого метода:

Как правило, не все параметры командной строки для команды java передаются виртуальной машине Java. Таким образом, возвращаемые входные аргументы могут не включать все параметры командной строки.

Если ваша программа считывает ввод с Standard.in исходного stdin, он будет потерян при перезапуске.

Многие из этих уловок и уловок не работают при наличии файла SecurityManager .

Не следует необходимость участвовать

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

Многие приложения предназначены только для создания экземпляра в основном методе:

Используя этот шаблон, должно быть достаточно легко сделать что-то вроде:

и пусть launch() вернет true тогда и только тогда, когда приложение было закрыто таким образом, что его нужно перезапустить.

+1 за лучший совет по дизайну; хотя иногда это просто невозможно, особенно при использовании, например, JNI. Ну, собственная библиотека может изменять глобальное состояние, которое нельзя изменить из интерфейса JNI, поэтому не было бы никакого другого способа «перезапустить» состояние программы, кроме как перезапуском процесса. Конечно, нативная библиотека должна быть лучше спроектирована, но иногда вы зависите от того, что не можете контролировать. Хорошо, но с такими рассуждениями вы также можете иметь чистую Java-библиотеку, изменяющую некоторые внутренние статические переменные. Однако это было бы недостатком дизайна и не должно происходить в хорошо написанных библиотеках. Ваш ответ неверен, поскольку это вполне возможно даже без внешних приложений / демонов, как показано Мейнерсбуром и моим собственным ответом. А для целей самообновления хорошим решением является перезапуск приложения, поэтому на самом деле перезапуск приложений также необходим. Но вы делаете использовать внешнюю программу: java ! Вы забываете, что Java - это спецификация языка, а не программа. Что, если я запустил вашу программу с помощью другого jvm, например, kaffe ? Все равно обновил мой ответ :-)

Строго говоря, Java-программа не может перезапустить себя, поскольку для этого она должна убить JVM, в которой она запущена, а затем запустить ее снова, но как только JVM больше не работает (убита), никаких действий предпринимать нельзя.

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

В зависимости от того, как запускается приложение, вы можете запустить JVM в сценарии-оболочке, который содержит цикл do / while, который продолжается, пока JVM выходит с определенным кодом, тогда приложение AWT должно будет вызвать System.exit(RESTART_CODE) . Например, в псевдокоде скрипта:

Приложение AWT должно выйти из JVM с чем-то другим, кроме RESTART_CODE, при "нормальном" завершении, которое не требует перезапуска.

очень интересное решение. Проблема OSX в том, что обычно приложения Java запускаются из скомпилированного JavaApplicationStub . Не уверен, есть ли простой способ обойти это.

Eclipse обычно перезагружается после установки плагина. Они делают это с помощью оболочки eclipse.exe (приложение запуска) для Windows. Это приложение запускает базовую jar-среду eclipse runner, и если java-приложение eclipse завершается с кодом перезапуска, eclipse.exe перезапускает рабочую среду. Вы можете создать аналогичный фрагмент собственного кода, сценарий оболочки или другую оболочку кода Java для перезапуска.

Windows

/ мин для запуска скрипта в свернутом окне

^ & выйти, чтобы закрыть окно cmd после завершения

образец сценария cmd может быть

спать 10 спать 10 секунд

Если вам действительно нужно перезапустить приложение, вы можете написать отдельное приложение для его запуска .

На этой странице представлено множество различных примеров для разных сценариев:

Хотя этот вопрос старый и на него дан ответ, я наткнулся на проблему с некоторыми решениями и решил добавить свое предложение в смесь.

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


Как я могу перезапустить приложение Java AWT? У меня есть кнопка, к которой я прикрепил обработчик событий. Какой код использовать для перезапуска приложения?

Конечно, можно перезапустить приложение Java.

Следующий метод показывает способ перезапуска приложения Java:

В основном он делает следующее:

Посвящается всем, кто говорит, что это невозможно.

Эта программа собирает всю доступную информацию для восстановления исходной командной строки. Затем он запускает ее, и, поскольку это та же самая команда, ваше приложение запускается во второй раз. Затем мы выходим из исходной программы, дочерняя программа продолжает работать (даже в Linux) и делает то же самое.

ПРЕДУПРЕЖДЕНИЕ: Если вы запустите это, имейте в виду, что он никогда не прекращает создавать новые процессы, как форк-бомба.

  • Возможное улучшение предоставит вам только входные аргументы, переданные JVM. Он пропускает параметры, переданные вашему приложению. например, . На Oracle jvm вы можете получить эти параметры, используя .
  • 1 Родительская виртуальная машина может завершить работу, если дочерняя виртуальная машина и родительская виртуальная машина не будут подключены друг к другу с помощью каналов, что происходит при запуске дочерней виртуальной машины. Используя и , дочерняя виртуальная машина может быть запущена таким же образом, как и родительская виртуальная машина.
  • 1 У меня есть такая версия. Этот комментарий расскажет вам, как это остановить: переименовать что-нибудь в пути, содержащем java.exe.
  • Строго говоря, это не перезапуск, а запуск новой JVM с теми же аргументами, что и этот.
  • 4 В чем разница? Есть ли разница между перезагрузкой ПК и выключением ОС + повторной загрузкой?

В принципе, нельзя. По крайней мере, не надежным способом. Однако в этом нет необходимости.

В не могу часть

Чтобы перезапустить программу Java, вам необходимо перезапустить JVM. Чтобы перезапустить JVM, вам необходимо

Найдите используемую пусковую установку . Вы можете попробовать с , но нет гарантии, что это действительно будет указывать на средство запуска, которое использовалось для запуска вашего приложения. (Возвращаемое значение может не указывать на JRE, используемую для запуска приложения, или оно могло быть переопределено .)

Вы, вероятно, захотите сохранить исходные настройки памяти и т. Д. (, ,…), поэтому вам нужно выяснить, какие настройки использовались для запуска первой JVM. Вы можете попробовать использовать , но нет гарантии, что это будет отражать используемые настройки. Это даже прописано в документации этого метода:

Как правило, не все параметры командной строки для команды java передаются виртуальной машине Java. Таким образом, возвращаемые входные аргументы могут не включать все параметры командной строки.

Если ваша программа считывает ввод с , исходный стандартный ввод будет потерян при перезапуске.

Многие из этих уловок и уловок потерпят неудачу при наличии .

В не нужно часть

Многие приложения предназначены только для создания экземпляра в основном методе:

Используя этот шаблон, должно быть достаточно легко сделать что-то вроде:

и пусть вернет true тогда и только тогда, когда приложение было закрыто таким образом, что его нужно перезапустить.

Строго говоря, программа на Java не может перезапустить себя, поскольку для этого она должна убить JVM, в которой она запущена, а затем запустить ее снова, но как только JVM больше не работает (убита), никаких действий предпринимать нельзя.

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

В зависимости от того, как запускается приложение, вы можете запустить JVM в сценарии-оболочке, который содержит цикл do / while, который продолжается, пока JVM завершает работу с определенным кодом, тогда приложение AWT должно будет вызвать . Например, в псевдокод сценария:

  • очень интересное решение.Проблема в OSX в том, что, как правило, приложения Java запускаются из скомпилированного . Не уверен, есть ли простой способ обойти это.

Eclipse обычно перезагружается после установки плагина. Они делают это с помощью оболочки eclipse.exe (приложение запуска) для Windows. Это приложение запускает базовую jar-программу eclipse runner, и если java-приложение eclipse завершается с кодом перезапуска, eclipse.exe перезапускает рабочую среду. Вы можете создать аналогичный фрагмент собственного кода, сценарий оболочки или другую оболочку кода Java для перезапуска.

Windows

/ мин запустить скрипт в свернутом окне

^& выйти, чтобы закрыть окно cmd после завершения

образец сценария cmd может быть

спать 10 спать 10 секунд

Если вам действительно нужно перезапустить приложение, вы можете написать отдельное приложение для его запуска .

На этой странице представлено множество различных примеров для разных сценариев:

Хотя этот вопрос старый и на него дан ответ, я наткнулся на проблему с некоторыми решениями и решил добавить свое предложение в смесь.

Проблема с некоторыми решениями заключается в том, что они создают единую командную строку. Это создает проблемы, когда некоторые параметры содержат пробелы, особенно java.home.

Например, в окнах строка

Может вернуть что-то вроде этого:

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

Поэтому мое решение строит команду как массив команд:

Я сам исследовал эту тему, когда наткнулся на этот вопрос.

Несмотря на то, что ответ уже принят, я все же хотел бы предложить альтернативный подход для полноты картины. В частности, очень гибким решением послужил Apache Ant.

По сути, все сводится к файлу сценария Ant с одной задачей выполнения Java (см. Здесь и здесь), вызываемой из кода Java (см. Здесь). Этот код Java, который может быть методом запускать, может быть частью приложения, которое необходимо перезапустить. Приложение должно иметь зависимость от библиотеки Apache Ant (jar).

Всякий раз, когда приложение необходимо перезапустить, оно должно вызывать метод запускать и выйдите из ВМ. Java-задача Ant должна иметь параметры вилка а также порождать установлено значение true.

Вот пример сценария Ant:

Код для запускать может выглядеть примерно так:

Очень удобно здесь то, что один и тот же скрипт используется как для первоначального запуска приложения, так и для перезапуска.

Просто добавляю информацию, которой нет в других ответах.

Если вы работаете в среде, которая обеспечивает procfs и поэтому доступна файловая система (что означает, что это не переносимое решение), вы можете заставить Java читать , чтобы перезапустить себя, например:

Многие системы UNIX, включая GNU / Linux (включая Android) в настоящее время имеют procfs Однако на некоторых, таких как FreeBSD, он устарел и постепенно прекращается. Mac OS X является исключением в том смысле, что не имеет procfs. Windows также не имеет procfs. Cygwin имеет procfs но он невидим для Java, потому что он виден только приложениям, использующим библиотеки DLL Cygwin вместо системных вызовов Windows, а Java не знает о Cygwin.

По умолчанию // (в Java называется //) запущенного процесса установлено значение трубы которые позволяют текущему запущенному процессу взаимодействовать с вновь запущенным процессом. Если вы хотите перезапустить текущий процесс, это скорее всего не то, что ты хочешь. Вместо этого вам нужно, чтобы // были такими же, как у текущей виртуальной машины. Это называется унаследованный. Вы можете сделать это, позвонив по номеру своего экземпляра .

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

Старый вопрос и все такое. Но это еще один способ, который дает некоторые преимущества.

В Windows вы можете попросить планировщик задач снова запустить ваше приложение. Это дает преимущество в том, что вы ждете определенное время перед перезапуском приложения. Вы можете зайти в диспетчер задач и удалить задачу, и она перестанет повторяться.

  • Нет накопления опций.
  • Автоматически находит основной класс.
  • Наследует текущий stdout / stderr.

V1.1 Исправление: нулевой указатель, если JAVA_TOOL_OPTIONS не установлен

как перезапустить приложение Java AWT? У меня есть кнопка, к которой я приложил обработчик событий. Какой код следует использовать для перезапуска приложения?

конечно, можно перезапустить приложение Java.

следующий метод показывает способ перезапуска приложения Java:

в основном он делает следующее:

  1. найти исполняемый файл java (я использовал двоичный файл java здесь, но это зависит от ваших требований)
  2. найти приложение (банку в моем случае, используя MyClassInTheJar класс, чтобы найти само местоположение jar)
  3. создайте команду для перезапуска jar (в этом случае используется двоичный файл java)
  4. выполнить его! (и, таким образом, завершение текущего приложения и запуск его снова)

посвящается всем тем, кто говорит, что это невозможно.

эта программа собирает всю информацию, доступную для восстановления исходной командной строки. Затем он запускает его, и поскольку это та же самая команда, ваше приложение запускается во второй раз. Затем мы выходим из исходной программы, дочерняя программа остается запущенной (даже под Linux) и делает то же самое.

предупреждение: если вы запустите это, имейте в виду, что он никогда не заканчивается созданием нового процессы, похожие на форк бомба.

в принципе, вы не можете. По крайней мере, надежным способом.

чтобы перезапустить программу Java, необходимо перезапустить JVM. Чтобы перезапустить JVM, вам нужно

найти java пусковая установка, которая была использована. Вы можете попробовать с System.getProperty("java.home") но нет никакой гарантии, что это действительно укажет на пусковую установку, которая использовалась для запуска вашего приложения. (Возвращаемое значение может не указывать на JRE, используемый для запуска приложения или это может были отменены -Djava.home .)

вы, по-видимому, хотите соблюдать исходные настройки памяти и т. д. ( -Xmx , -Xms . ) поэтому вам нужно выяснить, какие настройки использовались для запуска первой JVM. Вы можете попробовать использовать ManagementFactory.getRuntimeMXBean().getInputArguments() но нет никакой гарантии, что это будет отражать используемые настройки. Это даже прописано в документация этого метода:

как правило, не все параметры командной строки для команда "java" передается на виртуальную машину Java. Таким образом, возвращаемые входные аргументы могут включать не все параметры командной строки.

если ваша программа считывает входные данные из Standard.in исходный stdin будет потерян при перезапуске.

многие из этих трюков и хаков не удастся, в присутствии SecurityManager .

С другой стороны: вам не нужно к.

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

многие приложения предназначены только для создания экземпляра в main-method:

используя этот шаблон, должно быть достаточно легко сделать что-то вроде:

и пусть launch() возвращает true, если и только если приложение было закрыто таким образом, что это нужно перезапустить.

строго говоря, Java-программа не может перезапустить себя, так как для этого она должна убить JVM, в котором она работает, а затем запустить ее снова, но как только JVM больше не работает (убит), тогда никакие действия не могут быть предприняты.

вы можете сделать некоторые трюки с пользовательскими загрузчиками классов для загрузки, упаковки и запуска компонентов AWT снова, но это, вероятно, вызовет много головных болей в отношении цикла событий GUI.

в зависимости от того, как запускается приложение, вы можете запустите JVM в сценарии-оболочке, который содержит цикл do/while, который продолжается, пока JVM выходит с определенным кодом, тогда приложение AWT должно будет вызвать System.exit(RESTART_CODE) . Например, в скриптовом псевдокоде:

приложение AWT должно выйти из JVM с чем-то другим, чем RESTART_CODE на "нормальном" завершении, которое не требует перезапуска.

Eclipse обычно перезапускается после установки плагина. Они делают это с помощью обертки eclipse.exe (launcher app) для windows. Это приложение выполняет ядро eclipse runner jar, и если приложение eclipse java завершается с кодом перезапуска, eclipse.exe перезапускает верстак. Для перезапуска можно создать аналогичный бит собственного кода, сценарий оболочки или другую оболочку кода java.

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

эта страница содержит множество различных примеров для различных сценариев:

хотя этот вопрос старый и ответил, я наткнулся на проблему с некоторыми решениями и решил добавить свое предложение в микс.

проблема с некоторыми решениями заключается в том, что они создают единую командную строку. Это создает проблемы, когда некоторые параметры содержат пробелы, особенно java.домой.

например, в windows строка

может вернуть что-то вроде этого: C:\Program Files\Java\jre7\bin\java

этот строка должна быть завернута в кавычки или экранирована из-за пробела в Program Files . Не огромная проблема, но несколько раздражает и подвержена ошибкам, особенно в кросс-платформенных приложениях.

поэтому мое решение строит команду как массив команды:

Я сам исследовал этот вопрос, когда наткнулся на этот вопрос.

независимо от того, что ответ уже принят, я все равно хотел бы предложить альтернативный подход для полноты. В частности, Apache Ant служил очень гибким решением.

в основном, все сводится к файлу сценария Ant с одной задачей выполнения Java (см. здесь и здесь) вызывается из кода Java (см. здесь). Это Java-код, который может быть методом запуск, может быть частью приложения, которое необходимо перезапустить. Приложение должно иметь зависимость от библиотеки Ant Apache (jar).

всякий раз, когда приложение должно быть перезапущено, оно должно вызвать метод запуск и выйти из виртуальной машины. Задача Ant java должна иметь опции вилки и spawn значение true.

вот пример Ant script:

код запуск метод может выглядеть примерно так:

очень удобно, что один и тот же скрипт используется для начального запуска приложения, а также для перезапуска.

Windows

/мин запуск скрипта в свернутом окне

^& выход, чтобы закрыть окно cmd после завершения

пример сценария cmd может быть

сон 10 спать в течение 10 секунд

просто добавление информации, которой нет в других ответах.

если вы работаете в среде, которая обеспечивает procfs и поэтому /proc файловая система доступна (что означает, что это не портативное решение), вы можете прочитать Java /proc/self/cmdline чтобы перезапустить себя, вот так:

на системах с /proc/self/cmdline этот вероятно, это самый элегантный способ "перезапустить" текущий процесс Java С Java. Не задействован JNI, и не требуется угадывать пути и прочее.

многие системы UNIX, включая GNU / Linux (включая Android) в настоящее время имеют procfs однако на некоторых, таких как FreeBSD, он устарел и постепенно прекращается. Mac OS X исключение в том смысле, что он не имеет procfs. окна тоже не есть procfs. В Cygwin есть procfs но он невидим для Java, потому что он виден только для приложений, использующих DLL Cygwin вместо системных вызовов Windows, и Java не знает о Cygwin.

по умолчанию stdin / stdout / stderr (в Java называется System.in / System.out / System.err ) запущенного процесса установлены в труб которые позволяют текущему процессу общайтесь с недавно запущенным процессом. Если вы хотите перезапустить текущий процесс, это скорее всего, не то, что вы хотите. Вместо этого вы хотели бы этого stdin / stdout / stderr такие же, как у текущей виртуальной машины. Это называется унаследовала. Вы можете сделать это, позвонив inheritIO() вашего ProcessBuilder экземпляра.

частый случай использования restart() функция заключается в перезапуске приложения после обновление. Последний раз я пробовал это на Windows, это было проблематично. При перезаписи приложения .jar файл с новой версией, приложение начало плохо себя вести и давать исключения о

старый вопрос и все такое. Но это еще один способ, который дает некоторые преимущества.

в Windows вы можете попросить планировщик задач снова запустить приложение для вас. Это имеет преимущество ожидания определенного количества времени, прежде чем приложение будет перезапущено. Вы можете перейти в Диспетчер задач и удалить задачу, и она перестанет повторяться.

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

  • нет накопления JAVA_TOOL_OPTIONS параметры.
  • автоматически находит главный класс.
  • наследует текущий stdout / stderr.

V1.1 исправление: нулевой указатель, если JAVA_TOOL_OPTIONS не set

Я думаю, вы действительно не хотите останавливать приложение, но "перезапустить" его. Для этого вы можете использовать это и добавить свой "сброс" перед сном и после невидимого окна.

Как я могу перезапустить приложение Java AWT? У меня есть кнопка, к которой я прикрепил обработчик событий. Какой код использовать для перезапуска приложения?

Конечно, можно перезапустить Java-приложение.

Следующий метод показывает способ перезапуска приложения Java:

В основном он делает следующее:

  1. Найдите исполняемый файл java (здесь я использовал двоичный файл java, но это зависит от ваших требований)
  2. Найдите приложение (в моем случае - банку, используя класс MyClassInTheJar для поиска самого местоположения банки)
  3. Создайте команду для перезапуска jar (в данном случае используя двоичный файл java)
  4. Выполните это! (и, таким образом, завершение текущего приложения и его повторный запуск)

Посвящается всем, кто говорит, что это невозможно.

Эта программа собирает всю доступную информацию для восстановления исходной командной строки. Затем он запускает ее, и, поскольку это та же самая команда, ваше приложение запускается во второй раз. Затем мы выходим из исходной программы, дочерняя программа продолжает работать (даже под Linux) и делает то же самое.

ПРЕДУПРЕЖДЕНИЕ : если вы запустите это, имейте в виду, что он никогда не прекращает создавать новые процессы, аналогичные вилка бомба.

В принципе, вы не можете. По крайней мере, не надежным способом. Однако в этом нет необходимости.

Часть не может

Чтобы перезапустить программу Java, вам необходимо перезапустить JVM. Чтобы перезапустить JVM, вам необходимо

Найдите используемую пусковую установку java . Вы можете попробовать использовать System.getProperty("java.home") , но нет гарантии, что он действительно будет указывать на средство запуска, которое использовалось для запуска вашего приложения. (Возвращаемое значение может не указывать на JRE использовалась для запуска приложения, или она могла быть переопределена -Djava.home .)

Вы, вероятно, захотите сохранить исходные настройки памяти и т. Д. ( -Xmx , -Xms ,…), поэтому вам нужно выяснить, какие настройки использовались для запуска первой JVM. Вы можете попробовать использовать ManagementFactory.getRuntimeMXBean().getInputArguments() , но нет гарантии, что это будет отражать используемые настройки. Это даже прописано в документация этого метода:

Обычно не все параметры командной строки для команды java передаются виртуальной машине Java. Таким образом, возвращаемые входные аргументы могут не включать все параметры командной строки.

Если ваша программа считывает ввод из Standard.in , исходный стандартный ввод будет утерян при перезапуске.

Многие из этих уловок и уловок потерпят неудачу при наличии SecurityManager .

не требуется части

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

Многие приложения предназначены только для создания экземпляра в основном методе:

Используя этот шаблон, должно быть достаточно легко сделать что-то вроде:

И пусть launch() вернет true тогда и только тогда, когда приложение было закрыто таким образом, что его нужно перезапустить.

Строго говоря, Java-программа не может перезапустить себя, поскольку для этого она должна убить JVM, в которой она запущена, а затем запустить ее снова, но как только JVM больше не работает (убита), никаких действий предпринимать нельзя.

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

В зависимости от того, как запускается приложение, вы можете запустить JVM в сценарии-оболочке, который содержит цикл do / while, который продолжается, пока JVM завершает работу с определенным кодом, тогда приложение AWT должно будет вызвать System.exit(RESTART_CODE) . Например, в псевдокоде скрипта:

Приложение AWT должно выходить из JVM с чем-то другим, кроме RESTART_CODE при «нормальном» завершении, которое не требует перезапуска.

Eclipse обычно перезагружается после установки плагина. Они делают это с помощью оболочки eclipse.exe (приложение запуска) для Windows. Это приложение запускает базовую jar-среду eclipse runner, и если java-приложение eclipse завершается с кодом перезапуска, eclipse.exe перезапускает рабочую среду. Вы можете создать аналогичный фрагмент собственного кода, сценарий оболочки или другую оболочку кода Java для перезапуска.

Windows

/ мин для запуска скрипта в свернутом окне

^ & выйти, чтобы закрыть окно cmd после завершения

Образец сценария cmd может быть

сон 10 сон 10 секунд

Хотя этот вопрос старый, и на него есть ответ, я наткнулся на проблему с некоторыми решениями и решил добавить свое предложение в микс.

Проблема с некоторыми решениями заключается в том, что они создают единую командную строку. Это создает проблемы, если некоторые параметры содержат пробелы, особенно java.home .

Например, в окнах строка

Может вернуть что-то вроде этого: C:\Program Files\Java\jre7\bin\java

Эта строка должна быть заключена в кавычки или экранирована из-за пробела в Program Files . Не большая проблема, но несколько раздражающая и подверженная ошибкам, особенно в кроссплатформенных приложениях.

Поэтому мое решение строит команду как массив команд:

Если вам действительно нужно перезапустить приложение, вы можете написать отдельное приложение для его запуска .

На этой странице представлено множество различных примеров для разных сценариев:

Просто добавляю информацию, которой нет в других ответах.

Если вы работаете в среде, которая предоставляет procfs и поэтому имеет доступная файловая система /proc (что означает, что это не переносимое решение), вы можете заставить Java читать /proc/self/cmdline , чтобы перезапустить себя, например:

В системах с доступным /proc/self/cmdline это, вероятно, самый элегантный способ "перезапустить" текущий Java-процесс из Java. Не задействован JNI, не требуется угадывание путей и прочего. Это также позаботится обо всех параметрах JVM, передаваемых в двоичный файл java . Командная строка будет в точности идентична строке текущего процесса JVM.

По умолчанию stdin / stdout / stderr (в Java называется System.in / System.out / System.err ) запущенного процесса настроены на каналы , которые позволяют текущему запущенному процессу взаимодействовать с вновь запущенным процессом. Если вы хотите перезапустить текущий процесс, это скорее всего не то, что вам нужно . Вместо этого вам нужно, чтобы stdin / stdout / stderr были такими же, как у текущей виртуальной машины. Это называется унаследованным . Вы можете сделать это, вызвав inheritIO() своего экземпляра ProcessBuilder .

Частым случаем использования функции restart() является перезапуск приложения после обновления. В последний раз, когда я пробовал это в Windows, это было проблематично. При перезаписи файла .jar приложения новой версией приложение начало вести себя неправильно и выдавать исключения для файла .jar . Я просто говорю, на случай, если это ваш вариант использования. Тогда я решил проблему, заключив приложение в пакетный файл и используя волшебное возвращаемое значение из System.exit() , которое я запросил в пакетном файле, и вместо этого командный файл перезапустил приложение.

Я сам исследовал эту тему, когда наткнулся на этот вопрос.

Несмотря на то, что ответ уже принят, я все же хотел бы предложить альтернативный подход для полноты картины. В частности, очень гибким решением послужил Apache Ant.

По сути, все сводится к файлу сценария Ant с одной задачей выполнения Java (см. здесь и здесь), вызываемые из кода Java (см. здесь). Этот код Java, который может быть методом launch , может быть частью приложения, которое необходимо перезапустить. Приложение должно иметь зависимость от библиотеки Apache Ant (jar).

Каждый раз, когда приложение требует перезапуска, оно должно вызывать метод launch и выходить из виртуальной машины. Для java-задачи Ant должны быть установлены параметры fork и spawn в значение true.

Вот пример сценария Ant:

Код метода launch может выглядеть примерно так:

Очень удобно здесь то, что один и тот же скрипт используется как для первоначального запуска приложения, так и для перезапуска.

Старый вопрос и все такое. Но это еще один способ, который дает некоторые преимущества.

В Windows вы можете попросить планировщик задач снова запустить ваше приложение. Это дает то преимущество, что вы ждете определенное время перед перезапуском приложения. Вы можете перейти в диспетчер задач и удалить задачу, и она перестанет повторяться.

Подобно ответу Йоды «улучшено», но с дальнейшими улучшениями (как функциональными, так и удобочитаемыми и тестируемыми). Теперь его можно запускать безопасно, и он будет перезапускаться столько раз, сколько указано в программе.

  • Нет накопления опций JAVA_TOOL_OPTIONS .
  • Автоматически находит основной класс.
  • Наследует текущий stdout / stderr.

V1.1 Исправление: нулевой указатель, если JAVA_TOOL_OPTIONS не установлен

Я думаю, вы действительно хотите не останавливать приложение, а «перезапустить» его. Для этого вы можете использовать это и добавить свой «Сброс» перед сном и после невидимого окна.

Читайте также: