如何实现';重新启动应用程序';Java中的功能

如何实现';重新启动应用程序';Java中的功能,java,restart,Java,Restart,在许多软件中,在进行任何更改后,必须重新启动软件才能使更改生效,有时,还可以选择自动重新启动软件。如何在Java中实现此功能? 这就是我尝试过的: int o = JOptionPane.showConfirmDialog( frame, "<html>The previously selected preferences have been changed

在许多软件中,在进行任何更改后,必须重新启动软件才能使更改生效,有时,还可以选择自动重新启动软件。如何在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();
int o=JOptionPane.showConfirmDialog(
框架
“以前选择的首选项已更改。
必须重新启动监视才能使更改生效。
现在重新启动?”, “现在重新启动?”,JOptionPane.YES\u NO\u选项); if(o==JOptionPane.YES\u选项){ 试一试{ Process p=新的ProcessBuilder(“java”,“Watch”).start(); }捕获(IOE异常){ e、 printStackTrace(); } frame.dispose();
但是,这似乎不起作用。应用程序刚刚终止。我缺少什么?提前感谢!

这看起来很有趣:


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

我认为仅使用JVM的功能是很困难的

我从未这样做过,但如果您真的想终止当前应用程序运行的整个JVM并启动它的一个全新实例,我可能会尝试以下方法:

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

    • 分叉或使用其他一些系统功能在后台启动下一步
    • 也许等一段时间,这样你就可以确定旧实例已经死了,或者等到某个PID文件或类似的东西被删除,告诉你旧实例已经死了
    • 使用应用程序主类启动一个新的JVM,可能会给它一些命令行参数,或者设置一些系统属性来通知这个新实例,它实际上是一个自动重新启动的实例(因此它可以对此做出反应,例如,通过继续原来停止的地方)
  • 与第一个主应用程序实例中的步骤1并行,可能需要等待一小段时间(以确保后台内容实际执行),然后调用
    System.exit(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);
    }
    

    尝试使用绝对路径而不是“监视”。你的意思是添加类路径吗?尝试从命令行启动程序->将其准确地放入
    ProcessBuilder
    。我曾经遇到过一个问题,即ProcessBuilder没有加载“path”等环境变量,因此“java”未被识别。但有一种方法可以做到这一点。我不记得了……这让我想起了一个老笑话“你移动了鼠标。需要重新启动Windows才能使更改生效。”-严肃地说,虽然编写代码可能更容易,但用户肯定不希望为了激活某些配置更改而重新启动。@JavaNewbie_M107 Brian Roach的答案正是您想要的答案。请在那里查找最重要的答案。