En Windows para detener con gracia una aplicación Java de una manera estándar se necesita enviar Ctrl + C a él. Esto solo funciona con aplicaciones de consola, pero Eclipse usa javaw.exe
en lugar de java.exe
. Para solucionar esto, abra la configuración de inicio, la pestaña JRE y seleccione "JRE alternativo:". Aparece el cuadro de grupo "Ejecutable de Java" y permite ingresar el ejecutable alternativo "java".
Ahora necesitamos un programa externo para enviar Ctrl-C a un proceso con una consola oculta. Encontré sugerencias here y here. Nuestro programa se conecta a la consola del proceso deseado y envía el evento de la consola. programa Java
#include <stdio.h>
#include <windows.h>
int main(int argc, char* argv[])
{
if (argc == 2) {
unsigned pid = 0;
if (sscanf_s(argv[1], "%u", &pid) == 1) {
FreeConsole(); // AttachConsole will fail if we don't detach from current console
if (AttachConsole(pid)) {
//Disable Ctrl-C handling for our program
SetConsoleCtrlHandler(NULL, TRUE);
GenerateConsoleCtrlEvent(CTRL_C_EVENT, 0);
return 0;
}
}
}
return 1;
}
prueba:
public class Shuthook {
public static void main(final String[] args) throws Exception {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
System.out.println("Shutting down...");
}
});
String sPid = ManagementFactory.getRuntimeMXBean().getName();
sPid = sPid.substring(0, sPid.indexOf('@'));
System.out.println("pid: " + sPid);
System.out.println("Sleeping...");
Thread.sleep(1000000);
}
}
terminarlo:
C:\>killsoft.exe 10520
salida del programa de prueba en Eclipse:
pid: 10520
Sleeping...
Shutting down...
No haga funcionar su aplicación desde dentro de Eclipse? –
Creo que la sugerencia de @ mattb es buena, porque la mayoría de los programas deberían ejecutarse fuera del IDE en algún momento. Por cierto, IntelliJ IDEA tiene un botón para esto: http://stackoverflow.com/questions/4727536/. –
@ TimBüthe, Bueno, pero no es útil cuando estamos haciendo rápidos ciclos de prueba de código-depuración-código-prueba-depuración ... – Pacerier