Java-Programm soll sich selbst neu starten

A

Ahnenforscher

Jungspund
Hallo,

ich habe ein Java-Programm geschrieben, das einige, vom Benutzer eingestellte Optionen, erst beim nächsten Programmstart übernehmen kann. Nun möchte ich in diesem Fall den Benutzer fragen, ob er das Programm neu starten möchte, und falls er bejaht, soll sich die Java-Applikation (ein .jar-Archiv) beenden und selbst neu aufrufen. Nun ist mir klar, dass ich das Programm nicht zuerst beenden und dann neu aufrufen kann, da der Interpreter gar nicht mehr soweit kommt (nach dem System.exit()-Befehl ist ja Schluss). Gibt es trotzdem eine Möglichkeit, das irgendwie zu implementieren, ohne auf ein weiteres Programm auszuweichen?
 
Zuletzt bearbeitet:
Auf die schnelle würd ich jetzt vorschlagen, das du am Ende erst das Programm neu startest (oder ein Script aufrufst, das das erledigt) und direkt danach das alte beendest?
 
daboss wird es da nicht zu einem ressourcen konflikt kommen ? ...
also ich denke mal schon ... das mit dem skript würde ich auch so machen, allerdings würde ich dem skript noch mitgeben die PID und abfragen ob das programm beendet ist und dann erst neu starten
 
Nicht umbedingt, oder? (Passieren kann es schon, klar, aber...)

Man kann ja auch so das ("ein") Programm fünf mal starten. Kommt halt darauf an. Aber wie gesagt, war ja auch nur ne schnelle Idee...

(Andere, bei google gefundene Ideen wären, zBsp., das Fenster disposen und noch mal die main() Aufrufen... aber davon halt ich noch viel weniger...)
 
Zuletzt bearbeitet:
aber so wie ich dich verstanden habe, geht es auch darum informationen zu speichern, was du eingestellt hast in dem programm ... was das sein mag lass mal dahin gestellt sein. Wenn du nun 3 mal das gleiche Programm offen hast, das auf die selbe Config datei zugreift, und du änderst in dem einen Prozess was ... hast du schon deinen Konflikt
 
Hallo,

ich habe ein Java-Programm geschrieben, das einige, vom Benutzer eingestellte Optionen, erst beim nächsten Programmstart übernehmen kann. Nun möchte ich in diesem Fall den Benutzer fragen, ob er das Programm neu starten möchte, und falls er bejaht, soll sich die Java-Applikation (ein .jar-Archiv) beenden und selbst neu aufrufen. Nun ist mir klar, dass ich das Programm nicht zuerst beenden und dann neu aufrufen kann, da der Interpreter gar nicht mehr soweit kommt (nach dem System.exit()-Befehl ist ja Schluss). Gibt es trotzdem eine Möglichkeit, das irgendwie zu implementieren, ohne auf ein weiteres Programm auszuweichen?

Liebe Grüße,
Peter

Gibst es einen Grund, die neu eingestellten Optionen nicht direkt zu übernehmen, ohne Neustart ? Übernehmen der Optionen erst nach dem nächsten Start ist so windows-like und imho unnötig, aber vielleicht gibt es ja doch einen triftigen Grund ...

Gruß
 
Hallo zusammen,

vielen Dank für eure Posts. Sorry, dass ich mich erst jetzt melde, aber ich hatte in letzter Zeit etwas Stress. Aber zurück zum Topic:

Wenn schon, dann soll dieser Programm-Neustart ein "richtiger" Neustart sein: Also nicht so, dass nachher 2 oder mehr Instanzen des Programms laufen, auch aus dem Grund, dass das Programm auf EINE Konfigurationsdatei zugreift.

@frickelhase:
Durchaus hast du Recht und mir gefällt das mit dem Programmneustart auch nicht wirklich gut, aber die Situation ist folgende: Die ominösen "Einstellungen", die diesen Neustart brauchen, sind Spracheinstellungen. Das Programm ist eine Java-Applikation mit einer SWT-Benutzeroberfläche und die Sprachvariablen werden beim Programmstart aus der entsprechenden .properties-Datei geladen (für deutsch bspw. resources/languages/de.properties). Dieses Laden erfolgt aber nicht direkt, d. h. die Übersetzungen werden nicht in Variablen gespeichert, sondern es gibt eine Methode, die bei Aufruf einen Parameter mit der Sprachvariable erwartet, und die Übersetzung zurückliefert. So steht beispielsweise in der Programmierung für die Menü-Einträge: menuItem.setText(getLocalization("exit"));
Dies funktioniert beim Programmstart wunderbar, wird jedoch die Sprache zur Laufzeit umgestellt, diese Option soll der User ja haben, gibt es das Problem, wie diese Elemente übersetzt werden sollen. Ich dachte da einen Programmneustart, aber vielleicht hat ja einer von euch noch eine bessere Idee...

