关闭钩子在Eclipse中不起作用

我添加了一个关闭钩子

Runtime.getRuntime().addShutdownHook(myShutdownHook); 

它通常工作正常,但是当我单击Eclipse中的红色停止按钮时却没有。 有没有办法在Eclipse中调用关闭钩子?

红色停止按钮强行杀死应用程序,即不正常,因此JVM不知道应用程序正在退出,因此不会调用关闭挂钩。

不幸的是,没有办法(至少在Windows中)提供一种机制来确保始终调用钩子。 这只是可以调用的东西,但不能保证。

我用一个装饰的JavaProcess替换了一个hack:

  IProcess p = launch.getProcesses()[0]; launch.addProcess(new JavaProcessDecorator(p)); launch.removeProcess(p); 

并且装饰器覆盖终止function。

 public class JavaProcessDecorator implements IProcess { private IProcess p; public JavaProcessDecorator(IProcess p) { this.p = p; } private boolean sigkill = false; @SuppressWarnings("rawtypes") @Override public Object getAdapter(Class arg) { return p.getAdapter(arg); } ... @Override public ILaunch getLaunch() { return p.getLaunch(); } @Override public IStreamsProxy getStreamsProxy() { return p.getStreamsProxy(); } @Override public void setAttribute(String s1, String s2) { p.setAttribute(s1, s2); } @Override public void terminate() throws DebugException { if(!sigkill) { try { IDebugIService cs = DirmiServer.INSTANCE.getRemote("main", IDebugIService.class); if(cs != null) cs.modelEvent(new TerminateRequest()); } catch (RemoteException e) { } this.sigkill = true; } else p.terminate(); }} 

首先点击红色按钮,我向应用程序发送一条消息,要求轻轻终止。 如果它不起作用,再次单击红色按钮将终止它。

您不能通过使用以下方法解决问题:

  if (Boolean.parseBoolean(System.getenv("RUNNING_IN_ECLIPSE")) == true) { System.out.println("You're using Eclipse; click in this console and " + "press ENTER to call System.exit() and run the shutdown routine."); try { System.in.read(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.exit(0); } 

请参阅: 如何在从Eclipse启动的进程上执行shutdown hook

我知道我参加聚会有点晚了,但我发现这个post寻求帮助,其他人也可能会寻求帮助。

我们遇到了同样的问题并使用Eclipse插件 (在Linux上)解决了它,现在提供了额外的停止按钮。 我希望这能为你们所有人服务,并且它确实帮助了我们:)

红色停止按钮只是终止应用程序,根据eclipse开发者他们无法做任何事情在eclipse bug跟踪器中看到这个问题 。

@Pacerier – 来自Javadoc:在极少数情况下,虚拟机可能会中止,即停止运行而不会干净地关闭。 当虚拟机在外部终止时会发生这种情况,例如Unix上的SIGKILL信号或Microsoft Windows上的TerminateProcess调用。 如果本机方法因例如破坏内部数据结构或尝试访问不存在的内存而出错,则虚拟机也可能中止。 如果虚拟机中止,则无法保证是否将运行任何关闭挂钩。

如果您只想测试钩子是否正常工作,请从触发点throw new RuntimeException() 。 这应该甚至从Eclipse调用shutdown钩子。