如何重新启动 Java 应用程序?

2022-08-31 09:55:17

如何重新启动 Java AWT 应用程序?我有一个按钮,我已将事件处理程序附加到该按钮。我应该使用什么代码来重新启动应用程序?

我想执行与在 C# 应用程序中执行的操作相同的操作。Application.Restart()


答案 1

当然,可以重新启动 Java 应用程序。

以下方法显示了重新启动 Java 应用程序的方法:

public void restartApplication()
{
  final String javaBin = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
  final File currentJar = new File(MyClassInTheJar.class.getProtectionDomain().getCodeSource().getLocation().toURI());

  /* is it a jar file? */
  if(!currentJar.getName().endsWith(".jar"))
    return;

  /* Build command: java -jar application.jar */
  final ArrayList<String> command = new ArrayList<String>();
  command.add(javaBin);
  command.add("-jar");
  command.add(currentJar.getPath());

  final ProcessBuilder builder = new ProcessBuilder(command);
  builder.start();
  System.exit(0);
}

基本上,它执行以下操作:

  1. 找到java可执行文件(我在这里使用了java二进制文件,但这取决于您的要求)
  2. 查找应用程序(在我的情况下是一个 jar,使用类来查找 jar 位置本身)MyClassInTheJar
  3. 构建一个命令来重新启动 jar(在本例中使用 java 二进制文件)
  4. 执行它!(从而终止当前应用程序并重新启动它)

答案 2
import java.io.File;
import java.io.IOException;
import java.lang.management.ManagementFactory;

public class Main {
    public static void main(String[] args) throws IOException, InterruptedException {
        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(Main.class.getName()).append(" ");
        for (String arg : args) {
            cmd.append(arg).append(" ");
        }
        Runtime.getRuntime().exec(cmd.toString());
        System.exit(0);
    }
}

献给所有那些说这是不可能的人。

此程序收集可用于重建原始命令行的所有信息。然后,它启动它,并且由于它是相同的命令,因此您的应用程序将再次启动。然后我们退出原始程序,子程序保持运行(即使在Linux下)并做同样的事情。

警告:如果运行此程序,请注意,它永远不会结束创建新进程,类似于分叉炸弹


推荐