【问题标题】:How can I implement the 'restart application' feature in Java [duplicate]如何在 Java 中实现“重新启动应用程序”功能 [重复]
【发布时间】:2013-06-12 21:46:30
【问题描述】:

在许多软件中,我们进行任何更改后,都必须重新启动软件才能使更改生效,有时还会有自动重新启动软件的选项。如何在 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();

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

【问题讨论】:

  • 尝试绝对路径,而不是仅仅“观看”。
  • 您的意思是添加 CLASSPATH?
  • 尝试从命令行启动您的程序 -> 将其放入ProcessBuilder。我曾经遇到过 ProcessBuilder 未加载诸如“PATH”之类的环境变量的问题,因此无法识别“java”。不过,有一种方法可以做到这一点。我不记得了……
  • 这让我想起了一个老笑话“你已经移动了鼠标。需要重新启动 Windows 才能使更改生效。” - 严肃地说,虽然它可能更容易编码,但用户肯定不希望仅仅为了激活一些配置更改而必须重新启动。
  • @JavaNewbie_M107 Brian Roach 的答案是你想要的。在那里寻找最佳答案。

标签: java restart


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    我认为仅使用 JVM 的功能很难做到这一点。

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

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

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

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

    【讨论】:

      【解决方案3】:

      接下来呢:

      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);
      }
      

      【讨论】:

        猜你喜欢
        • 2020-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多