Implementierung Programmneustart

sheldon2.0

Mitglied
Hallo,

ich habe ein kleines Problem mit meinem Programm.
Es ist ein Spiel, dass zum Teil aus Singletons besteht.
Ich wollte gerade die Funktion "Neues Spiel" einbauen.

Habe in manchen Foren gelesen, dass sie dort vorschlagen, es mit dem ProcessBuilder zu versuchen. Von da aus ein Skript starten, welches anschließend die jar-Datei des Programms startet.

Nun, für Unix-Systeme habe ich das implementiert und alles läuft wie gewünscht. Der ProcessBuilder startet das Skript (welches ein paar Sekunden wartet und danach die jar-Datei aufruft) ... das aktuelle Programm wird mit System.exit beendet.

Nun habe ich ein batch Skript für Windows Systeme geschrieben und den ProcessBuilder lasse ich das batch Skript starten. Allerdings passiert nichts. Das Programm wird korrekt beendet. Jedoch wird das Programm nicht neugestartet. Wenn ich das Skript aus dem Terminal starte oder direkt aus dem Explorer, dann wird das Programm ganz korrekt neugestartet.

Irgendwie weiß ich nicht, wo das Problem liegt. Habt ihr eine Idee, warum das so nicht funktioniert?

Wäre euch sehr dankbar.
 
klappt es wenn du das erste Progamm nicht beendest?
bringt javaw statt java einen Unterschied?

allgemein sollte es doch wohl möglich sein, im eigenen Programm nochmal von vorne anfangen,
hast du dazu bestimmte Hindernisse, die vielleicht ausräumbar sind, oder interessiert dich diese Möglichkeit hier nicht?
 
hab mal gerade das System.exit(0) rausgenommen .... nun funktionierts ....

meine Hindernisse sind die Singletons ... die kann man ja schlecht zurücksetzen oder?
 
Na doch, mußt Du nur entsprechend implementieren/designen. Ich würde so etwas wie eine reset-Methode entwickeln, mit der sich das Spiel auf den Anfangszustand zurücksetzen läßt. Neustart halte ich persönlich für eine Designschwäche des jeweiligen Programms.
 
hat jemand einen Vorschlag wie ich nun das aktuelle Programm beenden könnte?
Ich möchte ja keine zwei Programme laufen haben.

Nach dem ProcessBuilder ein System.exit() bewirkt, dass das neue Programm nicht gestartet wird.
 
ich könnte es etwas umständlich selber testen oder auch besser merken, aber für dich nun wirklich leicht:
javaw statt java versucht?
immer ruhig komplette Antworten geben wenn mehrere Vorschläge aufgelistet sind
 
javaw oder java bringt keinen unterschied ... funktioniert beides ...

problem ist nur noch das mit system.exit()

Da ich leider nicht mehr viel Zeit habe, da ich es bald abgeben muss, kann ich das mit dem reset nicht mehr implementieren ... das Programm ist dafür zu umfangreich.
 
How to cancel a System.Exit and Restart the application in Java - Stack Overflow

enthält eine Idee, einen allgemeinen Launcher zu verwenden, der selber nicht beendet wird bevor es nicht wirklich zu Ende ist,
und das eigentliche Programm startet, am Anfang und später vielleicht erneut,
dazu müsste er von den Unterprogrammen informiert werden ob es weiter gehen soll oder Ende, vielleicht über Rückgabewert von System.exit(),
das müssten die Unterprogramme, die eigentlichen Programme wohl in jedem Fall aufrufen, um sich richtig zu beenden?
die spannende Frage ist, ob ein System.exit() im Unterprogramm das Hauptprogramm möglicherweise nicht beeinträchtigt statt andersum,

auch dazu habe ich mal wieder keine Kenntnisse oder zumindest nicht Erinnerungen, habe dann aber mal getestet,
mit einem Miniprogramm bei mir nach
java - ProcessBuilder - Start another process / JVM - HowTo? - Stack Overflow
lief der Aufrufer weiter,
allerdings wurde ein System.exit() im Aufrufer auch blockiert solange das Unterprogramm ein JOptionPane offen hatte,
vielleicht keine allgemeingültigen Ergebnisse..
 
Klingt ehrlich gesagt komisch.
Wenn du via ProcessBuilder ein externes Skript startest welches selbsat via java-Befehl dein Programm nochmal startet, so solltest du die erste Instanz deines Programms beenden können.
Liegt zwischen dem
Code:
ProcessBuilder.execute()
(oder heißt es
Code:
run()
?) und dem
Code:
System.exit()
vielleicht zu wenig zeit? Ggfs. braucht Windows ein paar (Milli)Sekunden. Ich würde also mal mit
Code:
Thread.sleep()
arbeiten.
 
aktueller stand:

der jvm launcher zeigte mir "unable to access jar file" ...
habe nun auch sleep eingebaut und anschließend einen Absoluten Pfadnamen zur jar-File im Skript gesetzt.

nun funktioniert auch .... aber ich möchte keinen absoluten pfadnamen benutzen ... das soll auf jedem rechner laufen ... egal von welchem verzeichnis man das startet .... man unter linux ist das so einfach ...
 
Okay es läuft nun so wie gewünscht ...

Das Problem war, das Skript war in einem Unterverzeichnis ...
zum Starten der jar-Datei die in dem Überverzeichnis der Skriptdatei liegt habe ich ../file.jar gemacht ...

da aber das Arbeitsverzeichnis der jar-datei verwendet wird, reicht wohl einfach wenn man in dem skript
javaw -jar file.jar eingibt, als ob es im selben verzeichnis liegt.
 

Zurück
Oben