Wie kann ich eine Java-Anwendung neu starten?
Wie kann ich starten Sie ein Java-AWT-Anwendung? Ich habe eine Schaltfläche die ich mit einem event-handler. Welchen code sollte ich verwenden, um die Anwendung neu starten?
Möchte ich das gleiche tun, was Application.Restart()
tun in einer C# - Anwendung.
InformationsquelleAutor der Frage Azfar Niaz | 2010-11-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Natürlich ist es möglich, starten einer Java-Anwendung.
Die folgende Methode zeigt eine Möglichkeit zum starten einer Java-Anwendung:
Grundsätzlich geht es folgendermaßen:
MyClassInTheJar
Klasse zu finden, die jar-Speicherort selbst)InformationsquelleAutor der Antwort Veger
All jenen gewidmet, die sagen, es ist unmöglich.
Dieses Programm sammelt alle verfügbaren Informationen zu rekonstruieren, die original-Kommandozeile. Dann startet es und da ist es genau der gleiche Befehl, Ihre Anwendung beginnt ein zweites mal. Dann verlassen wir das ursprüngliche Programm, die Kind-Programm laufen bleibt, (auch unter Linux) und hat die sehr gleiche Sache.
WARNUNG: Wenn Sie dies ausführen, werden Sie sich bewusst, dass es nie endet anlegen von neuen Prozessen, ähnlich wie ein Gabel Bombe.
InformationsquelleAutor der Antwort Meinersbur
Können Sie im Prinzip nicht. Zumindest nicht in einer zuverlässigen Weise.
Starten eines Java-Programms müssen Sie neu starten der JVM. Zum Neustart der JVM, die Sie brauchen, um
Suchen Sie die
java
launcher verwendet wurde. Sie können versuchen, mitSystem.getProperty("java.home")
aber es gibt keine Garantie, dass dies auch tatsächlich der Trägerrakete wurde verwendet, um starten Sie Ihre Anwendung. (Der Wert, der zurückgegeben wird kann nicht auf die JRE verwendet, um die Anwendung zu starten oder es könnten überschrieben-Djava.home
.)Würden Sie vermutlich zu Ehren wollen die ursprüngliche memory Einstellungen etc (
-Xmx
,-Xms
...), so dass Sie brauchen, um herauszufinden, welche Einstellungen wurden verwendet, um den Anfang der ersten JVM. Sie könnten versuchen, mitManagementFactory.getRuntimeMXBean().getInputArguments()
aber es gibt keine Garantie dafür, dass diese entsprechend den Einstellungen verwendet. Dies ist auch geschrieben in die Dokumentation Methode:Wenn Ihr Programm liest die Eingabe von
Standard.in
original stdin verloren in den Neustart.Viele dieser tricks und hacks werden nicht in der Anwesenheit eines
SecurityManager
.Auf der anderen Seite: müssen Sie sich nicht.
Empfehle ich Ihnen, Ihre Anwendung so entwerfen, dass es leicht zu reinigen jedes Ding bis und nach, erstellen Sie eine neue Instanz der "main" Klasse.
Viele Anwendungen sind so konzipiert, nichts zu tun, aber erstellen Sie eine Instanz in der main-Methode:
Durch die Verwendung dieses Muster, es sollte einfach genug zu tun, so etwas wie:
und lassen
launch()
gibt true zurück, wenn und nur wenn die Anwendung heruntergefahren wurde in einer Weise, dass es neu gestartet werden muss.InformationsquelleAutor der Antwort aioobe
Streng genommen, ein Java-Programm nicht neu starten, selbst da tun Sie es töten müssen, der JVM, in der es ausgeführt wird, und starten Sie es erneut, aber nach dem beenden der JVM nicht mehr ausgeführt wird (getötet), dann wird keine Maßnahme ergriffen werden kann.
Könnten Sie tun,, einige tricks mit benutzerdefinierten classloadern geladen, pack, und starten Sie den AWT-Komponenten wieder, aber dies wird wahrscheinlich dazu führen, dass viele Kopfschmerzen mit Bezug auf die GUI-event-Schleife.
Je nachdem, wie die Anwendung gestartet wird, könnte man anfangen, die JVM in ein wrapper-Skript, welches eine do/while-Schleife, die fortgesetzt, wenn die JVM beendet mit einem bestimmten code, dann die AWT-app aufrufen zu müssen
System.exit(RESTART_CODE)
. Zum Beispiel, in scripting pseudocode:Das AWT sollte die app beenden der JVM mit etwas anderem als der RESTART_CODE auf "normale" Kündigung, die nicht erforderlich ist, neu starten.
InformationsquelleAutor der Antwort maerics
Eclipse in der Regel neu gestartet, nachdem ein plugin installiert ist. Sie tun dies mit einem wrapper eclipse.exe (launcher-app) für windows. Diese Anwendung execs, die Kern-eclipse runner jar und wenn der eclipse-java-Anwendung beendet mit einem relaunch-code, eclipse.exe startet die workbench. Sie können eine ähnliche bit-native-code, shell-Skript oder ein anderes java-code-wrapper zu erreichen, die neu starten.
InformationsquelleAutor der Antwort whatnick
Wenn Sie wirklich brauchen, um starten Sie Ihre app, könnten Sie schreiben, eine separate app-start...
Dieser Seite finden Sie viele verschiedene Beispiele für verschiedene Szenarien:
http://www.rgagnon.com/javadetails/java-0014.html
InformationsquelleAutor der Antwort Sean W.
Obwohl diese Frage ist alt und beantwortet, ich habe stolperte über ein problem mit einigen Lösungen und beschlossen, meinen Vorschlag in die Mischung.
Das problem mit den Lösungen ist, dass Sie bauen einen single-Befehl string aus. Dies schafft Probleme, wenn einige Parameter, die Leerzeichen enthalten, insbesondere java.home.
Beispielsweise auf windows, die Linie
Zurückkehren könnte so etwas wie dieses:
C:\Program Files\Java\jre7\bin\java
Dieser string muss gewickelt werden in Anführungszeichen oder Escapezeichen wegen der Platzverhältnisse in
Program Files
. Kein großes problem, aber etwas nervig und fehleranfällig, vor allem in cross-Plattform-Anwendungen.Daher meine Lösung baut der Befehl als array Befehle:
InformationsquelleAutor der Antwort Malt
Recherchiere ich das Thema selber kam in dieser Frage.
Unabhängig von der Tatsache, dass die Antwort bereits akzeptiert, würde ich noch gerne eine alternative bieten Ansatz für die Vollständigkeit. Speziell, Apache Ant diente als eine sehr flexible Lösung.
Grundsätzlich, alles läuft darauf hinaus, ein Ant-script-Datei mit einem einzigen Java-Ausführung einer Aufgabe (siehe hier und hier) aufgerufen von Java-code (siehe hier). Dieser Java-code, der eine Methode startenkönnte ein Teil der Anwendung muss neu gestartet werden. Benötigt die Anwendung eine Abhängigkeit vom Apache-Ant-Bibliothek (jar).
Wenn die Anwendung neu gestartet werden muss, sollte es Methode starten und beenden der VM. Die Ant java task sollte Optionen Gabel und spawn auf true gesetzt.
Hier ist ein Beispiel für ein Ant-Skript:
Den code für die starten Methode kann wie folgt Aussehen:
}
Eine sehr bequeme Sache hier ist, dass das gleiche Skript ist für die erstmalige Anwendung start-up sowie für den Neustart.
InformationsquelleAutor der Antwort 01es
Windows
/min start-Skript im minimierten Fenster
^& zu schließen cmd-Fenster nach beenden
einer Probe cmd script könnte
sleep 10 schlafen für 10 Sekunden
InformationsquelleAutor der Antwort Amr Lotfy
Nur das hinzufügen von Informationen, die nicht in den anderen Antworten.
Wenn procfs
/proc/self/cmdline
erhältlichWenn Sie in einer Umgebung ausgeführt, die bietet procfs und hat daher die
/proc
Dateisystem verfügbar ist (was bedeutet, dies ist keine portable Lösung), können Sie Java read/proc/self/cmdline
um neu zu starten, so wie hier:Auf Systemen mit
/proc/self/cmdline
zur Verfügung, das ist wohl die eleganteste Art und Weise, wie "neu" die aktuelle Java-Prozess von Java. Kein JNI eingebunden sind, und keine raten, Wege und Sachen erforderlich.Vielen UNIX-Systemen, einschließlich GNU/Linux (einschließlich Android) haben heute procfs Jedoch auf einige wie FreeBSD, es ist veraltet und ein Auslaufmodell. Mac OS X ist eine Ausnahme in dem Sinne, dass es nicht procfs. Windows auch nicht procfs. Cygwin hat procfs aber es ist unsichtbar für Java, weil es nur sichtbar für Anwendungen, die mit der Cygwin-DLLs anstelle von Windows-system fordert, und Java ist nicht bewusst, Cygwin.
Vergessen Sie nicht, verwenden
ProcessBuilder.inheritIO()
Die Standardeinstellung ist, dass
stdin
/stdout
/stderr
(in Java genanntSystem.in
/System.out
/System.err
) des gestarteten Prozesses werden festgelegt, um Rohre die es erlauben, den derzeit Laufenden Prozess für die Kommunikation mit dem neu gestarteten Prozesses. Wenn Sie möchten, starten Sie den aktuellen Prozess, das ist die meisten wahrscheinlich nicht, was Sie wollen. Stattdessen würden Sie wollen, dassstdin
/stdout
/stderr
sind die gleichen wie in der aktuellen VM. Dies wird als geerbt. Sie können dies tun, durch aufrufeninheritIO()
IhrerProcessBuilder
Instanz.Falle auf Windows
Einen häufigen Anwendungsfall einer
restart()
Funktion ist, die Anwendung neu zu starten nach einem update. Das Letzte mal habe ich versucht, dieses unter Windows war dies problematisch. Wenn überschrieb die Anwendung.jar
Datei mit der neuen version wird die Anwendung gestartet wird, sich schlecht zu benehmen und gibt Ausnahmen, über die.jar
- Datei. Ich bin einfach nur sagen, in diesem Fall ist Ihre Verwendung. Ich habe damals das Problem gelöst, indem er die Anwendung in einer batch-Datei und mit einem Magie-Wert zurückgeben vonSystem.exit()
dass ich abgefragt in der batch-Datei hatte und die batch-Datei starten Sie die Anwendung neu statt.InformationsquelleAutor der Antwort Christian Hujer
Alte Frage und all das. Aber dies ist noch ein weiterer Weg bietet einige Vorteile.
Unter Windows, Sie könnten Fragen Sie den task-scheduler zum starten wieder Ihre app für Sie. Dies hat den Vorteil, wartet eine bestimmte Zeit, bevor Sie die app neu gestartet wird. Sie können gehen, um den task-manager und löschen Sie die Aufgabe und er beendet die Wiederholung.
InformationsquelleAutor der Antwort Dale
Ähnlich wie Yoda ' s ' verbessert " Antwort, aber mit weiteren Verbesserungen (sowohl funktionalen, Lesbarkeit und Testbarkeit). Es ist jetzt sicher zu führen, und Neustarts, wie so oft, wie die Menge von Programm-Argumenten.
JAVA_TOOL_OPTIONS
Optionen.V1.1 Bugfix: null-Zeiger, wenn JAVA_TOOL_OPTIONS ist nicht festgelegt
Beispiel:
InformationsquelleAutor der Antwort Mark Jeronimus
Ich denke das Sie nicht wirklich wollen, um die Anwendung zu beenden, sondern auf "neu Starten". Für Sie könnte verwenden Sie diese und fügen Sie Ihre "Reset" - vor dem schlafen und nach dem unsichtbaren Fenster.
InformationsquelleAutor der Antwort NBStudios