Eigener Updatemechanismus

Kr0e

Gesperrter Benutzer
Hallo Zusammen,

ich will meinem Spiel gern eine Updatefunktion bescheren. Ich weiß, dass ich WebStart benutzen könnte, würde das ganze aber gern im Spiel selber machen und nicht vorher ein unschön gestaltetes Fenster angezeigt bekommen (Webstart). Ich will auch kein OSGI oder so nutzen, da es einfach zu viel Arbeit wäre, mein Programm umzukrempeln. Außerdem denke ich, dass das garnicht nötig sein sollte...

Meine Frage:

Wie kann ich eine Jar-Datei updaten, die gerade ausgeführt wird ? Es muss iwie gehen, denn MineCraft z.B. öffnet sich auch erst, überprüft dann, ob es Updates gibt und wenn ja, werden diese geladen. Das Programm muss dafür nicht geschlossen werden.

Aber die ausführende Jar-Datei ist ja gesperrt durch die JVM. Wie wird sowas erledigt ? Außerdem vermute ich mal, dass das ersetzen der Jar-Datei nicht umbedingt einen Einfluss auf das ausführende Prorgamm hat, kann ja sein, dass viele Klassen schon in die JVM geladen wurden und ab dann gecached werden...

Habt ihr vlt. mit sowas Erfahrung ? Oder vlt. Ideen, wie swoas grundsätzlich erledigt werden kann ?

Versionsabgleich etc ist kein Problem: Ich berechne die Checksum aller relevanten Dateien und fordere nur neue Dateien an.

Gruß,

Chris
 

truesoul

Top Contributor
Hi Kr0e.

Also ich habe zur Zeit auch ein Projekt wo ich ein Updater gebaut habe. Dies tue ich mit einer extra jar( in meinem Fall exe ) datei die für das Update dann zuständig ist.
Also Hauptprogramm überprüft ob Update vorhanden ist, wenn ja starte ich die updater.jar (beende aber das Hauptprogramm)... Die führt dann das update durch ( neue Dateien installieren, nicht benötigte Dateien entfernen und alles was dazu gehört ) und im Anschluss starte ich dann das Hauptprogramm wieder. Wobei es bei mir auch möglich ist das der Updater sich selbst aktuallisiert.
Das geht auch ohne Probleme ohne das die JVM sperrt.

Dazu muss ich aber sagen, das ich die alten Dateien mit den neuen Dateien ersetze.
Meine Anwendung habe ich aber auch nur für Windows konzipiert ( jar gewrappt als exe ).
 

Kr0e

Gesperrter Benutzer
Hallo!

Danke erstmal für deine rasche Antwort!

Wie aktualisierst du den Updater ? Durch das Hauptprogramm ? Quasi wie so eine Art Wechselwirkung^^ Das Hauptprogramm updated den Updater und der Updater updated das Hauptprogramm ?
 

truesoul

Top Contributor
Das Hauptprogramm updated den Updater und der Updater updated das Hauptprogramm ?
Das wäre eine Möglichkeit.

Bei mir allerdings aktuallisiert der updater sich selbst. Das funktioniert bei mir im Prinzip so, das erstmal alle neuen updates für das Programm geladen werden. Dann wird ein Backup erstellt, und im Anschluss überschreibe ich die alten Dateien mit den neuen. Und die Updater.exe (oder .jar) ersetzt sich als letztes ... und den rest kennst du ja schon.

kann ja sein, dass viele Klassen schon in die JVM geladen wurden und ab dann gecached werden...
Mit deiner Vermutung liegst du eigentlich ganz richtig.
Während die Anwendung(Updater) ausgeführt wird kann man also die alte Updater.jar(.exe) mit der neuen Update.jar(.exe) ersetzen.

mfg
 

Kr0e

Gesperrter Benutzer
Ok, danke!

Natürlich wird das Update für den Updater dann erst beim nächsten Update angewandt... Nagut, danke!

Vlt noch eine Frage: Wäre es ggf möglich, den momentanen ClassLoader anzuweisen, den Cache zu löschen ? Damit danach neuerstelle Klassen aus der neuen Jar erstellt werden ?


Eins noch zum Thema JVM blockt die jar...

Unter Windows7 kann ich die Jar nicht löschen, da sie gerade in Gebrauch ist...
 

truesoul

Top Contributor
Ja löschen würde da nicht funktionieren. Das ersetzen funktioniert allerdings. Aber das kann bestimmt die andere jar dann erledigen.

Vlt noch eine Frage: Wäre es ggf möglich, den momentanen ClassLoader anzuweisen, den Cache zu löschen ? Damit danach neuerstelle Klassen aus der neuen Jar erstellt werden ?
Soweit ich weiß, ist das garnicht möglich. Aber 100% sicher bin ich mir da nicht.
 

