如何在Java中实现“重启应用程序”功能

时间:2013-06-12 13:25:56

标签: java restart

在许多软件中,我们进行任何更改后,必须重新启动软件才能使更改生效,有时可以选择自动重启软件。我怎样才能在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();

但是,这似乎不起作用。应用程序刚刚终止。我在这里错过了什么?提前谢谢!

3 个答案:

答案 0 :(得分:0)

这看起来很有趣:Make your application restart on its own

基本上,您可以创建一个脚本来运行您的应用。在您的应用程序中,如果用户选择重新启动,则会创建重新启动文件,然后退出该应用程序。退出时,启动脚本会检查是否存在重新启动文件。如果存在,请再次调用该应用程序。

答案 1 :(得分:0)

我认为仅使用JVM的设施很难。

我从来没有这样做过,但是如果你真的想终止运行当前应用程序的整个JVM并启动一个全新的实例,我可能会尝试这些方法:

  1. 从主应用程序线程中,启动一个shell脚本/批处理文件(例如,使用Runtime.getRuntime()。exec(“...”)`执行以下步骤:

    • 分叉或使用其他系统工具在后台启动下一步。
    • 也许等一下,这样你就可以确定旧的实例已经死了。或者等到某种PID文件或类似的东西被删除,告诉你旧实例已经消失。
    • 使用您的应用程序主类启动一个新的JVM,可能会给它一些命令行参数或设置一些系统属性来通知这个新实例它实际上是一个自动重启的实例(因此它可以对此做出反应,例如继续你最初离开的地方)。
  2. 与第一个主应用实例中的第1步并行,可能需要等待一小段时间(以确保实际执行后台内容)并调用System.exit(0);或其他一些关闭方法

  3. 也许有一种更简单的方法,这只是我能想到的第一种方式。

答案 2 :(得分: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);
}