Update eines Programms - Beenden eines anderen Prozesses überwachen

Tharsonius

Bekanntes Mitglied
Hallo zusammen,

Ich habe ein Java Programm was als Standalone auf einem PC läuft (kein Applet, kein Browser). Das programm liegt als .jar vor und wird ganz normal ausgeführt.
Neben dem Programm liegen in verschiedenen Ordnern diverse Bilder und Bibliotheken, die ich für das Programm brauche und die ich zur Laufzeit bei Bedarf lade.

Außerdem habe ich eine Datenbank, mit der ich arbeite. In dieser Datenbank ist die aktuelle Versionsnummer hinterlegt, die das Programm auch abfragt. Passt diese nicht mehr mit der eigenen Version überein, so wird derzeit eine Meldung ausgegeben und das Programm beendet sich dann. Bisher muss ich das Programm dann manuell updaten. Dies ist aber aufgrund der mittlerweile anwachsenden Menge an PCs etwas arg unpraktisch geworden.

Daher möchte ich nun eine automatische Update Routine für dieses Programm erstellen. Dieses Update soll in der Lage sein einerseits die Bibliotheken und Bilder, als auch das Programm selber auszutauschen.

Dateien aus der Datenbank zu holen ist gar kein Problem, das klappt auch alles.


Ich habe mir das so überlegt:
1. Mein Programm startet und überprüft die Version, so wie bisher auch.
2. Wenn ein Update nötig ist, dann wird ein Updater gestartet. Dies soll ein zweites kleines Programm sein, was ich gerade schreibe. Das Programm beendet sich dann natürlich.
3. Der Updater zieht nun die Daten aus der Datanbank und legt diese dahin, wo sie hin sollen. Auszutauschende Bilder, Bibliotheken etc werden dabei ersetzt.
4. Nach dem Update startet der Updater wieder mein Programm.



Mein Problem ist nun, wie kann ich im Updater überwachen, dass mein Programm beendet ist?
Ich kann das Programm ja nur austauschen, wenn es nicht läuft, ansonsten erhalte ich ja keinen zugriff auf das .jar File. Da sperrt sich Windows.
Da der Updater auch in einem separaten Prozess läuft kann ich auch nicht wirklich davon ausgehen, dass er sich schon rechtzeitig beendet. Daher würde ich gerne den Prozess irgendwie überwachen. Irgendwie stehe ich da aber auf dem Schlauch. Hat jemand eine Idee?
 

Tharsonius

Bekanntes Mitglied
Ich habe lokal keine Virtuelle Maschine installiert. Ich starte meine Anwendung mittels batch Datei, die VM liegt daneben.
Kann ich da Web Start überhaupt ausführen?

Desweiteren habe ich keinen Server Speicherplatz zur Verfügung sondern lediglich die Datenbank.

Fragt nicht wieso, unser Admin ist seltsam... Hab da schon wochenlange Diskussionen hinter mir...
 

Tharsonius

Bekanntes Mitglied
Ich hab mir da gerade was anderes überlegt, werde das ganze wohl über einen Launcher machen, den ich vorweg starte, der dann das Update macht und anschließend das eigentliche Programm startet.

Wenn ich mittels Runtime.getRuntime.exec(...) mein Programm starte bekomme ich ja den Prozess zurück.
Weiß jemand, was passiert, wenn der Prozess sich beendet? Wird der dann zu null, so dass ich im Launcher ein while(prozess != null) schreiben kann, um auf das Ende zu warten?

Oder kann ich das ganze durch irgend einen Listener mitbekommen?

Ich muss im Launcher halt wissen wann das Update durch ist, damit ich dann das Programm selber starten kann...
 

FArt

Top Contributor
Ich hab mir da gerade was anderes überlegt, werde das ganze wohl über einen Launcher machen, den ich vorweg starte, der dann das Update macht und anschließend das eigentliche Programm startet.

Wenn ich mittels Runtime.getRuntime.exec(...) mein Programm starte bekomme ich ja den Prozess zurück.
Weiß jemand, was passiert, wenn der Prozess sich beendet? Wird der dann zu null, so dass ich im Launcher ein while(prozess != null) schreiben kann, um auf das Ende zu warten?

Oder kann ich das ganze durch irgend einen Listener mitbekommen?

Ich muss im Launcher halt wissen wann das Update durch ist, damit ich dann das Programm selber starten kann...

Ja, das funktioniert... mit Einschränkungen. Du kannst natürlich die Ressourcen, die für dein Bootstrapping nötig sind (JRE und Launcher) nicht so einfach austauschen, da hast du wieder das Problem.

Tipp(auch wenn er schon mal kam): mach es mit Webstart!!!!
 
D

despikyxd

