Creo que su sugerencia de abrir un puerto para escuchar cuando inicia su aplicación es la mejor idea.
Es muy fácil de hacer y no necesita preocuparse por limpiarlo cuando cierre la aplicación. Por ejemplo, si escribe en un archivo pero alguien mata los procesos usando el Administrador de tareas, el archivo no se eliminará.
Además, si mal no recuerdo, no hay una manera fácil de obtener el PID de un proceso de Java desde la JVM, así que no intente formular una solución utilizando PID.
Algo como esto debe hacer el truco:
private static final int PORT = 9999;
private static ServerSocket socket;
private static void checkIfRunning() {
try {
//Bind to localhost adapter with a zero connection queue
socket = new ServerSocket(PORT,0,InetAddress.getByAddress(new byte[] {127,0,0,1}));
}
catch (BindException e) {
System.err.println("Already running.");
System.exit(1);
}
catch (IOException e) {
System.err.println("Unexpected error.");
e.printStackTrace();
System.exit(2);
}
}
Este código de ejemplo se une de forma explícita a 127.0.0.1
que debe evitar las advertencias de firewall, como cualquier tráfico en esta dirección debe ser desde el sistema local.
Al elegir un puerto, trate de evitar uno mencionado en el list of Well Known Ports. Lo ideal es que el puerto utilizado se pueda configurar en un archivo o mediante un interruptor de línea de comando en caso de conflicto.
más solución más simple :-) java.nio.file bloquear completa ver ejemplo http: // stackoverflow. com/a/20015771/185022 –