如何使您的Java应用程序自行重启

时间:2013-11-23 23:16:24

标签: java application-restart

我想在我的应用程序中实现reset功能,它清理一些目录,复制文件等,然后为了完成我需要重启它的过程。

如何让应用程序重新运行?我认为打开第二个实例并关闭这个实例就足够了,尽管它不是真正的重启。

我的应用程序的核心是类扩展JFrame但是有很多静态块在程序执行时读取类的扩展。我需要以编程方式重新启动我的应用程序,以便再次创建/执行所有静态集合和块。

它就是这样开始的。

SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            new Window().createGUI();
        }
    });

这看起来很好用:

public void restart() {
    /*  dispose();
    Window.main(null);*/
    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(Window.class.getName()).append(" ");

    try {
        Runtime.getRuntime().exec(cmd.toString());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.exit(0);
}

2 个答案:

答案 0 :(得分:4)

这是来自另一个主题,但与其他主题中接受的问题相反,这个问题确实有效。

public void restart() {
          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(Window.class.getName()).append(" ");

            try {
                Runtime.getRuntime().exec(cmd.toString());
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.exit(0);
    }

27/02/2018:我相信Mark发布了更好的解决方案:https://stackoverflow.com/a/48992863/1123020

答案 1 :(得分:2)

您的问题/我的意见:

  

我想在我的应用程序中实现重置功能,它清理一些目录,复制文件等,然后为了完成我需要重启它的过程。如何使应用程序重新运行?

这是许多应用程序的常见功能/需求,而不仅仅是学术任务。不幸的是,没有一个适合所有解决方案,这将取决于您的程序的具体细节。如果您的程序非常模块化并且使用智能M-V-C分离关注点,那么执行此操作变得更加容易,通常只需将模型重置为初始状态,或者将新模型加载到GUI中。

  

我认为打开第二个实例并关闭这个实例就足够了,尽管它不是真正的重启。

我认为这是一个非常糟糕的主意。最好简单地将文本组件,按钮,复选框等的状态重置为其原始状态。同样,代码越模块化,就越容易做到。每个单独的模块都可以有自己的reset()方法,负责初始化它。

  

在我的情况下,我想重新加载由许多JPanel组成的JFrame。我做到了:

我再次强烈建议你不要走这条路。

您可以将一些JTextComponents放入ArrayList中以便于重置。例如,您可以在重置内重置GUI字段。类似的东西:

public void reset() {
  // assuming you have an ArrayList of JTextComponents called textComponents
  for (JTextComponent textComponent : textComponents) {
    textComponent.setText("");
  }

  // same if you had a bunch of comboboxes in a List called comboBoxes
  for (JComboBox comboBox : comboBoxes) {
    comboBox.setSelection(-1); // consider removing listeners first, then re-adding them

  //   etc for other components
  }
}

修改

  

我发现了我的解决方案 - >处理JFrame并不是那么好。我有很多静态块,加载序列化文件等我需要真正重新启动它。也许应用程序执行本身很简单。

很抱歉,但这只是告诉我你的程序可能会改进其组织。它应该是可重置的,如果没有,请考虑更改它以便它可以这样。它是否遵循模型 - 视图 - 控制结构?如果没有,请考虑这样做。