Gast
der ansatz mit launcher ist richtig ... aber warum willst du aus dem launcher herraus einen neuen prozess starten ? ...
so lange du im launcher nicht explizit das upzudatene jar lockst *z.b. durch n URLClassLoader* kannst du damit machen was du willst ...
packe also einfach die update-funktion in den launcher ... und lade die neuen daten runter BEVOR du das auszuführende über n URLClassLoader läds *und damit lockst* und dann die main startest ...
den schwachsinn mit einzelnen prozessen ist zu umständlich ...

*tipp : in java 7 kann man auf einen URLClassLoader auch close() anwenden um die gelockten jar's wieder freizugeben ...*

@FArt
auch wenn TO es schonmal gesagt hat : er hat kein JRE installiert ... womit WebStart nicht funktioniert
 

FArt

Top Contributor
@FArt
auch wenn TO es schonmal gesagt hat : er hat kein JRE installiert ... womit WebStart nicht funktioniert

Aber das ist eine Anforderung, die man m.E. in Frage stellen sollte. Eine Runtime kann jeder installieren. In einem Unternehmen können das die Admins sogar automatisieren bzw. werden die Clients gerne aus einem Image installiert. Somit ist das oft kein Problem. Der Ablauf danach wäre konsistent, gegenüber dem Aufwand, den ich mit pure Java treiben muss, vor allem wenn ich die Runtime noch mit warten muss.

Der "Gut-Fall" ist relativ einfach. Aber geh mal konsistent mit Fehlern um... Schreibrechte auf der Platte (gerade unter Windows ist mal wieder eine Datei gesperrt, weil ein Explorer offen ist usw.). Da kriegt man graue Haare mit und das wird ein Wartungsdesaster, außer man regelt das grundsätzlich nicht selber sondern mit einer Installersoftware.
 

Tharsonius

Bekanntes Mitglied
Aber das ist eine Anforderung, die man m.E. in Frage stellen sollte.

Das habe ich bereits alles hinter mir. Ich habe mit unserem Admin bereits tagelange Diskussionen geführt.
Er ist Millionenprozentig davon überzeugt, dass Java das ganze Netzwerk unsicher macht. Deswegen wird hier in der ganzen Firma definitiv niemals ein Java installiert.

Ich weiss er ist ein Idiot, ich hab mir den Mund fusselig geredet, aber solange ich ihm nicht einen wissenschaftlichen Beweis geben kann, weigert er sich. Ich habe schlichtweg keine Lust mehr mit dem Vollpfosten zu diskutieren. Also habe ich eine VM daneben gelegt und starte mein Programm mittels Batch Datei aus dem Ordner.

Weiterhin bekomme ich keinen Serverplatz zur Verfügung. Ich kann zwar ein gemeinsames Laufwerk nutzen was von überall zugänglich ist, das wird aber per Skript einmal die Woche geleert...

Ich habe schlichtweg einfach keine Lust auf noch mehr Diskussion. Daher habe ich mir hier was anderes gebastelt, was zumindest noch solange halten muss wie ich in der Firma bin.

Aus diesem Grund ist Web Start leider nicht möglich, auch wenn das vieles so einfach machen würde. *schnief*



Na ja, ich habe jetzt einen Launcher zusammen gestrickt, der folgendermaßen vor geht.
1. Programm starten. (Programm beendet mit exit code 1 wenn Update nötig ist, sonst mit 0)
2. Warten auf Prozessende... 0 = Launcher beenden, 1 Update starten
3. Update Starten, ist nen separates Programm, was ich geschrieben habe. Dieses schaufelt die Files aus der Datenbank auf die Platte.
4. Wenn Update beendet ist, Patcher starten. Dieser kopiert die Dateien an die korrekte Stelle.
5. Programm normal starten
6. Launcher beenden.


Warum verschiedene Prozesse:
Für den Datenbank Zugriff brauche ich eine Bibliothek. Diese kann ich nur tauschen, wenn auf diese nicht zugegriffen wird. Daher habe ich den Updater, der die Daten rüber schaufelt und den Patcher, der die dann austauscht. Ich könnte den Updater im Launcher unterbringen, das ist richtig, wollte das aber gerne getrennt haben.


Ach, hier noch mal ein Programmschnippsel aus dem Launcher, wie ich das starten der Programme und das Warten auf das Beenden der Prozesse gebaut habe.