mjdv

Bekanntes Mitglied
In der Theorie ist sowas eigentlich gar nicht so schwer. Schau dir mal das hier an: JUpdater - Wikipedia, the free encyclopedia

Der wird zwar seit 4 Jahren nicht mehr weiterentwickelt, aber man kann sich dort sicherlich noch ein wenig Know How abschauen. JUpdater kann sogar die Dateien innerhalb des Jars updaten

Du kannst dir auch mal JDownloader ansehen, die haben auch einen interessanten Mechanismus. Dort werden die Class Dateien einfach auf nen Server gepackt, und der Client vergleicht die Hashes der Dateien.

Bei beiden Projekten ist der Quellcode ja verfügbar ;) Hier im Forum gabs das Thema auch shcon öfter, kannst ja mal suchen :D
 
D

despikeexd

Gast
Ja löschen würde da nicht funktionieren. Das ersetzen funktioniert allerdings. Aber das kann bestimmt die andere jar dann erledigen.


Soweit ich weiß, ist das garnicht möglich. Aber 100% sicher bin ich mir da nicht.

Java 7 macht genau das möglich da URLClassLoader endlich das Closeable Interface implementiert. Damit kann man über einen URLClassLoader geladenen fremd-Jar's auch wieder vollständig entladen und dann auch löschen. Funktioniert in Java 6 übrigens auch wenn man das was der 7er implementiert mit Reflections löst. Einfach mal nach Googlen
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G JavaDocu in eigener Bibliothek Allgemeine Java-Themen 2
HarleyDavidson Eigener PropertyChangeListener funktioniert einfach nicht Allgemeine Java-Themen 3
T Datei öffnen mit eigener Applikation.exe Allgemeine Java-Themen 4
D Arraylist eigener Klasse an iReport übergeben Allgemeine Java-Themen 7
K Jar mit eigener JRE ausliefern Allgemeine Java-Themen 13
G eigener PropertyChangedListener Allgemeine Java-Themen 2
S OOP ClassCastException bei casting von eigener Klasse aus Iterator Allgemeine Java-Themen 3
V Serialisierung von Instanz eigener Klasse Allgemeine Java-Themen 5
N Vergleich eigener Klassen Allgemeine Java-Themen 5
T Vererbung Eigener Datentyp: Betriebsmittel Allgemeine Java-Themen 2
J Erste Schritte Kommerzielle nutzung eigener Javaapplets auf der Homepage Allgemeine Java-Themen 2
B Probleme mit eigener equals Methode Allgemeine Java-Themen 18
J Mein eigener Messenger und dessen Probleme Allgemeine Java-Themen 48
S Profiler-Funktionen in eigener Applikation nutzen..? Allgemeine Java-Themen 5
R Eigener Comparator Allgemeine Java-Themen 2
T Zeit von einem Server/Webseite auslesen und in eigener GUI anzeigen Allgemeine Java-Themen 6
V Probleme mit eigener Hashmap Allgemeine Java-Themen 10
B Eigener ClassLoader Allgemeine Java-Themen 9
R Eigener Assoziativ-Speicher Allgemeine Java-Themen 7
T CP Problem: Webstart + Logging properties file + eigener Handler Allgemeine Java-Themen 7
P eigener Klassenname Allgemeine Java-Themen 4
D Eigener Key bei AES Verschlüsselung Allgemeine Java-Themen 4
T enums - eigener startwert Allgemeine Java-Themen 5
J Eigener ClassLoader wird nicht immer verwendet Allgemeine Java-Themen 3
P eigener Thread für einen JButton Allgemeine Java-Themen 32
F Checkbox in JTable , eigener Cellrenderer -wie gehts weiter? Allgemeine Java-Themen 2
A JRE auf eigener Seite verlinken oder zum Download anbieten? Allgemeine Java-Themen 13
E Wie: Eigener Listener, eigenes Event (möglichst einfach) Allgemeine Java-Themen 29
G eigener logger mittels classe (dynamische logfilename) log4j Allgemeine Java-Themen 15
D Eigener Maven2 Plugin Server? Allgemeine Java-Themen 3
I RSA - Eigener Quelltext Allgemeine Java-Themen 4
M eigener LautstärkeRegler schädlich für soundkarte? Allgemeine Java-Themen 4
K JTree plus eigener FileLoader Allgemeine Java-Themen 2
L Problem mit eigener, abgeleiteter Klasse Allgemeine Java-Themen 2
S Eigener Editor Allgemeine Java-Themen 7
L Eigener Onlinestunden- Zähler / Problemchen Allgemeine Java-Themen 2
P Updatemechanismus Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben