La structure de base d'une solution est la suivante :
-
Une boucle principale est responsable du chargement répété de la dernière version de l'application (si nécessaire) et de son lancement.
-
L'application fait son travail, mais vérifie périodiquement l'URL de téléchargement. Si elle détecte une nouvelle version, elle retourne au lanceur.
Il y a plusieurs façons de mettre cela en œuvre. Par exemple :
-
Le lanceur peut être un wrapper script ou une application binaire qui démarre une nouvelle JVM pour exécuter l'application à partir d'un fichier JAR qui est remplacé.
-
Le lanceur pourrait être une application Java qui crée un classloader pour le nouveau JAR, charge une classe d'entrée et appelle une méthode sur celle-ci. Si vous procédez de cette manière, vous devez surveiller les fuites de stockage du classloader, mais ce n'est pas difficile. (Vous devez simplement vous assurer qu'aucun objet contenant des classes chargées à partir du JAR n'est accessible après le redémarrage).
Les avantages de l'approche de l'enveloppe externe sont les suivants :
- vous n'avez besoin que d'un seul JAR,
- vous pouvez remplacer toute l'application Java,
- tous les threads secondaires créés par l'application, etc. disparaîtront sans logique d'arrêt particulière, et
- vous pouvez également vous occuper de la récupération après des pannes d'application, etc.
La deuxième approche nécessite deux JAR, mais présente les avantages suivants :
- la solution est purement Java et portable,
- le changement sera plus rapide, et
- vous pouvez plus facilement conserver l'état à travers le redémarrage (modulo les problèmes de fuite).
La "meilleure" méthode dépend de vos besoins spécifiques.
Il convient également de noter que :
-
La mise à jour automatique présente des risques pour la sécurité. En général, si le serveur qui fournit les mises à jour est compromis, ou si les mécanismes de fourniture des mises à jour sont susceptibles d'être attaqués, alors la mise à jour automatique peut conduire à une compromission du ou des clients.
-
L'envoi à un client d'une mise à jour qui lui porte préjudice peut entraîner des risques juridiques et des risques pour la réputation de votre entreprise.
Si vous pouvez trouver un moyen d'éviter de réinventer la roue, ce serait bien. Voir les autres réponses pour des suggestions.
4 votes
Avez-vous examiné Java Web Start ? Il ne se met pas à jour au moment de l'exécution, je crois, (redémarrage nécessaire), pour cela vous devez probablement vous tourner vers OSGi.
0 votes
@Thilo : Je pense qu'il serait facile de télécharger un fichier à partir d'une url donnée, puis de le démarrer avec une commande linux à partir du fichier jar en cours d'exécution.
2 votes
La conception de l'API Java WebStart rend impossible la mise à jour en cours d'exécution. Malheureusement, il n'est pas possible de mettre à jour l'API Java WebStart en cours de fonctionnement.
1 votes
dreamincode.net/forums/topic/190944-créer-un-updater-en-java
0 votes
@meain boss you rock, you made my day :)
0 votes
@iltafkhalid heureux d'aider ;)