如何实现';重新启动应用程序';Java中的功能
在许多软件中,在进行任何更改后,必须重新启动软件才能使更改生效,有时,还可以选择自动重新启动软件。如何在Java中实现此功能?如何实现';重新启动应用程序';Java中的功能,java,restart,Java,Restart,在许多软件中,在进行任何更改后,必须重新启动软件才能使更改生效,有时,还可以选择自动重新启动软件。如何在Java中实现此功能? 这就是我尝试过的: int o = JOptionPane.showConfirmDialog( frame, "<html>The previously selected preferences have been changed
这就是我尝试过的:
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();
int o=JOptionPane.showConfirmDialog(
框架
“以前选择的首选项已更改。
必须重新启动监视才能使更改生效。
现在重新启动?”,
“现在重新启动?”,JOptionPane.YES\u NO\u选项);
if(o==JOptionPane.YES\u选项){
试一试{
Process p=新的ProcessBuilder(“java”,“Watch”).start();
}捕获(IOE异常){
e、 printStackTrace();
}
frame.dispose();
但是,这似乎不起作用。应用程序刚刚终止。我缺少什么?提前感谢!这看起来很有趣:
基本上,您可以创建一个脚本来运行应用程序。在应用程序中,如果用户选择重新启动,则会创建一个重新启动文件,然后应用程序退出。退出时,启动脚本会检查是否存在重新启动文件。如果存在,请再次调用应用程序。我认为仅使用JVM的功能是很困难的 我从未这样做过,但如果您真的想终止当前应用程序运行的整个JVM并启动它的一个全新实例,我可能会尝试以下方法:
- 分叉或使用其他一些系统功能在后台启动下一步
- 也许等一段时间,这样你就可以确定旧实例已经死了,或者等到某个PID文件或类似的东西被删除,告诉你旧实例已经死了
- 使用应用程序主类启动一个新的JVM,可能会给它一些命令行参数,或者设置一些系统属性来通知这个新实例,它实际上是一个自动重新启动的实例(因此它可以对此做出反应,例如,通过继续原来停止的地方)
System.exit(0);
或其他关闭方法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);
}
尝试使用绝对路径而不是“监视”。你的意思是添加类路径吗?尝试从命令行启动程序->将其准确地放入
ProcessBuilder
。我曾经遇到过一个问题,即ProcessBuilder没有加载“path”等环境变量,因此“java”未被识别。但有一种方法可以做到这一点。我不记得了……这让我想起了一个老笑话“你移动了鼠标。需要重新启动Windows才能使更改生效。”-严肃地说,虽然编写代码可能更容易,但用户肯定不希望为了激活某些配置更改而重新启动。@JavaNewbie_M107 Brian Roach的答案正是您想要的答案。请在那里查找最重要的答案。