2013-06-12 3 views
2

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

int o = JOptionPane.showConfirmDialog(
           frame, 
           "<html>The previously selected preferences have been changed.<br>Watch must restart for the changes to take effect.<br> Restart now?</html>", 
           "Restart now?", JOptionPane.YES_NO_OPTION); 
       if(o == JOptionPane.YES_OPTION) { 

        try { 
         Process p = new ProcessBuilder("java", "Watch").start(); 
        } catch(IOException e) { 
         e.printStackTrace(); 
        } 
        frame.dispose(); 

Однако, это не похоже на работу. Приложение просто завершается. Что мне здесь не хватает? Заранее спасибо!

+0

Попробуйте абсолютный путь, а не просто «Дозора». – Sebastian

+0

Вы имеете в виду добавить CLASSPATH? –

+0

Попробуйте запустить вашу программу из командной строки -> Поместите именно это в 'ProcessBuilder'. У меня когда-то была проблема, что переменные среды, такие как «PATH», не были загружены ProcessBuilder, поэтому «java» не был распознан. Однако есть способ сделать это. Я не помню ... – Sebastian

ответ

0

Это выглядит интересно: Make your application restart on its own

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

0

Я думаю, что это трудно использовать только средства JVM.

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

  1. Из основного приложения нить, запустите скрипт оболочки/командный файл (например, с помощью Runtime.getRuntime() Exec («...») `, что делает следующие шаги:.

    • Форкс или использует некоторые другой системный объект для запуска следующего шага (ов) в фоновом режиме.
    • Возможно, подождите некоторое время, чтобы вы могли быть уверены, что старый экземпляр мертв. Или подождите, пока не будет удален какой-либо файл PID или аналогичная вещь, сообщив вам, что старый экземпляр исчез.
    • Запустите новый JVM с основным классом приложений, возможно, предоставив ему некоторый аргумент командной строки или установив некоторое системное свойство, чтобы уведомить этот новый экземпляр о том, что он фактически является экземпляром с автоматическим перезапуском (поэтому он может реагировать на это, например, продолжая где вы изначально отказались).
  2. Параллельно к шагу 1 в первом главном случае приложения, может ждать небольшое количество времени (чтобы убедиться, что фон материал фактически выполняется) и вызвать System.exit(0); или какой-либо другой метод выключения.

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

0

Что можно сказать о следующем:

public static void main(final String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      buildAndShowGui(args); 
     } 
    }); 
} 

public static void buildAndShowGui(final String[] args) { 
    final JFrame frame = new JFrame("Window"); 
    frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); 
    frame.setSize(100, 400); 
    frame.setLayout(new FlowLayout()); 
    JButton button = new JButton("Click!"); 
    button.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      int option = JOptionPane.showConfirmDialog(frame, "Restart?"); 
      if (option == JOptionPane.YES_OPTION) { 
       frame.dispose(); 
       restart(args); 
      } 
     } 
    }); 
    frame.add(button); 
    frame.setVisible(true); 
    frame.toFront(); 
} 

public static void restart(String[] args) { 
    main(args); 
} 
Смежные вопросы