Redémarrer complètement un programme en Java ?
TheKill_TnT
Messages postés
154
Date d'inscription
Statut
Membre
Dernière intervention
-
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
KX Messages postés 16761 Date d'inscription Statut Modérateur Dernière intervention -
Bonjour,
Ma question est la suivante: Comment redémarrer complètement un programme Java ?
J'ai déjà posé une question similaire, mais elle n'allais pas jusque là. Ici, j'aimerais redémarrer un programme afin de le mettre à jour (il a été retéléchargé et l'idée et d'appliquer la mise à jour).
Théoriquement ça serait possible à l'aide d'un deuxième programme java (qui servirait alors d'instaciateur) mais je ne sais pas comment faire.
L'idée serait d'avoir quelque chose comme ceci:
Et donc que notre updater.jar soit fait de:
Et de cette manière finaliser la mise à jour.
Merci d'avance !
Ma question est la suivante: Comment redémarrer complètement un programme Java ?
J'ai déjà posé une question similaire, mais elle n'allais pas jusque là. Ici, j'aimerais redémarrer un programme afin de le mettre à jour (il a été retéléchargé et l'idée et d'appliquer la mise à jour).
Théoriquement ça serait possible à l'aide d'un deuxième programme java (qui servirait alors d'instaciateur) mais je ne sais pas comment faire.
L'idée serait d'avoir quelque chose comme ceci:
public void redemarrer(){ QuelqueChose.AutreChose(new File("updater.jar")) //Instancier un fichier JAR }
Et donc que notre updater.jar soit fait de:
public static void main(String[] args){ //imaginons que tout celà est derrière try catch hein File f = new File("programme_update.jar") QuelqueChose.AutreChose(f, "programme.jar") //Renommer le fichier téléchargé en "programme.jar" QuelqueChose.AutreChose(f) //Encore instancier un fichier JAR }
Et de cette manière finaliser la mise à jour.
Merci d'avance !
Configuration: Windows / Chrome 71.0.3578.98, Java Dev Kit 8
A voir également:
- Redémarrer complètement un programme en Java ?
- Waptrick java football - Télécharger - Jeux vidéo
- Jeux java itel - Télécharger - Jeux vidéo
- Raccourci redémarrer pc - Guide
- Eclipse java - Télécharger - Langages
- Java apk - Télécharger - Langages
1 réponse
Bonjour,
Pour aller plus loin tu pourrais utiliser des ClassLoader différents, un pour chaque version du programme.
La seule contrainte c'est que le loader doit être dans le ClassLoader système, il ne pourra donc pas être mis à jour.
Si je recompile Main avec "Hello 2" par exemple, le Loader me chargera bien la nouvelle classe, sans avoir à arrêter le programme Loader.
Pour aller plus loin tu pourrais utiliser des ClassLoader différents, un pour chaque version du programme.
La seule contrainte c'est que le loader doit être dans le ClassLoader système, il ne pourra donc pas être mis à jour.
import java.net.URL; import java.net.URLClassLoader; import java.util.Arrays; public class Loader { // n'importe où sauf dans E:/Workspace/CCM/bin/ public static void main(String[] args) throws Exception { for (int i = 0; i < 10; i++) { URL[] classUrls = { new URL("file:///E:/Workspace/CCM/bin/") }; System.out.println(Arrays.toString(classUrls)); try (URLClassLoader ucl = new URLClassLoader(classUrls)) { System.out.println(ucl); ucl.loadClass("Main").getMethod("main", String[].class).invoke(null, new Object[] { args }); Thread.sleep(2_000); } } } }
public class Main { // compilé dans E:/Workspace/CCM/bin/ public static void main(String[] args) { System.out.println("Hello 1"); } }
Si je recompile Main avec "Hello 2" par exemple, le Loader me chargera bien la nouvelle classe, sans avoir à arrêter le programme Loader.
Moi j'aurais éventuellement pensé à une méthode qui exécute une ligne de commande ou directement un fichier, mais je vois pas où ça peut se trouver.
L'idée serait : tu as un Jar que l'utilisateur démarre et dont le fonctionnement est le suivant.
Après il faudrait bien savoir quelles limites tu t'imposes pour "redémarrer" un programme.
S tu pars sur des lignes de commandes, tu n'auras pas un programme en exécution, mais plusieurs.
Avec les ClassLoader, tu auras toujours le même processus Java en exécution, même après "redémarrage".
Remarque : c'est le même principe de fonctionnement que les serveurs d'applications (Tomcat &co) qui vont démarrer/arrêter des war, mais le serveur en lui même reste ne s'arrête pas, ce qui lui permet d'arrêter certaines applications tout en laissant les autres démarrées.
J'ai un projet C:/Workspace/ccm-Thread qui créé un thread-1.0-SNAPSHOT.jar avec le contenu suivant :
J'ai un projet C:/Workspace/ccm-Loader qui créé un loader-1.0-SNAPSHOT.jar avec le contenu suivant :
Fonctionnement : on lance la commande
(Éventuellement on pourra configurer ccm.Loader comme Main-Class du Manifest)
Le Loader va prendre le fichier thread-1.0-SNAPSHOT.jar (on pourrait ici mettre en place un téléchargement du fichier sur le web par exemple) pour le copier dans thread-local.jar, le charger et exécuter ccm.MainThread
Dans la console du Loader on peut appuyer sur Entrée, ce qui va déclencher la mise à jour et le redémarrage du thread, sauf en cas d'erreur de mise à jour, dans ce cas on laisse la version précédente s'exécuter.