Java 从现有JVM调用新JVM

Java 从现有JVM调用新JVM,java,Java,我正在编写GUI应用程序,我想重新启动应用程序,以防用户做了一些更改 当前,我使用初始化gui的方法startGui进行了一次主调用。 我想知道如何再次调用此方法,但使用现有JVM中的新JVM。我认为您无法从VM中执行此操作。相反,您可能需要一个dispatcher进程(它可以是一个shell脚本,但也可以是任何其他进程,包括Java进程) 无论如何,您需要结束当前进程(使用System.exit(someCode)),让您的调度程序分析返回代码,并让它为给定的返回代码重新启动此应用程序。以下是

我正在编写GUI应用程序,我想重新启动应用程序,以防用户做了一些更改

当前,我使用初始化gui的方法
startGui
进行了一次主调用。
我想知道如何再次调用此方法,但使用现有JVM中的新JVM。

我认为您无法从VM中执行此操作。相反,您可能需要一个dispatcher进程(它可以是一个shell脚本,但也可以是任何其他进程,包括Java进程)


无论如何,您需要结束当前进程(使用System.exit(someCode)),让您的调度程序分析返回代码,并让它为给定的返回代码重新启动此应用程序。

以下是我在当前项目中的做法。它保留进程参数、JVM参数和类路径

private static void restart(String[] args) throws IOException {
    RuntimeMXBean mx = ManagementFactory.getRuntimeMXBean();
    List<String> jvmArgs = mx.getInputArguments();
    String cp = mx.getClassPath();

    List<String> listArgs = new ArrayList<String>();
    listArgs.add("java");
    listArgs.addAll(jvmArgs);
    listArgs.add("-cp");
    listArgs.add(cp);
    listArgs.add(Main.class.getName());
    listArgs.addAll(Arrays.asList(args));

    String[] res = new String[listArgs.size()];
    Runtime.getRuntime().exec(listArgs.toArray(res));

    System.exit(0);
}
私有静态无效重启(字符串[]args)引发IOException{
RuntimeMXBean mx=ManagementFactory.getRuntimeMXBean();
列出jvmArgs=mx.getInputArguments();
字符串cp=mx.getClassPath();
List listArgs=new ArrayList();
添加(“java”);
addAll(jvmArgs);
添加(“-cp”);
listArgs.add(cp);
add(Main.class.getName());
addAll(Arrays.asList(args));
String[]res=新字符串[listArgs.size()];
Runtime.getRuntime().exec(listArgs.toArray(res));
系统出口(0);
}

请注意,
args
main
方法接收的参数。它必须被存储在某个地方。

类似这样的东西?:但如果我在系统中有另一个进程,我可以使用Runtime类调用我的java类吗?@David我会使用。使用起来舒服多了。非常感谢您的帮助。