Viele Grüße
 
Hallo zusammen,

vielen Dank für eure Posts. Sorry, dass ich mich erst jetzt melde, aber ich hatte in letzter Zeit etwas Stress. Aber zurück zum Topic:

Wenn schon, dann soll dieser Programm-Neustart ein "richtiger" Neustart sein: Also nicht so, dass nachher 2 oder mehr Instanzen des Programms laufen, auch aus dem Grund, dass das Programm auf EINE Konfigurationsdatei zugreift.

@frickelhase:
Durchaus hast du Recht und mir gefällt das mit dem Programmneustart auch nicht wirklich gut, aber die Situation ist folgende: Die ominösen "Einstellungen", die diesen Neustart brauchen, sind Spracheinstellungen. Das Programm ist eine Java-Applikation mit einer SWT-Benutzeroberfläche und die Sprachvariablen werden beim Programmstart aus der entsprechenden .properties-Datei geladen (für deutsch bspw. resources/languages/de.properties). Dieses Laden erfolgt aber nicht direkt, d. h. die Übersetzungen werden nicht in Variablen gespeichert, sondern es gibt eine Methode, die bei Aufruf einen Parameter mit der Sprachvariable erwartet, und die Übersetzung zurückliefert. So steht beispielsweise in der Programmierung für die Menü-Einträge: menuItem.setText(getLocalization("exit"));
Dies funktioniert beim Programmstart wunderbar, wird jedoch die Sprache zur Laufzeit umgestellt, diese Option soll der User ja haben, gibt es das Problem, wie diese Elemente übersetzt werden sollen. Ich dachte da einen Programmneustart, aber vielleicht hat ja einer von euch noch eine bessere Idee...

Viele Grüße

vielleicht verstehe ich jetzt was falsch, aber warum erzeugst du nicht einfach ein neues objekt, von der Klasse in der sich deine main() befindet, mit den neuen, richtigen sprachparametern und löscht alle "alten" objekte?
 
vielleicht verstehe ich jetzt was falsch, aber warum erzeugst du nicht einfach ein neues objekt, von der Klasse in der sich deine main() befindet, mit den neuen, richtigen sprachparametern und löscht alle "alten" objekte?

genau an sowas hab ich auch gedacht, deswegen meine erste Nachfrage: Die von cremi beschrieben Vorgehensweise ist eigentlich so üblich und praktiziert, wobei die "alten" Objekte imho nicht mal gelöscht werden müssen. Ich würde die Objekte neu erzeugen, im Konstruktur die neuen Sprachparameter setzen und gut ... Dies muss nicht mal in der main()-Methode durchgeführt werden.
 
Zuletzt bearbeitet:
Die main-Methode ist statisch. Wenn man vom dazugehörigen Objekt eine neue Instanz anlegt, bringt das nichts.
 
Man legt zur Laufzeit keine Objekte an, sondern nur Instanzen derer. Die Terminologie ist etwas durcheinander. Dennoch muss ich meinen obigen Einwand evtl. zurückziehen. Kann sein, dass ichs auf die Schnelle anders verstanden habe, als es gemeint war.
 
Also direkt aus der statischen Java Main Funktion sein Programm zu schreiben halte ich generell für eine der schlimmsten Sachen die man tun kann, und ich hoffe du hast das nicht getan :p.

Eben dann kann man solche restarts fast ganz vergessen. Ich würde das ganze über's threading lösen, einfach eine Instanz des Objekts aufmachen und alle paar Sekunden auf verfügbarkeit testen (Java hat glaube ich noch kein onexit für swt forms), sollte das Objekt nicht mehr vorhanden sein: reinitialisieren und dabei die Sprachdatei neu laden.

Das ganze könntest du natürlich auch mit zwei Objekten lösen die sich untereinander kennen und bei Absurz gegenseitig neu initialisieren. Das Muster hab ich mal bei einem Internetcafe' verwendet, sobald der Nutzer es schafft eine Instanz zu killen, lädt er einfach eine neue aus der noch laufenden im Hintergrund.

Sollte nix davon dich ansprechen: Ich hab noch nie mit Forms unter Java gearbeitet, aber ich bin mir sicher das es da ne reload Funktion gibt.
 

Ähnliche Themen

fußballstatistik auswerten

Vorlesung zum Thema Sicherheit in Java (als Prüfungsvorleistung)

Segmentation Fault bei strcat?

Gespenstisch-Systeme starten nicht

Eigenen kernel für Suse Linux 10.2 Bauen

Zurück
Oben