Saltar al contenido

¿Cómo puedo reiniciar una aplicación Java?

Hola, encontramos la solución a tu interrogante, desplázate y la obtendrás más abajo.

Solución:

Por supuesto, es posible reiniciar una aplicación Java.

El siguiente método muestra una forma de reiniciar una aplicación Java:

public void restartApplication()

  final String javaBin = System.getProperty("java.home") + File.separator + "bin" + File.separator + "java";
  final File currentJar = new File(MyClassInTheJar.class.getProtectionDomain().getCodeSource().getLocation().toURI());

  /* is it a jar file? */
  if(!currentJar.getName().endsWith(".jar"))
    return;

  /* Build command: java -jar application.jar */
  final ArrayList command = new ArrayList();
  command.add(javaBin);
  command.add("-jar");
  command.add(currentJar.getPath());

  final ProcessBuilder builder = new ProcessBuilder(command);
  builder.start();
  System.exit(0);

Básicamente hace lo siguiente:

  1. Encuentre el ejecutable de Java (utilicé el binario de Java aquí, pero eso depende de sus requisitos)
  2. Encuentra la aplicación (un jar en mi caso, usando el MyClassInTheJar class para encontrar la ubicación del jar en sí)
  3. Cree un comando para reiniciar el jar (usando el binario de Java en este caso)
  4. ¡Ejecutalo! (y así terminar la aplicación actual y volver a iniciarla)

import java.io.File;
import java.io.IOException;
import java.lang.management.ManagementFactory;

public class Main 
    public static void main(String[] args) throws IOException, InterruptedException 
        StringBuilder cmd = new StringBuilder();
        cmd.append(System.getProperty("java.home") + File.separator + "bin" + File.separator + "java ");
        for (String jvmArg : ManagementFactory.getRuntimeMXBean().getInputArguments()) 
            cmd.append(jvmArg + " ");
        
        cmd.append("-cp ").append(ManagementFactory.getRuntimeMXBean().getClassPath()).append(" ");
        cmd.append(Main.class.getName()).append(" ");
        for (String arg : args) 
            cmd.append(arg).append(" ");
        
        Runtime.getRuntime().exec(cmd.toString());
        System.exit(0);
    

Dedicado a todos aquellos que dicen que es imposible.

Este programa recopila toda la información disponible para reconstruir la línea de comandos original. Luego, lo inicia y dado que es el mismo comando, su aplicación se inicia por segunda vez. Luego salimos del programa original, el programa secundario sigue ejecutándose (incluso en Linux) y hace exactamente lo mismo.

ADVERTENCIA: si ejecuta esto, tenga en cuenta que nunca termina de crear nuevos procesos, similar a una bomba de bifurcación.

Básicamente, no puedes. Al menos no de forma fiable. Sin embargo, no deberías necesitarlo.

Él no puedo parte

Para reiniciar un programa Java, debe reiniciar la JVM. Para reiniciar la JVM necesita

  1. Localiza el java lanzador que se utilizó. Puedes probar con System.getProperty("java.home") pero no hay garantía de que esto realmente apunte al iniciador que se usó para iniciar su aplicación. (Es posible que el valor devuelto no apunte al JRE utilizado para iniciar la aplicación o podría haber sido anulado por -Djava.home.)

  2. Presumiblemente, querrá respetar la configuración de memoria original, etc. (-Xmx, -Xms, …), por lo que debe averiguar qué configuraciones se usaron para iniciar la primera JVM. Podrías intentar usar ManagementFactory.getRuntimeMXBean().getInputArguments() pero no hay garantía de que esto refleje la configuración utilizada. Esto incluso se explica en la documentación de ese método:

    Por lo general, no todas las opciones de la línea de comandos para el comando ‘java’ se pasan a la máquina virtual Java. Por lo tanto, es posible que los argumentos de entrada devueltos no incluyan todas las opciones de la línea de comandos.

  3. Si su programa lee la entrada de Standard.in el stdin original se perderá en el reinicio.

  4. Muchos de estos trucos y trucos fallarán en presencia de un SecurityManager.

Él no debería necesitar parte

Le recomiendo que diseñe su aplicación para que sea fácil de limpiar todo y luego cree una nueva instancia de su clase “principal”.

Muchas aplicaciones están diseñadas para hacer nada más que crear una instancia en el método principal:

public class MainClass 
    ...
    public static void main(String[] args) 
        new MainClass().launch();
    
    ...

Al usar este patrón, debería ser bastante fácil hacer algo como:

public class MainClass 
    ...
    public static void main(String[] args) 
        boolean restart;
        do 
            restart = new MainClass().launch();
         while (restart);
    
    ...

y deja launch() devolver true si y solo si la aplicación se cerró de manera que necesita reiniciarse.

Calificaciones y reseñas

Acuérdate de que puedes permitirte decir si atinaste tu preocupación a tiempo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *