Как перезапустить программу java

Java: Как перезапустить программу по мере необходимости?

Ерунду перед началом текста:
Программы здесь включают в себя веб -приложение B/S, а также Java -приложение C/S автономного.
Зачем перезагружаться?

Сцена 1:В распределенной среде, как правило, существует много приложений (то есть, включая Java -приложение C/S и веб -приложение с B/S), развернутыми в различных средах. Чтобы управлять удобством, некоторые публичные конфигурации, такие как :: Учетная запись почтового ящика/пароль/SMTP Информация о тревоге, публичной информации учетной записи FTP и даже информации о соединении JDBC и т. Д. Помечена в определенную позицию (каталог общего сетевого хранилища, Redis Cache, база данных, Zookeeper, удаленный сервер, Удаленный сервис может быть), что удобнее для управления.

Информация учетной записи почтового ящика в порядке. Изменения в конфигурации подписки каждого приложения. Когда изменение найдено, если это среда Spring, вызовите приложение context.refresh () напрямую, и конфигурация снова будет обновлена. Однако для специальной конфигурации источника данных его труднее.

Как перезапустить упавшие тесты Java | Flaky тесты JUnit TestNG

Это необходимо рассмотреть подключенный объект соединения, который был успешно подключен в пуле соединений. Старый источник данных, экземпляр Mapper и т. Д. Трудно гарантировать всю кровь. Лучший способ перезапустить программу.

Сцена 2:Напишите программу, есть скрытые ошибки в неизбежных. Абсолютная программа с нулевыми ошибками по -прежнему очень редко. Если работающая программа продолжает расти, производительность программы ухудшается, когда вы отправляетесь в Linux, постучайте в процесс убийства, а затем перезагрузите Приложение Java. Это может быть странно для начинающих менеджеров, которые не знакомы с Linux. Перезапуск указанной программы облегчит принятие.

Текст начинается:
1. Как процедуры узнают, что им нужно перезапустить?

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

Следовательно, программа должна контролироваться отдельным процессом и получить конкретную инструкцию, не влияя на нормальное закрытие программы, и мышление:

Когда программа запускается, генерируйте уникальный UUID (или другие знаки, если она гарантированно будет единственным), а затем зарегистрируйте временный узел в Zookeeper.

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

Когда администратор надеется перезапустить определенное заявление из центра мониторинга, он может написать узел в Zookeeper

/command/uuid-1 Содержание узла согласовано: restart
Во -вторых, перезапуск приложения Java
Пример кода в Интернете:

Runtime.getRuntime().addShutdownHook(new Thread() < public void run() < try < String restartCmd = «nohup java -jar xxx.jar»; Thread.sleep (10000); // подождите 10 секунд, чтобы убедиться, что аватар запускается, затем выключите себя Logger.debug («Программа перезагружается завершена!»); >catch (Exception e) < Logger.Error («Несоблюдение перезапуска, разум:», E); >> >); logger.debug («Программа готова перезапустить!»); System.exit(0);
Место, которое можно улучшить:

Как переустановить игру если перестала работать

a) Сон (10000) ждет 10 секунд. После начала вашего «аватара» он убьет свое «истинное тело». 10 секунд здесь на самом деле устанавливают вашу голову. Если вы теоретически стремитесь к совершенству, если в системном процессе появляется вновь запущенный «аватар», то «реальное тело» может быть уничтожено.

вопрос:Если вы знаете, что «аватар» был запущен?

Отвечать:Java может получить вывод JPS -L, зная все текущие процессы Java, чтобы вы могли знать, запущено ли указанное приложение. Вы можете получить выход JPS -L перед перезапуском. После перезапуска, а затем снова выполнить выход JPS -L. По сравнению со вторым выводом, если вы найдете новое указанное имя процесса, это означает, что «аватар» начинается. Анкет

Приложение: код Java Get jps