Java:
		Process prozess = null;
		try
		{
			prozess = Runtime.getRuntime().exec("./vm/bin/javaw -jar ./bin/Programm.jar");
		}
		catch(IOException e)
		{
                        // Fehler ausgeben
			System.exit(0);
		}
		if(prozess == null)
		{
                        // Fehler ausgeben
			System.exit(0);
		}
		boolean wait;
		wait = true;
		int wert = 0;
		while(wait)
		{
			try
			{
				wert = prozess.exitValue();
				wait = false;
			}
			catch(IllegalThreadStateException e)
			{
				// Nichts tun
			}
		}
		if(wert == 1)
		{
                 //hier passiert das Update
                }
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Java 8 Security Update Allgemeine Java-Themen 3
krgewb Darstellung bei Java-Update Allgemeine Java-Themen 8
VfL_Freak Große und seltsame Probleme nach Java-Update auf V1.8.0_91 Allgemeine Java-Themen 3
B Umgebungsvariable Anpassen der Umgebungsvariablen nach Java-Update ? Allgemeine Java-Themen 14
S Java-Webstart und Update-Checks Allgemeine Java-Themen 0
A Update Software programmieren Allgemeine Java-Themen 1
T Nach Java Update: Jar Datein öffnen sich nicht mehr mit doppelklick Allgemeine Java-Themen 3
G JavaFX Problem nach Update auf Java 8 Allgemeine Java-Themen 0
E Java 7 update 51 Allgemeine Java-Themen 9
H SHA256 update-Funktion Allgemeine Java-Themen 3
F.S.WhiTeY JDK installieren Linux: Nach Update link auf Java zerschossen Allgemeine Java-Themen 4
eskimo328 Swing Client Anwendung für MAC OS (Update Routine) Allgemeine Java-Themen 6
L Launche update Allgemeine Java-Themen 19
D Update von TimerTask Allgemeine Java-Themen 13
X Update einer Jar während der Laufzeit Allgemeine Java-Themen 8
J Eigenes Produkt Upgrade / Update-fähig halten? Allgemeine Java-Themen 16
S iText PDF - Verständnisproblem beim Update von TableCells (Seitenzahlen) Allgemeine Java-Themen 2
D Updaten von Klassen durch jar.exe zerstört diese. Update durch WinRAR gelingt! Allgemeine Java-Themen 2
D Java Update automatisieren Allgemeine Java-Themen 4
H SQL Update "Rückgabe der DB als String?" Allgemeine Java-Themen 7
X HTTP Problem mit static/non static JTextArea Update Allgemeine Java-Themen 17
S eigene Update Funktion Allgemeine Java-Themen 5
martin82 Java Runtime Update >17 - SwingWorker Änderungen? Allgemeine Java-Themen 7
M jdesktop binding: jTable update nach Änderung... Allgemeine Java-Themen 3
B Regex-Fehler nach lib-Update Allgemeine Java-Themen 2
H Probleme! Mac Os und Java Update Allgemeine Java-Themen 3
R JAR-Update in laufender Applikation Allgemeine Java-Themen 9
A Hilfe mit 2-dimensionalem array ***UPDATE*** Allgemeine Java-Themen 27
Kr0e JCE doFinal/update Allgemeine Java-Themen 2
MQue update/paint Allgemeine Java-Themen 7
L Java6 update N bekommt neues Browser-Plugin, bitte testen. Allgemeine Java-Themen 7
O App Update Allgemeine Java-Themen 3
T NullPointerException nach Java Update Allgemeine Java-Themen 4
V Update des JAR-Archivs Allgemeine Java-Themen 5
M Update auf netbeans 6Beta 1 Allgemeine Java-Themen 2
U Programm soll sich nach update neustarten Allgemeine Java-Themen 30
M Tool zum autom. Client-Update Allgemeine Java-Themen 2
C Java SE Runtime 6 Update 1 - IE 7 und FF 2.0 - Allgemeine Java-Themen 6
M Frage zu update Methode von Observer! Allgemeine Java-Themen 40
K Regex Versucher 2 *Update - sinnvoll und schön* :) Allgemeine Java-Themen 6
T update() wird bei Programmstart und resize nicht gemacht Allgemeine Java-Themen 4
R Browser-Problem nach Java-Update Allgemeine Java-Themen 9
B statusbar update -> mit thread oder listener? Allgemeine Java-Themen 7
D wie update-erinnerung der jre deaktivieren? Allgemeine Java-Themen 6
D repaint oder update Methode? Allgemeine Java-Themen 6
O regulärer Ausdruck zum durchsuchen eines Strings verwenden Allgemeine Java-Themen 2
T Rotationswinkel eines Bildes bestimmen Allgemeine Java-Themen 4
C Probleme beim Erstellen eines runnable-jar files Allgemeine Java-Themen 1
J JavaScript innerhalb eines Java Projekts ausführen Allgemeine Java-Themen 2
Encera Größe eines Objektes in Byte berechnen Allgemeine Java-Themen 2
8u3631984 Prüfen ob min. ein Element eines Sets in einem anderen Set enh Allgemeine Java-Themen 4
M Array Rang eines Elements Allgemeine Java-Themen 4
OnDemand Teile eines Links entfernen Allgemeine Java-Themen 6
H Auslesen eines (LDAP-)Attributs in Active Directory Allgemeine Java-Themen 2
W JSON parsen eines ,mit JS.stringify erstellten Strings Allgemeine Java-Themen 27
H Textposition eines gedrehten Textes verschieben Allgemeine Java-Themen 8
berserkerdq2 run-methode eines Threads so programmieren, dass 30x die Sekunde etwas ausgeführt wird. Allgemeine Java-Themen 44
E Ersetzen eines Bildes in der Kopfzeile eines Word-Docx-Dokuments mit Apache POI XWPF Allgemeine Java-Themen 0
N Fahrtrichtung eines selbstfahrenden Auto ändern Allgemeine Java-Themen 3
T Letztes Zeichen eines Strings enfernen Allgemeine Java-Themen 14
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
gotzi242 Schatzsuche mithilfe eines O(log n) Algorithmus Allgemeine Java-Themen 2
C Koordinaten LONG/LAT eines neuen Punktes in bestimmter Entfernen und Winkel berechnen Allgemeine Java-Themen 3
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
LimDul Direktes return eines Array geht nicht Allgemeine Java-Themen 20
S Mittelwert anhand eines Stream berechnen Allgemeine Java-Themen 5
kodela Breite eines erweiterten Monitors feststellen Allgemeine Java-Themen 5
R Zeilen eines 2d Arrays abwechselnd links und rechts mit Nullen auffüllen Allgemeine Java-Themen 14
Zrebna Alternative Darstellung eines Codesnippets Allgemeine Java-Themen 33
kodela Inhalt eines Arrays ändert sich mysteriös Allgemeine Java-Themen 2
bueseb84 Wget mit Wildcards - oder wie lädt man bei JFrog die letzte Version eines Artifacts herunter Allgemeine Java-Themen 3
N Erkennen eines Programs Allgemeine Java-Themen 2
N Pausieren eines Programmes Allgemeine Java-Themen 4
D Input/Output Implementierung eines CommandHandlers/Parsers für viele Eingaben Allgemeine Java-Themen 26
M Gibt es eine API die den aktuellen Wert eines Indikators beim Trading zurückgibt? Allgemeine Java-Themen 7
F Wie bekommt man alle Filenamen eines Webserver Verzeichnisses Allgemeine Java-Themen 6
A Fehler beim Öffnen eines Projekts Allgemeine Java-Themen 6
N Eigenschaften eines Buttons per Setter verändern Allgemeine Java-Themen 5
S Ausfuehrung eines Programms aufzeichnen..? Allgemeine Java-Themen 4
X Ermittlung eines doppelte Paars mit Streams Allgemeine Java-Themen 50
Stonie Prüfen von direkter Implementierung eines Interfaces Allgemeine Java-Themen 7
S Vorbereitung eines Praktikums Allgemeine Java-Themen 4
H Aufruf eines Web Service anhand übergebenen Parameter Allgemeine Java-Themen 2
M Weiterleiten von empfangenen Nachrichten eines StompSessionHandlers Allgemeine Java-Themen 1
J Programm zum Suchen eines Wortes im Dateisystem Allgemeine Java-Themen 4
H Rename eines Projekts Allgemeine Java-Themen 1
J Fenstergröße eines anderen Programmes auslesen Allgemeine Java-Themen 9
ReinerCoder auf Klassen innerhalb eines package zugreifen Allgemeine Java-Themen 22
Meeresgott Erste Schritte Sourcetree - Git | Suchen eines Commits Allgemeine Java-Themen 2
E Status eines USB Mikrofon abfragen Allgemeine Java-Themen 2
DaCrazyJavaExpert OOP Ansätze und Tipps zum Porgrammieren eines Taschenrechners Allgemeine Java-Themen 25
A OOP Problem beim Berechnen der größten Fläche eines Ringes Allgemeine Java-Themen 19
JavaNewbie2.0 Start eines Anderen Programm erkennen Allgemeine Java-Themen 6
I Verbindung eines Java-Plugins mit Webserver Allgemeine Java-Themen 3
L Auswertung eines Testes funktioniert nicht Allgemeine Java-Themen 37
G Iteratoren - Wie kann man mithilfe von Iteratoren nur jeden zweiten Wert eines TreeSets ausgeben? Allgemeine Java-Themen 4
GreenTeaYT Elemente eines 2Dim LinkedList von links nach rechts ausgeben? Allgemeine Java-Themen 0
B Spalten eines 2d-Arrays Allgemeine Java-Themen 2
M Rechenprogramm eines wissenschaftlichen Taschenrechners Allgemeine Java-Themen 4
S Eigenschaften (hier Verknüpfung) eines Files lesen Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben