我有一个非常大的java程序,我们希望这样做,以便用户可以退出应用程序并以另一个用户身份登录。为此,我们要关闭应用程序并重新启动它,以便向用户显示登录对话框。问题是应用程序非常大并且编写得很糟糕。它有很多静态变量,可以保存某种状态信息。理想情况下,我想重写应用程序以处理这些都可以清除的情况,但实际上我们需要尽快提供此功能。
我想的最简单的方法就是停止应用程序并启动新的虚拟机。但是,在关闭当前应用程序时停止和应用并启动相同应用程序似乎非常困难。有没有人有这方面的经验?
编辑:我们正在尝试使用Runtime.exec再次调用同一个应用程序,但exec()想要阻止,所以我们必须跳过箍,让它在每个平台(Windows,Mac,Linux)上运行。我更喜欢独立于平台的方式。答案 0 :(得分:2)
如果你可以修改代码,也许你可以退出程序并使用Runtime
类(java.lang.Runtime
)再次启动相同的程序(使用相同的参数?)使用{{1方法。
http://download.oracle.com/javase/6/docs/api/java/lang/Runtime.html
编辑:也就是说,首先运行新进程,然后退出程序。另一种方式当然会更难或不可能(?)。 :)
答案 1 :(得分:1)
如果您真的想要停止JVM并重新启动它,那么您将必须编写一些包装脚本(shell脚本或批处理文件,具体取决于您的操作系统)。您可以使用System.exit()
中的特殊返回码来指示应该重新启动应用程序。
这可能是最好的方法。您可以玩一些类加载器技巧,在其中创建一个自定义类加载器来加载应用程序的类。但是,有很多方法可以解决这个问题:例如,应用程序代码可能会在某个隐藏的位置调用System.exit()
,或者它可能包含在引导类加载器加载的类中保留内部引用的代码。
答案 2 :(得分:0)
静态成员与classloader:classname相关联。您可以创建自己的类加载器并通过它实例化您的应用程序。然后,当您想要重新启动时,丢弃类加载器并创建一个新的加载器。这就是像JBoss这样的应用程序引擎能够动态重新加载应用程序的方式。
答案 3 :(得分:0)
您可以使用Runtime或ProcessBuilder重新启动您的应用程序,但您可能需要稍微修改一下您的应用程序,因为我很确定您无法检索java可执行文件JVM中的完整路径。
我建议您实现一个启动程序(作为可执行文件或脚本)并使用java返回代码来了解是否需要退出或者是否需要退出或重新启动。