import org.apache.logging.log4j.*; import java.io.BufferedReader; import java.io.InputStreamReader; public final class RuntimeUtil < private static Logger logger = LogManager.getLogger(); public static String exec(String command) < StringBuilder sb = new StringBuilder(); try < Process process = Runtime.getRuntime().exec(command); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line = null; while ((line = reader.readLine()) != null) < sb.append(line); >process.getOutputStream().close(); reader.close(); process.destroy(); > catch (Exception e) < Logger.error («Ошибка выполнения внешних команд, командные строки:» + command, e); >return sb.toString(); > public static String jps() < return exec(«jps -l»); >>

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

public static String getJarExecPath(Class clazz) < String path = clazz.getProtectionDomain().getCodeSource().getLocation().getPath(); if (OSUtil.getOSname().equals(OSType.Windows)) < return path.substring(1); >return path; >
3. Перезапуск веб -приложения
Здесь обсудите только решения, развернутые на JBoss,

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

Нажав «Перезапустить» веб -приложение из интерфейса мониторинга, фоновый код сначала отбрасывает отображение веб -приложения, а затем повторно или назначает.

Источник: russianblogs.com

Как я могу перезапустить приложение Java?

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

Я хочу сделать то же самое, что и в приложении C #.

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

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

public void restartApplication () команда = новый список массивов(); command.add (javaBin); command.add («- банка»); command.add (currentJar.getPath ()); последний построитель ProcessBuilder = новый ProcessBuilder (команда); builder.start (); System.exit (0); >

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

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

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

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

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

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

Читайте также:
Прекращена работа программы total War Warhammer 2

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Windows

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

^] args) commands = новый список массивов(4 + jvmArgs.size () + args.length); Список jvmArgs = ManagementFactory.getRuntimeMXBean (). getInputArguments (); // Java commands.add (System.getProperty («java.home») + File.separator + «bin» + File.separator + «java»); // Аргументы Jvm для (String jvmArg: jvmArgs) // Путь к классам commands.add («- cp»); commands.add (ManagementFactory.getRuntimeMXBean (). getClassPath ()); // Класс для выполнения commands.add (BGAgent.class.getName ()); // Аргументы командной строки для (String arg: args) Файл workingDir = null; // Нулевой рабочий каталог означает, что дочерний элемент использует тот же рабочий каталог String [] env = null; // Нулевой env означает, что дочерний элемент использует ту же среду String [] commandArray = new String [commands.size ()]; commandArray = commands.toArray (массив команд); попробуйте catch (IOException e) >

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

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

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

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

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

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

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

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

Если procfs есть в наличии

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

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

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

Не забудьте использовать

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

Ловушка на Windows

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

Читайте также:
Какие сельхоз программы есть

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

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

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

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

public static void main (String [] args) выдает исключение команда = новый список массивов <> (32); appendJavaExecutable (команда); appendVMArgs (команда); appendClassPath (команда); appendEntryPoint (команда); appendArgs (команда, аргументы); System.out.println (команда); попробуйте catch (исключение IOException) > private static void appendJavaExecutable (Список cmd) private static void appendVMArgs (Коллекция cmd) vmArguments = ManagementFactory.getRuntimeMXBean (). getInputArguments (); Строка javaToolOptions = System.getenv («JAVA_TOOL_OPTIONS»); if (javaToolOptions! = null) javaToolOptionsList = Arrays.asList (javaToolOptions.split («»)); vmArguments = новый ArrayList <> (vmArguments); vmArguments.removeAll (javaToolOptionsList); > cmd.addAll (vmArguments); > private static void appendClassPath (Список cmd) private static void appendEntryPoint (Список cmd) private static void appendArgs (Список cmd, String [] args)

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

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

  • 4 Пользователь попросил перезапустить приложение, а не просто скрыть, а показать окно.

Источник: ru.fluffyfables.com

Как перезапустить приложение Java?

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

Я хочу сделать то же самое, что делает Application.Restart() в приложении C#.

92 2010-11-11T22:15:33+00:00 13
Редактировал вопрос 23-го июля 2011 в 2:15
Комментарии к вопросу (6)
Решение / Ответ
16-го ноября 2010 в 12:42

