- Как я могу перезапустить приложение Java?
- 13 ответов
- Если доступно procfs /proc/self/cmdline
- Не забудьте использовать ProcessBuilder.inheritIO()
- Ловушка на Windows
- Как перезапустить программу?
- How can I restart a Java application?
- 13 Answers 13
- The can’t part
- The shouldn’t need part
- If procfs /proc/self/cmdline is available
- Don’t forget to use ProcessBuilder.inheritIO()
Как я могу перезапустить приложение Java?
Как перезапустить приложение Java AWT? У меня есть кнопка, к которой я прикрепил обработчик событий. Какой код я должен использовать, чтобы перезапустить приложение?
Я хочу сделать то же самое, что Application.Restart() сделать в приложении C #.
13 ответов
Конечно, можно перезапустить приложение Java.
Следующий метод показывает способ перезапустить приложение Java:
В основном это делает следующее:
- Найдите исполняемый файл Java (здесь я использовал двоичный файл Java, но это зависит от ваших требований)
- Найдите приложение (в моем случае банку, используя класс MyClassInTheJar , чтобы найти само местоположение баночки)
- Создайте команду для перезапуска jar (в этом случае используйте двоичный файл java)
- Выполните это! (и, таким образом, завершение текущего приложения и запуск его снова)
Посвящается всем тем, кто говорит, что это невозможно.
Эта программа собирает всю информацию, доступную для восстановления исходной командной строки. Затем он запускает его, и поскольку это та же команда, ваше приложение запускается во второй раз. Затем мы выходим из исходной программы, дочерняя программа остается запущенной (даже под Linux) и делает то же самое.
ПРЕДУПРЕЖДЕНИЕ : Если вы запустите это, имейте в виду, что оно никогда не заканчивается созданием новых процессов, подобно вилочной бомбе .
По сути, вы не можете. По крайней мере, не надежным способом.
Чтобы перезапустить программу Java, необходимо перезапустить JVM. Для перезапуска JVM вам нужно
Найдите средство запуска java , которое использовалось. Вы можете попробовать с System.getProperty(«java.home») , но нет никакой гарантии, что это на самом деле будет указывать на панель запуска, которая использовалась для запуска вашего приложения. (Возвращаемое значение может не указывать на JRE, используемую для запуска приложения , или оно могло быть переопределено -Djava.home . )
Вы, вероятно, захотите соблюдать исходные настройки памяти и т. Д. ( -Xmx , -Xms ,…), поэтому вам необходимо выяснить, какие настройки использовались для запуска первой JVM. Вы можете попробовать использовать ManagementFactory.getRuntimeMXBean().getInputArguments() , но нет гарантии, что это будет отражать используемые настройки. Это даже прописано в документации этого метода:
Как правило, не все параметры командной строки для команды ‘java’ передаются на виртуальную машину Java. Таким образом, возвращаемые входные аргументы могут включать не все параметры командной строки.
Если ваша программа считывает ввод с Standard.in , исходный стандарт будет потерян при перезапуске.
Многие из этих трюков и хаков не удастся при наличии SecurityManager .
С другой стороны: Вам не нужно.
Я рекомендую вам спроектировать ваше приложение так, чтобы было легко очистить каждую вещь и после этого создать новый экземпляр вашего «основного» класса.
Многие приложения предназначены только для создания экземпляра в методе main:
Используя этот шаблон, должно быть достаточно легко сделать что-то вроде:
и пусть launch() возвращает true, если и только если приложение было закрыто таким образом, что его необходимо перезапустить.
Строго говоря, Java-программа не может перезапустить себя, так как для этого она должна завершить работу JVM, в которой она выполняется, и затем запустить ее снова, но как только JVM больше не работает (не убит), никакие действия предпринять невозможно.
Вы могли бы сделать несколько трюков с пользовательскими загрузчиками классов, чтобы снова загрузить, упаковать и запустить компоненты AWT, но это, вероятно, вызовет много головной боли в отношении цикла событий GUI.
В зависимости от того, как запущено приложение, вы можете запустить JVM в сценарии-обертке, который содержит цикл do / while, который продолжается, пока JVM завершает работу с определенным кодом, тогда приложению AWT придется вызвать System.exit(RESTART_CODE) . Например, в сценарии псевдокод:
Приложение AWT должно выйти из JVM с чем-то отличным от RESTART_CODE при «нормальном» завершении, которое не требует перезапуска.
Eclipse обычно перезапускается после установки плагина. Они делают это, используя затмение оболочки. Exe (приложение запуска) для Windows. Это приложение запускает основной jar-файл eclipse runner, и, если java-приложение eclipse завершает работу с кодом перезапуска, eclipse. exe перезапускает верстак. Вы можете создать подобный фрагмент собственного кода, сценария оболочки или другой оболочки Java-кода для достижения перезапуска.
Если вам действительно нужно перезапустить приложение, вы можете написать отдельное приложение, чтобы запустить его. , ,
На этой странице представлено много разных примеров для разных сценариев:
Хотя этот вопрос старый и на него дан ответ, я наткнулся на проблему с некоторыми решениями и решил добавить свое предложение в смесь.
Проблема некоторых решений заключается в том, что они создают единую командную строку. Это создает проблемы, когда некоторые параметры содержат пробелы, особенно Java. дом .
Например, на окнах, строка
Может вернуть что-то вроде этого: C:\Program Files\Java\jre7\bin\java
Эта строка должна быть заключена в кавычки или экранирована из-за пробела в Program Files . Не большая проблема, но несколько раздражающая и подверженная ошибкам, особенно в кроссплатформенных приложениях.
Поэтому мое решение строит команду как массив команд:
Я сам исследовал эту тему, когда столкнулся с этим вопросом.
Независимо от того, что ответ уже принят, я все же хотел бы предложить альтернативный подход для полноты. В частности, Apache Ant послужил очень гибким решением.
По сути, все сводится к файлу сценария Ant с одной задачей выполнения Java (см. здесь и здесь ), вызванной из кода Java (см. здесь ). Этот Java-код, который может быть методом запуска , может быть частью приложения, которое необходимо перезапустить. Приложение должно иметь зависимость от библиотеки Apache Ant (jar).
Всякий раз, когда необходимо перезапустить приложение, оно должно вызвать метод , запустить и выйти из виртуальной машины. Задача Ant java должна иметь для параметров fork и spawn значение true.
Вот пример скрипта Ant:
Код для запуска метода может выглядеть примерно так:
Здесь очень удобно то, что один и тот же скрипт используется для начального запуска приложения, а также для перезапуска.
Windows
/ мин для запуска скрипта в свернутом окне
^ & amp; выход, чтобы закрыть окно cmd после финиша
образец сценария cmd может быть
сон 10 сон 10 секунд
Просто добавляю информацию, которой нет в других ответах.
Если доступно procfs /proc/self/cmdline
Если вы работаете в среде, которая предоставляет procfs и, следовательно, имеет доступную файловую систему /proc (что означает, что это не переносимое решение), вы можете иметь чтение Java /proc/self/cmdline , чтобы перезапустить себя, например:
В системах с /proc/self/cmdline это, вероятно, самый элегантный способ «перезапустить» текущий процесс Java из Java. Никакой JNI не задействован, и не нужно угадывать пути и прочее.
В настоящее время многие системы UNIX, включая GNU / Linux (включая Android), имеют procfs Однако в некоторых, таких как FreeBSD, это устарело и постепенно прекращается. Mac OS X является исключением в том смысле, что она не имеет procfs . Windows также не имеет procfs . Cygwin имеет procfs , но он невидим для Java, потому что он виден только приложениям, использующим библиотеки 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 опций.
- Автоматически находит основной класс.
- Наследует текущий stdout / stderr.
V1. 1 Исправление: нулевой указатель, если JAVA_TOOL_OPTIONS не установлен
Полагаю, вы не хотите останавливать приложение, а просто «перезапустите» его. Для этого вы можете использовать это и добавить свой «Сброс» перед сном и после невидимого окна.
Как перезапустить программу?
Как перезапустить программу
мне нужно чтобы программа запускалась заново или все переменные очистились (во всей программе) и.
Как программно перезапустить свою программу.
Есть ли какой нибудь код, что-бы если пользователь нажал на кнопку то программа закрылась и сама.
Как программно перезапустить собственную программу?
как программно перезапутить собственную программу? Application.Restart(); не поддерживается!
Как перезапустить программу нажатием кнопки?
Возможно ли такое, что-бы прога сама себя перезапускала?
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.
Как перезапустить программу с новыми данными из textBox
Что я делаю: Делаю игру сапер и там можно выбирать размер поля (высота и ширина) и нажать старт.
Как перезапустить программу. Желательно не через Goto
Есть код по работе с массивами и сам по себе он работает. Но необходимо что бы по желанию.
Как полностью перезапустить программу из самой же программы? Не сбросить все параметры
Имеется достаточно длинная программа. Вся программа содержится в main() с использованием case.
Перезапустить программу при неверном выборе в swich
подскажите как сделать при операторе switch вызов сase дальше. а не заново запускать программу.
How can I restart a Java application?
How can I restart a Java AWT application? I have a button to which I have attached an event handler. What code should I use to restart the application?
I want to do the same thing that Application.Restart() do in a C# application.
13 Answers 13
Of course it is possible to restart a Java application.
The following method shows a way to restart a Java application:
Basically it does the following:
- Find the java executable (I used the java binary here, but that depends on your requirements)
- Find the application (a jar in my case, using the MyClassInTheJar class to find the jar location itself)
- Build a command to restart the jar (using the java binary in this case)
- Execute it! (and thus terminating the current application and starting it again)
Dedicated to all those who say it is impossible.
This program collects all information available to reconstruct the original commandline. Then, it launches it and since it is the very same command, your application starts a second time. Then we exit the original program, the child program remains running (even under Linux) and does the very same thing.
WARNING: If you run this, be aware that it never ends creating new processes, similar to a fork bomb.
Basically, you can’t. At least not in a reliable way. However, you shouldn’t need to.
The can’t part
To restart a Java program, you need to restart the JVM. To restart the JVM you need to
Locate the java launcher that was used. You may try with System.getProperty(«java.home») but there’s no guarantee that this will actually point to the launcher that was used to launch your application. (The value returned may not point to the JRE used to launch the application or it could have been overridden by -Djava.home .)
You would presumably want to honor the original memory settings etc ( -Xmx , -Xms , …) so you need to figure out which settings where used to start the first JVM. You could try using ManagementFactory.getRuntimeMXBean().getInputArguments() but there’s no guarantee that this will reflect the settings used. This is even spelled out in the documentation of that method:
Typically, not all command-line options to the ‘java’ command are passed to the Java virtual machine. Thus, the returned input arguments may not include all command-line options.
If your program reads input from Standard.in the original stdin will be lost in the restart.
Lots of these tricks and hacks will fail in the presence of a SecurityManager .
The shouldn’t need part
I recommend you to design your application so that it is easy to clean every thing up and after that create a new instance of your «main» class.
Many applications are designed to do nothing but create an instance in the main-method:
By using this pattern, it should be easy enough to do something like:
and let launch() return true if and only if the application was shut down in a way that it needs to be restarted.
Strictly speaking, a Java program cannot restart itself since to do so it must kill the JVM in which it is running and then start it again, but once the JVM is no longer running (killed) then no action can be taken.
You could do some tricks with custom classloaders to load, pack, and start the AWT components again but this will likely cause lots of headaches with regard to the GUI event loop.
Depending on how the application is launched, you could start the JVM in a wrapper script which contains a do/while loop, which continues while the JVM exits with a particular code, then the AWT app would have to call System.exit(RESTART_CODE) . For example, in scripting pseudocode:
The AWT app should exit the JVM with something other than the RESTART_CODE on «normal» termination which doesn’t require restart.
Eclipse typically restarts after a plugin is installed. They do this using a wrapper eclipse.exe (launcher app) for windows. This application execs the core eclipse runner jar and if the eclipse java application terminates with a relaunch code, eclipse.exe restarts the workbench. You can build a similar bit of native code, shell script or another java code wrapper to achieve the restart.
Windows
/min to start script in minimized window
^& exit to close cmd window after finish
a sample cmd script could be
sleep 10 sleep for 10 seconds
Although this question is old and answered, I’ve stumbled across a problem with some of the solutions and decided to add my suggestion into the mix.
The problem with some of the solutions is that they build a single command string. This creates issues when some parameters contain spaces, especially java.home.
For example, on windows, the line
Might return something like this: C:\Program Files\Java\jre7\bin\java
This string has to be wrapped in quotes or escaped due to the space in Program Files . Not a huge problem, but somewhat annoying and error prone, especially in cross platform applications.
Therefore my solution builds the command as an array of commands:
If you realy need to restart your app, you could write a separate app the start it.
This page provides many different examples for different scenarios:
Just adding information which is not present in other answers.
If procfs /proc/self/cmdline is available
If you are running in an environment which provides procfs and therefore has the /proc file system available (which means this is not a portable solution), you can have Java read /proc/self/cmdline in order to restart itself, like this:
On systems with /proc/self/cmdline available, this probably is the most elegant way of how to «restart» the current Java process from Java. No JNI involved, and no guessing of paths and stuff required. This will also take care of all JVM options passed to the java binary. The command line will be exactly identical to the one of the current JVM process.
Many UNIX systems including GNU/Linux (including Android) nowadays have procfs However on some like FreeBSD, it is deprecated and being phased out. Mac OS X is an exception in the sense that it does not have procfs. Windows also does not have procfs. Cygwin has procfs but it’s invisible to Java because it’s only visible to applications using the Cygwin DLLs instead of Windows system calls, and Java is unaware of Cygwin.