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:
- Encuentre el ejecutable de Java (utilicé el binario de Java aquí, pero eso depende de sus requisitos)
- Encuentra la aplicación (un jar en mi caso, usando el
MyClassInTheJar
class para encontrar la ubicación del jar en sí) - Cree un comando para reiniciar el jar (usando el binario de Java en este caso)
- ¡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
-
Localiza el
java
lanzador que se utilizó. Puedes probar conSystem.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
.) -
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 usarManagementFactory.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.
-
Si su programa lee la entrada de
Standard.in
el stdin original se perderá en el reinicio. -
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.