2010-11-16T12:42:56+00:00
Дополнительно

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

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

public void restartApplication() < final String javaBin = System.getProperty(«java.home») + File.separator + «bin» + File.separator + «java»; final File currentJar = new File(MyClassInTheJar.class.getProtectionDomain().getCodeSource().getLocation().toURI()); /* is it a jar file? */ if(!currentJar.getName().endsWith(«.jar»)) return; /* Build command: java -jar application.jar */ final ArrayListcommand = new ArrayList(); command.add(javaBin); command.add(«-jar»); command.add(currentJar.getPath()); final ProcessBuilder builder = new ProcessBuilder(command); builder.start(); System.exit(0); >

В основном она выполняет следующие действия:

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

Редактировал ответ 10-го октября 2015 в 12:16
Комментарии к ответу ( 16 )
Meinersbur
Ответ на вопрос
12-го ноября 2010 в 12:19
2010-11-12T00:19:11+00:00

Дополнительно

import java.io.File; import java.io.IOException; import java.lang.management.ManagementFactory; public class Main < public static void main(String[] args) throws IOException, InterruptedException < StringBuilder cmd = new StringBuilder(); cmd.append(System.getProperty(«java.home») + File.separator + «bin» + File.separator + «java «); for (String jvmArg : ManagementFactory.getRuntimeMXBean().getInputArguments()) < cmd.append(jvmArg + » «); >cmd.append(«-cp «).append(ManagementFactory.getRuntimeMXBean().getClassPath()).append(» «); cmd.append(Main.class.getName()).append(» «); for (String arg : args) < cmd.append(arg).append(» «); >Runtime.getRuntime().exec(cmd.toString()); System.exit(0); > >

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

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

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

Комментарии к ответу ( 5 )
Ответ на вопрос
11-го ноября 2010 в 10:20
2010-11-11T22:20:24+00:00
Дополнительно

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

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

  1. Найти java launcher, который был использован. Вы можете попробовать использовать System.getProperty(«java.home») , но нет никакой гарантии, что это действительно укажет на программу запуска, которая использовалась для запуска вашего приложения. (Возвращаемое значение может не указывать на JRE, используемую для запуска приложения или оно может быть переопределено -Djava.home ).
  2. Предположительно, вы хотите сохранить исходные настройки памяти и т.д. ( -Xmx , -Xms , …), поэтому вам нужно выяснить, какие настройки использовались для запуска первой JVM. Вы можете попробовать использовать ManagementFactory.getRuntimeMXBean().getInputArguments() , но нет никакой гарантии, что это отразит использованные настройки. Это даже прописано в документации этого метода:

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

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

С другой стороны: Вам не должно это понадобиться.

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

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

public class MainClass < . public static void main(String[] args) < new MainClass().launch(); >. >

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

public class MainClass < . public static void main(String[] args) < boolean restart; do < restart = new MainClass().launch(); >while (restart); > . >

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

Редактировал ответ 23-го мая 2017 в 11:54
Комментарии к ответу ( 6 )
Ответ на вопрос
11-го ноября 2010 в 10:23
2010-11-11T22:23:06+00:00
Дополнительно

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

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

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

DO # Launch the awt program EXIT_CODE = # Get the exit code of the last process WHILE (EXIT_CODE == RESTART_CODE)

Читайте также:
Установить программу с образа диска iso

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

Комментарии к ответу ( 1 )
Ответ на вопрос
11-го ноября 2010 в 10:29
2010-11-11T22:29:01+00:00
Дополнительно

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

Комментарии к ответу ( 0 )
Ответ на вопрос
11-го января 2015 в 12:24
2015-01-11T12:24:34+00:00
Дополнительно

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

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

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

final String javaBin = System.getProperty(«java.home») + File.separator + «bin» + File.separator + «java»;

Может вернуть что-то вроде этого: C:Program файлыпапку Javajre7bin иЯва

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

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

public static void restart(String[] args) < ArrayListcommands = new ArrayList(4 + jvmArgs.size() + args.length); List jvmArgs = ManagementFactory.getRuntimeMXBean().getInputArguments(); // Java commands.add(System.getProperty(«java.home») + File.separator + «bin» + File.separator + «java»); // Jvm arguments for (String jvmArg : jvmArgs) < commands.add(jvmArg); >// Classpath commands.add(«-cp»); commands.add(ManagementFactory.getRuntimeMXBean().getClassPath()); // Class to be executed commands.add(BGAgent.class.getName()); // Command line arguments for (String arg : args) < commands.add(arg); >File workingDir = null; // Null working dir means that the child uses the same working directory String[] env = null; // Null env means that the child uses the same environment String[] commandArray = new String[commands.size()]; commandArray = commands.toArray(commandArray); try < Runtime.getRuntime().exec(commandArray, env, workingDir); System.exit(0); >catch (IOException e) < e.printStackTrace(); >>
Редактировал ответ 23-го июля 2016 в 10:32

Комментарии к ответу ( 0 )
Ответ на вопрос
11-го ноября 2010 в 10:19
2010-11-11T22:19:18+00:00
Дополнительно

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

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

Комментарии к ответу ( 0 )
Ответ на вопрос
1-го октября 2014 в 1:35
2014-10-01T13:35:32+00:00
Дополнительно

Окна

public void restartApp()< // This launches a new instance of application dirctly, // remember to add some sleep to the start of the cmd file to make sure current instance is // completely terminated, otherwise 2 instances of the application can overlap causing strange // things:) new ProcessBuilder(«cmd»,»/c start /min c:/path/to/script/that/launches/my/application.cmd ^).start(); System.exit(0); >

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

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

может быть пример скрипта УМК

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

Редактировал ответ 16-го октября 2014 в 7:01
Комментарии к ответу ( 0 )
Ответ на вопрос
12-го декабря 2010 в 8:09
2010-12-12T20:09:59+00:00
Дополнительно

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

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

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

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

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

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

public final void launch(final String antScriptFile) < /* configure Ant and execute the task */ final File buildFile = new File(antScriptFile); final Project p = new Project(); p.setUserProperty(«ant.file», buildFile.getAbsolutePath()); final DefaultLogger consoleLogger = new DefaultLogger(); consoleLogger.setErrorPrintStream(System.err); consoleLogger.setOutputPrintStream(System.out); consoleLogger.setMessageOutputLevel(Project.MSG_INFO); p.addBuildListener(consoleLogger); try < p.fireBuildStarted(); p.init(); final ProjectHelper helper = ProjectHelper.getProjectHelper(); p.addReference(«ant.projectHelper», helper); helper.parse(p, buildFile); p.executeTarget(p.getDefaultTarget()); p.fireBuildFinished(null); >catch (final BuildException e) < p.fireBuildFinished(e); >/* exit the current VM */ System.exit(0);

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

Комментарии к ответу ( 0 )
Christian Hujer
Ответ на вопрос
11-го марта 2015 в 10:59
2015-03-11T22:59:45+00:00
Дополнительно

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

Если procfs `/proc и/самостоятельной/командной строки доступна

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

public static void restart() throws IOException < new ProcessBuilder(getMyOwnCmdLine()).inheritIO().start(); >public static String[] getMyOwnCmdLine() throws IOException < return readFirstLine(«/proc/self/cmdline»).split(«u0000»); >public static String readFirstLine(final String filename) throws IOException < try (final BufferedReader in = new BufferedReader(new FileReader(filename))) < return in.readLine(); >>

В системах с доступен текстовый командной строки , это, вероятно, самый элегантный способ, чтобы «перезагрузка» в текущем процесса Java от Java. Не JNI участвует, и не гадать путей и прочее необходимое. Это также будет заботиться о всех опций JVM перешла к Ява бинарные. В командной строке будет точно идентичного текущего процесса JVM.

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

Дон’т забывайте использовать ProcessBuilder.inheritIO()`

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

Ошибка в Windows

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

Источник: kzen.dev

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru